2013-03-19 2 views
2

나는 C 학생의 데이터베이스를 쓰고 있어요 및 I는 다음과 같이 두 구조 학생 및 코스 정의한 : 나는 비록 만들고 학생들을 표시하는 데 문제가구조 내의 구조?

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 

테스터 :

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