I am trying to compile my program in C, and these are the errors I get:
(Please note that I am a beginner at this language.)
Excer3.c: In function `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
My code looks like this. The function doesn’t recognize the arguments it was given. :
#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;
}
The existing answers are correct:
studentisn’t a type name in your program at the moment, butstruct studentis. You’re already using this correctly, so just make it consistent.At the risk of digressing into code review territory,
addstudentstill won’t do what you want.so this is trying to append to the end of a linked list, which is fine, but there are some errors:
the
newSdeclaration should bestruct student *newS = malloc(sizeof(*newS));newShas to be a pointer as wellp = malloc(sizeof(*p))is a common idiom that avoids bugs when you change the type ofpin the future, but forget to edit the sizeof expressionyou’re currently declaring
newSonly inside the scope of the if statement – this means the following lines which refer tonewSwon’t compile, as they can’t see that variable. We can extend the scope with braces like so:if (prev) { ... } return 1;newS->nextis always set to NULL, so ifprev->nextalready has a value, it’s discarded. This means your linked list can only ever be one student long. If you want to keep your list linked together, it should beyou’re mixing up
struct student **(which is the type passed inreaddb(&students)) andstruct student *… you need to figure out which you want, and stick with it. The currentaddstudentcode will only work if you have astruct studentinstance (not a pointer) with next initialized to NULL as the head of your list.