2012-09-08 125 views
0

我试图编译我的程序在C,而这些是我得到的错误:(请注意,我在这个语言初学者) 参数未声明用C

Excer3.c:在功能` addstudent':

Excer3.c:50: error: `student' undeclared (first use in this function) 
Excer3.c:50: error: (Each undeclared identifier is reported only once 
Excer3.c:50: error: for each function it appears in.) 
Excer3.c:50: error: parse error before "newS" 
Excer3.c:50: error: `newS' undeclared (first use in this function) 
Excer3.c:50: error: parse error before ')' token 
Excer3.c:52: error: `studentName' undeclared (first use in this function) 
Excer3.c: At top level: 
Excer3.c:59: error: parse error before '*' token 
Excer3.c: In function `readdb': 
Excer3.c:70: error: `students' undeclared (first use in this function) 
Excer3.c:70: warning: passing arg 2 of `addstudent' makes integer from pointer without     a cast 

我的代码看起来像这样。该函数不识别它给出的参数。 :

#include <stdio.h> 

struct student { 
int studentnumber; 
char* Name; 
struct student* next; 
}; 

struct teacher { 
int teachernumber; 
char* Name; 
struct teacher* next; 
}; 

struct course { 
struct teacher teachers[5]; 
struct student students[50]; 
int semesternumber; 
struct course* next; 
}; 

int readline(char s[],int lim) 
{ 
    int c, i; 
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
    s[i] = c; 
    if (c == '\n') { 
    s[i] = c; 
    ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 

int addstudent (struct student* prev, int studentnumber, char* studentname) 
{ 
if (!(prev==NULL)) 
    student newS = (student*)malloc(sizeof(student)); 
    newS->studentnumber = studentnumber; 
    newS->firstname = strdup(studentName); 
    newS->next = NULL; 
    prev->next=newS; 

    return 1; 
} 

int readdb(student* students) 
{ 
char line[200]; 
int* studentnumber,coursenumber,teachernumber,semesternumber; 
char studentname[100],teachername[100],coursename[100]; 

while(readline(line,200) > 0) 
{ 
if(sscanf(line, "S %d %s", &studentnumber, studentname)==2) 
{ 
printf("Student. \n\tStudent number: %d, \n\tFirst name: %s\n", studentnumber, 
studentname); 
addstudent(students,&studentnumber,studentname); 
} 
else if(sscanf(line, "C %d %s %d", &coursenumber, coursename , &semesternumber)==3) 
    printf("Course. \n\tCourse number: %d \n\tCourse name: %s \n\tSemester: %d\n", 
coursenumber, coursename, semesternumber); 
else if(sscanf(line, "E %d %d", &studentnumber, &coursenumber)==2) 
printf("Enrolment. \n\tStudent number: %d, \n\tCourse number: %d\n", studentnumber, 
coursenumber); 
else if(sscanf(line, "T %d %s", &teachernumber, teachername)==2) 
printf("Teacher. \n\tTeacher number: %d, \n\tFirst name: %s\n", teachernumber, 
teachername); 
else if(sscanf(line, "A %d %s", &teachernumber, &coursenumber)==2) 
printf("Assignment. \n\tTeacher number: %d, \n\tCourse number: %d\n", teachernumber, 
coursenumber); 
} 

} 


int main() 
{ 
struct student* students = NULL; 

readdb(&students); 
return 0; 

} 
+1

对于将来的问题:请将您的代码降低到最小,但仍会产生相同的错误。在你的问题中不应该有不活动的代码或不相关的代码。你也应该突出显示错误发生的路线。 – stefan

回答

1

现有答案是正确的:student目前在您的程序中不是类型名称,但是struct student是。你已经正确地使用这个,所以只要保持一致。

如果冒险离开代码审查区域,addstudent仍然不会做你想要的。

int addstudent (struct student* prev, int studentnumber, char* studentname) 
{ 
    if (!(prev==NULL)) 
     student newS = (student*)malloc(sizeof(student)); 
    newS->studentnumber = studentnumber; 
    newS->firstname = strdup(studentName); 
    newS->next = NULL; 
    prev->next=newS; 

    return 1; 
} 

所以这是试图将追加到一个链表,这是很好的结束,但也有一些错误:

  • newS声明应该是struct student *newS = malloc(sizeof(*newS));

    1. 我们修复你的编译器抱怨的struct name
    2. malloc返回一个指针,所以newS必须是一个指针,以及
    3. p = malloc(sizeof(*p))是一种常见的成语,当你改变的p在今后的类型,但忘记编辑的sizeof表达
  • 您目前宣布newS避免错误只有在if语句的范围内 - 这意味着下列行参考newS将不会编译,因为它们不能看到该变量。我们可以用括号扩大范围,像这样:if (prev) { ... } return 1;

  • newS->next总是设置为NULL,所以如果prev->next已经有值,它丢弃。这意味着你的链表只能有一个学生长。如果你想保持你的列表连在一起的,它应该是

    newS->next = prev->next; 
    prev->next = newS; 
    
  • 你混了struct student **(这是readdb(&students)传递的类型)和struct student * ...你需要找出你想要的,并坚持下去。如果你有一个struct student实例(不是指针),而下一个初始化为NULL作为你的列表的头部,那么当前的addstudent代码将只能工作。

1

addstudent,你声明

student newS = (student*)malloc(sizeof(student)); 

这应该是struct student newS

3

如果你想使用你正在使用student代替struct student只是student那么你需要有typedef struct student student;在你的代码。