Error : Expected expression before 'DATA /* : typedef struct DATA DATA */
Error : Expected expression before 'DATA /* : typedef struct DATA DATA */
我不知道我的代码有什么问题。我读了一些有同样问题的人的问题,但我没有找到答案。
当我尝试编译时出现此错误:
||In function 'main':|
|35|error: expected expression before 'DATA'|
||In function 'lecture_data':|
|59|error: expected expression before 'DATA'|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
我也想知道我应该做什么,如果还有其他问题,我不应该在这段代码中做什么。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define V 20
/* Structure */
typedef struct DATA{
char* NomP;
char* NomA;
int iNbr;
int iPix;
struct DATA *Next;
}DATA;
/* --------- */
void* MALLOC(size_t nombre);
int lecture_data(FILE *fs,DATA* Data,DATA* ROOT);
void print_data(DATA* data,int len);
int main(void)
{
char FileName[V];
puts("Data file ? : ");
gets(FileName);
FILE* fs = fopen(FileName,"r");
if( fs == NULL )
{
perror("Error ");
exit(EXIT_FAILURE);
}
DATA *HEAD = MALLOC(sizeof DATA);
DATA *D_Store;
int len = lecture_data(fs,D_Store,HEAD);
print_data(D_Store,len);
return 0;
}
int lecture_data(FILE *fs,DATA *Data,DATA *ROOT)
{
char cNom[V],cArticle[V];
int iNombre,iPrix;
int eofs=0;int i=0;
while(!eofs)
{
fscanf(fs,"%s %s %d %d",cNom,cArticle,&iNombre,&iPrix);
Data->iNbr=iNombre;
Data->iPix=iPrix;
Data->NomA = MALLOC(strlen(cArticle)+1);
Data->NomP = MALLOC(strlen(cNom)+1);
strcpy(Data->NomA,cArticle);
strcpy(Data->NomP,cNom);
if( i==0 )
{
Data -> Next = MALLOC(sizeof DATA);
ROOT = Data ;
}
DATA *Ptr = ROOT ;
while( Ptr -> Next != NULL )
{
Ptr = ROOT -> Next;
}
Data -> Next = NULL ;
Ptr -> Next = Data ;
fprintf(stdout,"Data : N.%d: %s %s %d$\n",i,cNom,cArticle,iNombre*iPrix);
i++;
eofs = feof(fs) ;
if(ferror(fs))
{
perror("Error ");
exit(EXIT_FAILURE);
}
}
fclose(fs);
return i;
}
void* MALLOC(size_t nombre)
{
void *MEMEORY = malloc(nombre);
if(NULL == MEMEORY )
{
perror("Error ");
exit(EXIT_FAILURE);
}
return MEMEORY;
}
改变
DATA *HEAD = MALLOC(sizeof DATA);
到
DATA *HEAD = MALLOC(sizeof (DATA));
sizeof
运算符的类型名称操作数必须用括号括起来。
使用
DATA *HEAD = MALLOC( sizeof( DATA ) );
而不是
DATA *HEAD = MALLOC(sizeof DATA);
sizeof运算符定义如下
sizeof unary-expression
sizeof ( type-name )
如您所见,类型名称应括在括号中。
来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)
2 The sizeof operator yields the size (in bytes) of its operand, which
may be an expression or the parenthesized name of a type.
请注意,如果 e
是一个表达式,那么 ( e )
也是一个表达式。因此,对于表达式,您可以写成
sizeof e
或
sizeof( e )
而变量的标识符也构成了一个表达式。
我不知道我的代码有什么问题。我读了一些有同样问题的人的问题,但我没有找到答案。 当我尝试编译时出现此错误:
||In function 'main':|
|35|error: expected expression before 'DATA'|
||In function 'lecture_data':|
|59|error: expected expression before 'DATA'|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
我也想知道我应该做什么,如果还有其他问题,我不应该在这段代码中做什么。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define V 20
/* Structure */
typedef struct DATA{
char* NomP;
char* NomA;
int iNbr;
int iPix;
struct DATA *Next;
}DATA;
/* --------- */
void* MALLOC(size_t nombre);
int lecture_data(FILE *fs,DATA* Data,DATA* ROOT);
void print_data(DATA* data,int len);
int main(void)
{
char FileName[V];
puts("Data file ? : ");
gets(FileName);
FILE* fs = fopen(FileName,"r");
if( fs == NULL )
{
perror("Error ");
exit(EXIT_FAILURE);
}
DATA *HEAD = MALLOC(sizeof DATA);
DATA *D_Store;
int len = lecture_data(fs,D_Store,HEAD);
print_data(D_Store,len);
return 0;
}
int lecture_data(FILE *fs,DATA *Data,DATA *ROOT)
{
char cNom[V],cArticle[V];
int iNombre,iPrix;
int eofs=0;int i=0;
while(!eofs)
{
fscanf(fs,"%s %s %d %d",cNom,cArticle,&iNombre,&iPrix);
Data->iNbr=iNombre;
Data->iPix=iPrix;
Data->NomA = MALLOC(strlen(cArticle)+1);
Data->NomP = MALLOC(strlen(cNom)+1);
strcpy(Data->NomA,cArticle);
strcpy(Data->NomP,cNom);
if( i==0 )
{
Data -> Next = MALLOC(sizeof DATA);
ROOT = Data ;
}
DATA *Ptr = ROOT ;
while( Ptr -> Next != NULL )
{
Ptr = ROOT -> Next;
}
Data -> Next = NULL ;
Ptr -> Next = Data ;
fprintf(stdout,"Data : N.%d: %s %s %d$\n",i,cNom,cArticle,iNombre*iPrix);
i++;
eofs = feof(fs) ;
if(ferror(fs))
{
perror("Error ");
exit(EXIT_FAILURE);
}
}
fclose(fs);
return i;
}
void* MALLOC(size_t nombre)
{
void *MEMEORY = malloc(nombre);
if(NULL == MEMEORY )
{
perror("Error ");
exit(EXIT_FAILURE);
}
return MEMEORY;
}
改变
DATA *HEAD = MALLOC(sizeof DATA);
到
DATA *HEAD = MALLOC(sizeof (DATA));
sizeof
运算符的类型名称操作数必须用括号括起来。
使用
DATA *HEAD = MALLOC( sizeof( DATA ) );
而不是
DATA *HEAD = MALLOC(sizeof DATA);
sizeof运算符定义如下
sizeof unary-expression
sizeof ( type-name )
如您所见,类型名称应括在括号中。
来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)
2 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type.
请注意,如果 e
是一个表达式,那么 ( e )
也是一个表达式。因此,对于表达式,您可以写成
sizeof e
或
sizeof( e )
而变量的标识符也构成了一个表达式。