【问题标题】:Each Node in the Queue Contains the Same Data队列中的每个节点都包含相同的数据
【发布时间】:2021-07-13 22:55:09
【问题描述】:

这些是队列和请求节点的结构定义

typedef struct request{
  struct request * next;
  int valid;
  int request_id;
  int check_acc_id;
  struct transfer * transfers;
  int num_transfers;
  struct timeval starttime, endtime;
}request;

typedef struct queue{
  struct request * head;
  struct request * tail;
  int num_jobs;
}queue;

这是初始化队列的函数

queue * createQueue(){
  queue *que = (queue*)malloc(sizeof(queue)); 
  que->num_jobs = 0;
  que->head = NULL;
  que->tail = NULL;

  return queue;
}

在我的主程序中,我运行一个连续循环来获取用户输入。用户可以提出 3 种不同的请求。

int reqid = 1;
queue *que = createQueue();

char * command = malloc(200);

while(1){
    printf("> ");
    fgets(command, 200, stdin);
    fixEnd(command);
    
    reqid += runCommand(command, reqid, que);
            
    /*if(req.valid == 1){
        reqid = addToQueue(&req, que);      
    }*/
    
    printReqInfo(que);
}

return 0;

用户输入被发送到 runCommand 函数以确定发出了什么请求并基于该请求创建一个请求节点。

int runCommand(char * command, int request_id, queue * que){

  struct timeval time;
  gettimeofday(&time, NULL);
  int reqID = request_id;

  request r;
  r.request_id = reqID;
  r.valid = 1;
  r.check_acc_id = 0;
  r.next = (request*)malloc(sizeof(request));
  r.transfers = (transfer*)malloc(sizeof(transfer) * 10);
  r.num_transfers = 0;
  r.starttime = time;

  char * req = malloc(200);
  char * token = malloc(20);
  token = strtok(command, " ");
  strcpy(req, token);

  if(strcmp(req, "CHECK") == 0){
    token = strtok(NULL, " ");
    int id = atoi(token);
    
    r.check_acc_id = id;
    
    return addToQueue(&r, queue);   
  }

  else if(strcmp(req, "TRANS") == 0){
    token = strtok(NULL, " ");
    int count = 0;
    
    while(token != NULL){
        transfer t;
        t.acc_id = atoi(token);
        token = strtok(NULL, " ");
        t.amount = atoi(token);
        
        r.transfers[count] = t;
        
        ++count;
        token = strtok(NULL, " ");
    }
    
    r.num_transfers = count;
    
    return addToQueue(&r, queue);   
  }

  else if(strcmp(req, "END") == 0){
    printf("Exiting Process\n");
    free_accounts();
    exit(0);
  }
        
  else{
    printf("Request Invalid: %s\n", command);
    r.valid = 0;
    return 0;
  }
    
}

如果发出“CHECK”或“TRANS”请求,则请求节点将被添加到队列中,如果用户发出“END”请求,程序将退出。

这是将请求节点加入队列的函数

int addToQueue(request *req, queue * que){
  //pthread_mutex_lock(&queue_mutex);

  if(que == NULL || req == NULL){
    printf("Request Not Added\n");
    return 0;
  }

  if(que->num_jobs > 0){
    if(que->tail == NULL){
        que->tail = req;
        que->head->next = req;
    }
    else{
        que->tail->next = req;
        que->tail = req;
    }
  }

  else{
    que->head = req;
    que->tail = NULL;
    pthread_cond_broadcast(&empty);
  }

  que->num_jobs += 1;
  int x = req->request_id;

  //pthread_mutex_unlock(&queue_mutex);

  printf("< ID %d\n", x);
  return 1;

}

我遇到的问题是每个请求节点都是相同的。第一个输入请求被正确处理,并且该请求被添加为队列的头部。当我输入第二个请求时,添加了请求节点,但头部也更改为与新输入相同的数据。当发出第三个请求时,所有三个请求节点的数据值都等于最新请求的值。

例如,如果我输入以下内容:

检查 1 检查 2 反式 5 100

当我从队列中的每个请求节点打印数据时,它应该如下所示:

ID:1 检查:1 编号:2 检查 2 编号:3 加速:5 上午:100

其中 ID 是请求 ID,从 1 开始并随着每个请求递增,CHECK 是要检查余额的帐户。对于交易请求,ACC 是进行交易的账户,AMT 是要存入/取款的美元金额。请注意,有关帐户的具体信息与问题并不真正相关,我只是对其进行了解释,以免混淆它们的来源。

但是,当我使用该输入运行程序时,输出如下:

ID:3 加速:5 上午:100 编号:3 加速:5 上午:100 编号:3 加速:5 上午:100

如果我再提出另一个请求,比如 CHECK 8,输出将变为

ID:4 检查:8 编号:4 检查:8 编号:4 检查:8 ID:4 检查:8

【问题讨论】:

  • 请不要将代码作为图片提供。将代码包含为文本并设置格式(使用工具栏)。
  • 抱歉,第一次在这里发帖

标签: c linked-list queue nodes


【解决方案1】:

我没有检查您的所有代码(有几个未解决的依赖项,以及 quequeue 的拼写错误),但您描述的问题是将 r 定义为本地的结果(堆栈)分配的结构。每次调用runCommand&amp;r 将是相同的内存地址,并且每次runCommand 返回时都会自动释放该内存。

然而,您希望每次调用 runCommand 创建一个单独的请求,并且可以在 runCommand 之外使用和引用。

所以改为使用malloc 为请求分配内存。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多