2013-03-19 6 views
2

Я пишу базу данных студентов в C и я определил две структуру студента и курс, которые выглядят следующим образом:Структуры внутри структур?

typedef struct student Student; 
typedef struct course Course; 

struct course 
{ 
    char number[300]; 
    char title[300]; 
    char instructor[300]; 
    char days[10]; 
    char start[10]; 
    char end[10]; 
    char location[300]; 
}; 

struct student 
{ 
    char name[300]; 
    int age; 
    Course course1; 
    Course course2; 
}; 

Student *Data[30]; 
Course *Courses[30]; 

У меня возникли проблемы, отображающие студент я создаю, хотя. Я просто хочу распечатать имя, возраст и два курса, но у меня возникли проблемы с доступом к элементам структуры курса через студенческую.

Я попытался это:

printf("course1: %s\t%-40s%-30s\t%s\t%s-%s\t%s\n", 
     Data[i]->course1.number, 
     Data[i]->course1.title, 
     Data[i]->course1.instructor, 
     Data[i]->course1.days, 
     Data[i]->course1.start, 
     Data[i]->course1.end, 
     Data[i]->course1.location); 

Но, конечно, не работает ...

+1

Какую ошибку вы получаете? С дизайнерской точки зрения: плохо, что каждый студент имеет полную копию курса. – John3136

+2

'Data' и' Courses' содержат только указатели на структуры 'Student' и' Course' соответственно, эти указатели не будут указывать на действительные экземпляры структуры, если вы их каким-то образом не назначили. Вы это сделали? – Praetorian

ответ

2

я упростил ваши структуры немного как учебный пример. Это может помочь вам понять, как получить доступ к данным. Подстраивайте/расширяйте по мере необходимости в соответствии с вашими потребностями.

typedef struct student Student; 
typedef struct course Course; 

struct course { 
    char title[300]; 
}; 

struct student { 
    char name[300]; 
    Course * course; // pointer to a course 
}; 

Student students[30]; // preallocate 30 students 
Course courses[30]; // preallocate 30 courses 

Tester:

void main(void) { 

    // 1st course 
    strcpy(courses[0].title,"C Language 101"); 

    // 1st Student 
    strcpy(students[0].name,"Charles"); 

    // Assign 1st Student to course #1 
    students[0].course = & courses[0]; 

    printf("Student 1: name=%s course=%s", students[0].name, students[0].course->title); 

    return; 
} 

Выход:

Student 1: name=Charles course=C Language 101 
+0

Почему вы изменили структуру 'student', чтобы содержать только * указатель * в структуре' Course'? Это не тот исходный код. Это необходимое изменение? Это вы бы рекомендовали? –

+1

@CodyGray - Я создал упрощенный пример, чтобы показать, как получить доступ к данным. Существует множество способов реализации. В очень большом приложении я не думаю, что вы захотите дублировать общие данные в каждой записи, когда указатель на данные будет достаточным. – Java42

Смежные вопросы