当前位置: 首页 > 知识库问答 >
问题:

无法将元素从我的队列中出列“无效使用空格表达式”

汝宏伯
2023-03-14

我得到了一个队列文件从一些旧的回购没有任何留档,我试图入队和从它的队列数据

.h文件如下所示

#include"limits.h"
#include"stdio.h"
#include"pthread.h"
#include"unistd.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
pthread_mutex_t lock;


typedef struct{
    int* message;
    void*in_array;
}data_pack;

 data_pack* createpack()
{

     data_pack* pack = malloc(sizeof( data_pack));
     return pack;
}

// Queue Structure
struct Queue {
    int front, rear, size; // front, rare and the size of the Queue
    unsigned long long capacity; // stores the capacity of the Queue
    data_pack** array; //2D array to store the array of arrays
    int* array_sizes; //1D array to store the number of elements of each array
    data_pack** remArray; //2D array to store the remaining array of arrays(used for flush)
};


// Creates a Queue
struct Queue* createQueue()
{
    struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue));
    queue->front = queue->size = 0;
    queue->capacity = queue->size + 1;
    queue->rear = queue->capacity - 1;
    queue->array = (data_pack **)malloc(queue->capacity * sizeof(data_pack));// changed to my struct
    queue->array_sizes = (int *)malloc(queue->capacity * sizeof(int));



    if (pthread_mutex_init(&lock, NULL) != 0) {
            printf("\n mutex init has failed\n");
            return 0;
        }
    return queue;
}

// Queue is empty when size is 0
int isEmpty(struct Queue* queue)
{

    return (queue->size == 0);

}

// Function to add an array to the queue.
// It changes rear and size
void enqueue(struct Queue* queue, data_pack arr[], int n)
{
    int i=0;
    pthread_mutex_lock(&lock);// lock variables
    queue->rear = (queue->rear + 1) % queue->capacity;
    queue->array[queue->rear] = (data_pack *)malloc(n*sizeof(data_pack));
    if(queue->array[queue->rear]==NULL) printf("Error in memory\n");
    for(i=0;i<n;i++){
        queue->array[queue->rear][i] = arr[i];// u need to input struct here

    }
    queue->array_sizes[queue->rear] = n;
    queue->size = queue->size + 1;
    queue->capacity = queue->capacity + 1;
    queue->array = (data_pack**)realloc(queue->array,queue->capacity*sizeof(data_pack));
    if(queue->array == NULL) printf("Not 2d array");
    queue->array_sizes = (int*)realloc(queue->array_sizes,queue->capacity*sizeof(int));
    if(queue->array_sizes == NULL) printf("not 1dn array sizes");
    pthread_mutex_unlock(&lock);// unlock variables

}

// Function to remove an array from queue.
// It changes front and size
data_pack* dequeue(struct Queue* queue)
{
    int i=0;
    pthread_mutex_lock(&lock);// lock variables
    int len = queue->array_sizes[queue->front];
    data_pack* deqArray = (data_pack*)malloc(len*sizeof(data_pack));
    if (isEmpty(queue))
        return 0;

    for( i=0;i<queue->array_sizes[queue->front];i++){

        deqArray[i] = queue->array[queue->front][i];
    }


    queue->front = (queue->front + 1) % queue->capacity;
    queue->size = queue->size - 1;
    pthread_mutex_unlock(&lock);// unlock variables
    free(queue->array[queue->front-1]);

    return deqArray;
}

// Function to flush all the arrays and its elements from the queue.
data_pack** flush(struct Queue* queue)
{
    int i=0;
    int j=0;
    queue->remArray = (data_pack **)malloc(queue->size * sizeof(data_pack));
    int k=0;
    for( i=queue->front;i<=queue->rear;i++){
        int len = queue->array_sizes[i];
        queue->remArray[k] = (data_pack *)malloc(len*sizeof(data_pack));
        for( j=0;j<len;j++){

            //queue->remArray[k][j] = queue->array[i][j];
        }
        free(queue->array[i]);

        k++;
    }
    free(queue->array);
    free(queue->array_sizes);
    queue->front = queue->size = 0;
    queue->capacity = queue->size + 1;
    queue->rear = queue->capacity - 1;
    queue->array_sizes = (int *)malloc(1 * sizeof(int));
    queue->array = (data_pack **)malloc(1 * sizeof(data_pack));
    return queue->remArray;
}

// Function to know number of arrays in queue
int no_elements(struct Queue* queue)
{

    return queue->size;


}

在我的代码中,我试图让元素入队,获取队列大小,并让元素出队

struct Queue * send_data_queue;
data_pack data_to_send[0];
data_pack * rec_data;
typedef struct SenderData {
  unsigned short CommandCode;
  int DataSize;
  void * Data;
}
SenderData;

int cont[200];

SenderData data, dat;

int main(int argc, char * argv[]) {

  send_data_queue = createQueue();

  while (1) {
    data.DataSize = sizeof(cont);
    data.Data = & cont;
    data.CommandCode = 20;

    data_to_send[0].message = 20;
    data_to_send[0].in_array = & data;

    enqueue(send_data_queue, data_to_send, 1);

    int nos = no_elements(send_data_queue);
    printf("No of elements in q = %d\n", nos); // this is printing correctly

    rec_data = dequeue(send_data_queue);

    dat = ((SenderData * )(rec_data -> in_array)[0]); // i get error here Invalid use of void Expression

  }

  return 0;
}

解释我的代码

-我正在尝试将一个包含 200 个元素的 int 数组排队

我正在用所需的信息(如大小、命令和实际数据)更新我的结构数据

这个队列利用一个结构来传递数据,所以我把我的结构数据更新到这个结构

然后我调用入队函数

然后我检查队列大小,它的更新是正确的

我正在尝试将数据移出队列

在这里,我将数据转换为结构,即发送方数据

但在这一点上,我收到错误,因为无效使用无效表达式

为什么会产生这样的错误?

共有1个答案

端木昱
2023-03-14

在这一行上:

dat = ((SenderData * )(rec_data -> in_array)[0]);

数组下标运算符的优先级高于类型转换运算符。所以首先要评估的是rec_data——

您要么需要使用括号先应用强制转换:

dat = ((SenderData *)(rec_data->in_array))[0];

或者使用取消引用运算符代替数组索引:

dat = *(SenderData *)rec_data->in_array;

 类似资料:
  • 问题内容: 这个清单对象在咬我屁股。 每当我尝试向其中添加元素时,它都会产生以下结果: 产生错误的行无关紧要,但无论如何这里都是这样: 我不应该静态访问它吗? 变量的实际声明: 有任何想法吗?在Google上找不到任何值得的东西。 问题答案: Arrays.asList()将给您返回不可修改的列表,这就是为什么添加失败的原因。尝试使用以下方法创建列表:

  • 然后在main方法中,我尝试创建一个列表并打印出其中的元素。 没有语法错误,但当我尝试运行上面的代码时,终端不会返回任何内容。

  • 问题内容: 原始列表将转换为正常。为什么原始列表的列表不能转换为的列表? 背景故事 (以减轻xy问题): 我正在使用return的API 。我碰巧知道它一直都是。我计划循环并构建自己的循环,但是我在尝试编写时试图修复(但不禁止)原始类型编译器警告。 我试过了: 但是这些会导致类型不匹配错误。 有趣的是,这没有给出警告或错误: 问题答案: // #1 (does compile) List raw

  • 我正在尝试从下拉选择一个元素。我没有使用Select类的选项,我正在尝试使用Actions类。它只定位下拉列表,但不选择下拉列表中的元素,因为它无法识别XPath。xpath看起来是正确的,但仍未被接受。下面是HTML开发工具和Java代码。 HTML代码:

  • 在这里您可以看到我带给UIAutomatorViewer的元素。 这是我发现的主要因素。 [![在此处输入图像说明][1]][1]

  • 我的表达式输入文件(出于测试目的,最后两个应该抛出两个异常): 我的实际输出: 显然,我希望前四个表达式像第一个表达式一样跟随,最后两个表达式显示我的异常消息,但我似乎不知道哪里出错了。