код производителя производителя необработанных ошибок linux debug

Пытаясь скомпилировать мой код в linux, сделав gcc -o consumer.c -lpthread -lm, и я получаю ошибки компиляции о том, что я не объявлял о том, что я, насколько мне известно, заявил. Большинство необъявленных, похоже, связано с буферами, из которых это моя первая программа, использующая буферы. Вот ошибки (отредактированные для отражения изменений)

typedef char buffer_item buffer[BUFFER_SIZE]; // asm or __attribute__ before "buffer" both of these(expected ')' before 'item' int insert_item(buffer_item item) int insert_item(buffer_item item) int remove_item(buffer_item *item) //expected ')' before * token 

и вот мой полный код после изменений

 #include  #include  #include  #include  #define RAND_DIVISOR 100000000 #define TRUE 1 #define BUFFER_SIZE 1000 pthread_mutex_t mutex; //mutex lock sem_t full, empty; //semaphores typedef char buffer_item buffer[BUFFER_SIZE]; int counter; //buffer counter pthread_t tid1, tid2; //Thread ID pthread_attr_t attr; // thread attributes void *producer(void *param); // producer thread void *consumer(void *param); //consumer thread void initializeData() { pthread_mutex_init(&mutex, NULL); //Create mutex lock sem_init(&full, 0, 0); // Create the full semaphore and initialize to 0 sem_init(&empty, 0, BUFFER_SIZE); // Create the empty semaphore and initialize to BUFFER_SIZE pthread_attr_init(&attr); //default attributes counter = 0; } // Producer Thread int insert_item(buffer_item item) void *producer(void *param) { while(TRUE) { // random sleep time int rNum = rand() / RAND_DIVISOR; sleep(rNum); int item = rand()%100; // item is a random number between 1-100 sem_wait(&empty); //get empty lock pthread_mutex_lock(&mutex); //get mutex lock if(insert_item(item)) { fprintf(stderr, " Producer report error condition\n"); } else { printf("producer produced %d\n", item); } pthread_mutex_unlock(&mutex); //release mutex lock sem_post(&full); //signal full } } // Consumer Thread 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 } } int insert_item(buffer_item item) { // add item as long as buffer isn't full if(counter  0) { *item = buffer[(counter-1)]; counter--; return 0; } else { //buffer empty error } return -1; } int main(int argc, char *argv[]) { int i; //loop counter if(argc != 4) { fprintf(stderr, "USAGE:./main.out   \n"); } int mainSleepTime = atoi(argv[1]); // sleep time in seconds int numProd = atoi(argv[2]); // producer threads int numCons = atoi(argv[3]); // consumer threads initializeData(); //initialize app for(i = 0; i < numProd; i++) { pthread_create(&tid1,&attr,producer,NULL); } for(i = 0; i < numCons; i++) { pthread_create(&tid2,&attr,consumer,NULL); } // sleep in milliseconds //sleep(mainSleepTime); pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("Program Exiting\n"); exit(0); } 

Изменить: последний код и скриншот ошибок http://tinypic.com/r/xptzww/9

 #include  #include  #include  #include  #define RAND_DIVISOR 100000000 #define TRUE 1 #define BUFFER_SIZE 1000 pthread_mutex_t mutex; //mutex lock sem_t full, empty; //semaphores typedef char buffer_item; int counter; //buffer counter pthread_t tid1, tid2; //Thread ID pthread_attr_t attr; // thread attributes void *producer(void *param); // producer thread void *consumer(void *param); //consumer thread void initializeData() { pthread_mutex_init(&mutex, NULL); //Create mutex lock sem_init(&full, 0, 0); // Create the full semaphore and initialize to 0 sem_init(&empty, 0, BUFFER_SIZE); // Create the empty semaphore and initialize to BUFFER_SIZE pthread_attr_init(&attr); //default attributes counter = 0; } // Producer Thread int insert_item(buffer_item item) void *producer(void *param) { while(TRUE) { // random sleep time int rNum = rand() / RAND_DIVISOR; sleep(rNum); int item = rand()%100; // item is a random number between 1-100 sem_wait(&empty); //get empty lock pthread_mutex_lock(&mutex); //get mutex lock if(insert_item(item)) { fprintf(stderr, " Producer report error condition\n"); } else { printf("producer produced %d\n", item); } pthread_mutex_unlock(&mutex); //release mutex lock sem_post(&full); //signal full } } // Consumer Thread 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 } } int insert_item(buffer_item item){// add item as long as buffer isn't full if(counter  0) { *item = buffer[(counter-1)]; counter--; return 0; } else { //buffer empty error } return -1; } int main(int argc, char *argv[]) { int i; //loop counter if(argc != 4) { fprintf(stderr, "USAGE:./main.out   \n"); } int mainSleepTime = atoi(argv[1]); // sleep time in seconds int numProd = atoi(argv[2]); // producer threads int numCons = atoi(argv[3]); // consumer threads initializeData(); //initialize app for(i = 0; i < numProd; i++) { pthread_create(&tid1,&attr,producer,NULL); } for(i = 0; i < numCons; i++) { pthread_create(&tid2,&attr,consumer,NULL); } // sleep in milliseconds //sleep(mainSleepTime); pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("Program Exiting\n"); exit(0); } 

    Вы объявили, но не определен BUFFER_SIZE. Вместо

      char BUFFER_SIZE; 

    пытаться

      char BUFFER_SIZE = some_value; 

    где some_value должно быть чем-то между 1-255

    Линия:

      char buffer_item buffer[BUFFER_SIZE]; 

    должно быть:

      char buffer_item[BUFFER_SIZE]; 

    Объявление переменной должно выглядеть так:

      ; 

    Нет стандартного типа buffer_item . Если вы хотите использовать собственное имя типа, его можно определить:

     typedef char buffer_item; 

    Я предполагаю, что вы хотели использовать char для этого типа, поскольку item должен содержать числа от 0 до 99 и для этого достаточно типа char . После этой строки имя buffer_item является псевдонимом для char . Таким образом, переменные могут быть объявлены buffer_item buffer[BUFFER_SIZE]; или buffer_item item; , В этом случае строки, такие как char buffer_item; являются избыточными. Также вам не нужно писать char перед buffer_item , так как buffer_item уже является другим именем для char , поэтому char buffer_item; это то же самое, что и char char; в этом нет смысла.

    Вероятно, что BUFFER_SIZE символ BUFFER_SIZE должен определяться при определении #define RAND_DIVISOR 100000000 . Обычно заглавные буквы в именах в C используются для макроопределений. Таким образом, вы можете установить этот размер в верхней части файла, например:

     #define BUFFER_SIZE 1000 

    В этом случае строка char BUFFER_SIZE; больше не требуется.

    Вы используете функцию insert_item перед ее объявлением. Итак, чтобы скомпилировать то, что вы можете поставить декларацию также сверху до producer() :

     int insert_item(buffer_item item); 

    Этого должно быть достаточно для компиляции кода.


    Обновлено для новых ошибок

    Объявление типа использует специальное ключевое слово typedef для создания псевдонима типа. Здесь, чтобы объявить, что имя buffer_item используется как имя типа, и оно buffer_item char оно должно быть точно:

     typedef char buffer_item; 

    Буферный массив должен быть определен ниже:

     buffer_item buffer[BUFFER_SIZE]; 

    В объявлении прямой функции требуется точка с запятой в конце:

     int insert_item(buffer_item item); 

    Я не уверен, что он будет работать так, как ожидалось, но теперь он должен быть скомпилирован.