ожидаемое выражение перед '{' с инициализацией мьютексов - PullRequest
3 голосов
/ 06 мая 2019

Я пытаюсь инициализировать массивы мьютексов и условных переменных внутри функции. Массив имеет тип Cell, который я определил, и каждая ячейка содержит мьютекс, условную переменную и символ. Я получаю сообщение об ошибке в 3 строках внутри цикла for intiail_circle:

expected expression before ‘{’ token.

Я попытался инициализировать массив также вне функции, но это не помогло. какие-либо идеи, чем это вызвано?

код:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5    
#define num_of_cells  (2*(2*N - 2))


typedef struct Generator{
    pthread_t tid;
    int id;
}Genarator;

typedef struct Car{
    pthread_t carId;
    int location ,GenID,num_of_steps;
}Car;

typedef struct Cell{
    char val;
    pthread_mutex_t mutex;
    pthread_cond_t cond;
}Cell;

Cell circle[num_of_cells];
Cell generators_location[4];
struct Generator *generators[4];

int main(){
    initial_circle();
}

void initial_circle(){
    int i;
    for(i = 0; i < num_of_cells; i++){
        circle[i].mutex = PTHREAD_MUTEX_INITIALIZER;
        circle[i].cond = PTHREAD_COND_INITIALIZER;
        circle[i].val = ' ';
    }
}

Ответы [ 2 ]

4 голосов
/ 06 мая 2019

Макросы PTHREAD_MUTEX_INITIALIZER и PTHREAD_COND_INITIALIZER являются инициализаторами для struct.Они выглядят так:

#define PTHREAD_COND_INITIALIZER { { 0, 0, 0, 0, 0, (void *) 0, 0, 0 } }
#define PTHREAD_MUTEX_INITIALIZER { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } }

Этот синтаксис действителен только в инициализаторе, а не в назначении, поэтому вы получаете сообщение об ошибке.

Вы можете обойти эту проблему, выполнивсоставной литерал из них:

    circle[i].mutex = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
    circle[i].cond = (pthread_cond_t)PTHREAD_COND_INITIALIZER;

Кроме того, вы вызываете функцию initial_circle до ее объявления.Вы должны переместить определение initial_circle дальше в файл до main:

void initial_circle(){
    ...
}

int main(){
    initial_circle();
}
3 голосов
/ 06 мая 2019

PTHREAD_MUTEX_INITIALIZER это инициализатор! Расширяется до формы { /*stuff*/ }. Вы не можете использовать инициализатор в назначении, инициализатор не имеет типа C. Ваша проблема может быть сведена к следующему:

struct foo { char c; };
#define FOO_INIT { 'a' }

struct foo f =  FOO_INIT; // Okay
f = FOO_INIT; // Error

Если вы компилируете для или новее, вы можете обойти ограничение, используя составной литерал :

    circle[i].mutex = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
    circle[i].cond = (pthread_cond_t)PTHREAD_COND_INITIALIZER;

Если c99 не подходит для вас, используйте именованные объекты:

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
    circle[i].mutex = mutex;
    circle[i].cond = cond;
...