Reputation: 197
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;
}
Upvotes: 0
Views: 2490
Reputation: 67733
The existing answers are correct: student
isn't a type name in your program at the moment, but struct student
is. You're already using this correctly, so just make it consistent.
At the risk of digressing into code review territory, addstudent
still won't do what you want.
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;
}
so this is trying to append to the end of a linked list, which is fine, but there are some errors:
the newS
declaration should be struct student *newS = malloc(sizeof(*newS));
newS
has to be a pointer as wellp = malloc(sizeof(*p))
is a common idiom that avoids bugs when you change the type of p
in the future, but forget to edit the sizeof expressionyou're currently declaring newS
only inside the scope of the if statement - this means the following lines which refer to newS
won't compile, as they can't see that variable. We can extend the scope with braces like so: if (prev) { ... } return 1;
newS->next
is always set to NULL, so if prev->next
already 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 be
newS->next = prev->next;
prev->next = newS;
you're mixing up struct student **
(which is the type passed in readdb(&students)
) and struct student *
... you need to figure out which you want, and stick with it. The current addstudent
code will only work if you have a struct student
instance (not a pointer) with next initialized to NULL as the head of your list.
Upvotes: 1
Reputation: 3375
You're using student
instead of struct student
If you want to use just student
then you need to have typedef struct student student;
in your code.
Upvotes: 3
Reputation: 183888
In addstudent
, you declare
student newS = (student*)malloc(sizeof(student));
That should be struct student newS
.
Upvotes: 1