【问题标题】:expected expression before ' {' with mutexs initialize“{”之前的预期表达式,带有互斥体初始化
【发布时间】:2019-09-24 01:41:05
【问题描述】:

我正在尝试在函数中初始化互斥体数组和条件变量。 该数组是我定义的 Cell 类型,每个 Cell 包含互斥锁、条件变量和字符。 我在 intiail_circle 的 for 循环内的 3 行上遇到错误:

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 = ' ';
    }
}

【问题讨论】:

  • Genarator?你是说Generator?
  • 大声笑是的,谢谢..关于初始化的任何想法?
  • N 应该是什么?如果你看一下宏展开的结果,你会得到这行:Cell circle[(2*(2*N - 2))];,在任何地方都没有任何N的定义。
  • 定义为5.忘记添加了

标签: c struct pthreads


【解决方案1】:

宏 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();
}

【讨论】:

    【解决方案2】:

    PTHREAD_MUTEX_INITIALIZER 是一个初始化器!它扩展为{ /*stuff*/ } 形式。您不能在赋值中使用初始化程序,初始化程序在 C 中没有类型。您的问题可以简化为:

    struct foo { char c; };
    #define FOO_INIT { 'a' }
    
    struct foo f =  FOO_INIT; // Okay
    f = FOO_INIT; // Error
    

    如果您正在为 或更高版本进行编译,则可以使用compound literal 来解决此限制:

        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;
    

    【讨论】:

    • 它的工作!谢谢。但还有一个问题..我怎样才能将它用于数组?它会自动初始化吗?结构 foo f = FOO_INIT; // 好的
    • @RoyAncri - 你的意思是如果结构包含一个数组作为一个字段?仍然可以正常工作。但是如果有一个数组而不是结构,它就不能工作。您不能分配给数组名称。
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多