синтаксическая ошибка перед токеном '[' - PullRequest
1 голос
/ 13 декабря 2011

Вот код

#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<pthread.h>
typedef struct std_thread
{
 char name[20];
 int hallno;
 int empid;
 char dept[5];
}std[5];

void *print(void *args)
{
 struct std_thread *data=(struct std_thread *)args;
 printf("My thread id is %ld\n",pthread_self());
 printf("Thread %d is executing\n",args);
 printf("Name\tHall No\tEmployee ID\tDepartment\n");
 printf("--------------------------------------------------------");
 printf("%s\t%d\t%d\t%s\n",data->name,data->hallno,data->empid,data->dept);
}

int main()
{
 pthread_t th[5];
 int empid=2020;
 int hall=1;
 char dept[2]="IT";
 char *names[]={"dinesh","vignesh","pradeep","prasath","mohan"};
 int t;
 int i;
 int status;
 for(i=0;i<5;i++)
 {
   std[i].name=names[i]; //Getting error from this line
   std[i].hallno=hall;   //Error at this line
   hall++;
   std[i].empid=empid;  //Error at this line
   empid++;
   std[i].dept=dept;     //Error at this line
   status=pthread_create(&th[i],NULL,print,(void *)&std[i]);
   if(status)
   {
    printf("Error creating threads\n");
    exit(0);
   }

 }
 pthread_exit(NULL);
}

При компиляции этого кода я получаю "синтаксическую ошибку перед '[' токеном" ». В чем причина?

Ответы [ 5 ]

2 голосов
/ 13 декабря 2011

Это объявление не делает то, что вы думаете:

typedef struct std_thread
{
  ...
}std[5];

Это объявляет struct с именем std_thread, а затем создает typedef с именем std, что означает "массив из 5 struct std_thread объектов ".

Возможно, вам нужно одно из этих двух определений, чтобы объявить глобальный объект с именем std как массив из 5 struct std_thread:

typedef struct std_thread
{
  ...
} std_thread;
std_thread std[5];

// OR

struct std_thread
{
  ..
} std[5];

В первом случае мы также создаем typedef с именем std_thread в качестве псевдонима для struct std_thread;во втором случае мы этого не делаем.

Более того, как уже говорили другие, вы не можете копировать массивы символов по присваиванию.Вы должны скопировать их, используя такие функции, как strcpy(3) или strncpy(3).При использовании strcpy вы должны убедиться, что целевой буфер достаточно велик для размещения желаемой строки.Также имейте в виду, что strncpy не обязательно заканчивает нулем целевую строку , поэтому используйте ее с осторожностью.

2 голосов
/ 13 декабря 2011

Я не думаю, что вы хотите typedef наверх.

То, что вы там написали, делает std эквивалентным типом как пять из structs в массиве, но затем вы используете std, как если бы он сам был массивом.

Удалите слово typedef из строки пять, и оно должно быть ближе к работе.

1 голос
/ 13 декабря 2011

Используйте функцию копирования строк вместо назначения массива символов.

1 голос
/ 13 декабря 2011
  1. Вы пытаетесь скопировать строку с помощью присваивания:

    std[i].name=names[i]; 
    

    и

    std[i].dept=dept;
    

    , которое не работает.Вместо этого используйте strcpy или лучше strncpy.

  2. У вас есть опечатка в:

    std[i].empid=empdid;  //Error at this line 
    

    У вас нет переменной с именем empdid.

0 голосов
/ 13 декабря 2011

Этот код:

typedef struct std_thread
{
    char name[20];
    int  hallno;
    int  empid;
    char dept[5];
} std[5];

объявляет тип std как массив из 5 struct std_thread структур.

Этот код:

int main()
{
[...]
    int i;
    int status;
    for (i = 0; i < 5; i++)
    {
        std[i].name = names[i]; 

предполагается, что std является переменной с массивом или типом указателя.

Вам необходимо удалить ключевое слово typedef, чтобы код соответствовал использованию переменной.

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

...