【问题标题】:buffer is being read as undeclared in program even though it is缓冲区在程序中被读取为未声明,即使它是
【发布时间】:2015-11-10 01:48:08
【问题描述】:

试图从我的另一个问题中解决一些错误。我的编译器正在读取 buff[counter] 作为缓冲区,因此未声明它。缓冲区是作为起始代码的一部分提供给我的,所以我不确定 buffer[counter] 是什么意思。尝试用谷歌搜索它并没有帮助,因为我不知道如何找出 buffer[counter] 的含义,它像 buffer_counter 吗?他们是说 buffer_counter 是缓冲区的计数器吗?任何帮助将不胜感激,特别是如果有人可以解释 [counter] 部分,因为那样我可以自己修复它。

我的代码开头有这个

#define BUFFER_SIZE 1000

int insert_item(buffer_item item){// add item as long as buffer isn't full
   if(counter < BUFFER_SIZE) {
      buffer[counter] = item;
      counter++;
      return 0;
   }
   else {
      return -1; //buffer full error
   }
}

// Remove an item from the buffer
int remove_item(buffer_item *item)// remove item and decrement counter when buffer not empty
{
   if(counter > 0) {
      *item = buffer[(counter-1)];
      counter--;
      return 0;
   }
   else { //buffer empty error
   }
      return -1;
   }

还有这个 if(remove_item(&item)) {

触发一个相关的错误,称为“从不兼容的指针类型传递 remove_item 的参数 1”,如此处所示

void *consumer(void *param) {

   while(TRUE) {
      int rNum = rand() / RAND_DIVISOR; // sleep for a random period of time
      sleep(rNum);
      int item = rand()%100; // item is a random number between 1-100
      sem_wait(&full);// aquire the full lock */
      pthread_mutex_lock(&mutex);// aquire the mutex lock
      if(remove_item(&item)) {
         fprintf(stderr, "Consumer report error condition\n");
      }
      else {
         printf("consumer consumed %d\n", item);
      }
      pthread_mutex_unlock(&mutex);// release mutex lock
      sem_post(&empty); //signal empty
   }
}

【问题讨论】:

  • buffer 是一个数组,buffer[counter] 访问索引为counter 的数组元素。由于这些变量都没有在您的函数中声明,因此它们必须是全局变量。
  • 所以我需要做 buffer[counter] = 0;在我的程序开始时(我在哪里定义全局变量)?
  • 你不能用谷歌搜索buffer_item,因为它不是标准的 C 类型。它应该在程序中的某处声明为typedef
  • 你不需要这样做。只需初始化counter = 0;。全局变量会自动发生这种情况。
  • 哦,我当时误解了,但即使我这样做了,它仍然认为 buffer[counter] 表示一个名为 buffer 的变量

标签: c linux debugging consumer producer


【解决方案1】:

你需要声明全局的buffercounter变量:

typedef char buffer_item;

buffer_item buffer[BUFFER_SIZE];
unsigned int counter;

【讨论】:

  • 缓冲区类型是否类似于 int 缓冲区? int 缓冲区[BUFFER_SIZE];
  • 我已经更新了答案。似乎所有这些东西都应该已经在您收到的代码中声明了。您是否忘记了加载声明它们的头文件的#include 行?
  • 就是这个问题。我想你的意思是链接到stackoverflow.com/questions/33599060/…
  • 如果您已经解决了其他问题,您应该不会收到关于 buffer 未声明的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2018-11-19
  • 2023-03-15
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多