2013-01-29 2 views
0

다음과 같은 문제가 있습니다. 숙제를 위해 나는 5 명의 학생을 위해 "학생"이라는 레코드의 Heap-Array를 만들고 몇 가지 값 (이름 등)을 할당해야합니다. 지금까지 내가했던 것처럼 레코드에 값을 할당하려고하면 { "오류가 발생하기 전에 예상되는식이 나타납니다.C의 레코드 배열에 값을 할당

Edit: 

typedef struct student_t { 
char hauptfach[128]; 
char name[64]; 
int matnr; 
} student; 

/Edit 

student *students; 
students = malloc(5*sizeof(student)); 


students[0] = {"Info", "Max Becker", 2781356}; 
students[1] = {"Soziologie", "Peter Hartz", 6666666}; 
students[2] = {"Hurensohnologie", "Huss Hodn", 0221567}; 
students[3] = {"Info", "Tomasz Kowalski", 73612723}; 
students[4] = {"Info", "Kevin Mueller", 712768329}; 

하지만 단일 값을 지정하려고 할 때.

students[0].hauptfach = "Informatik"; 

프로그램이 컴파일됩니다.

내가 뭘 잘못하고 있니? 사전에

감사합니다,

D.

+0

"프로그램이 컴파일됩니다. 내가 뭘 잘못하고 있니?"... 자, 제공하는 것은 컴파일되지 않습니다. 최소의 컴파일 가능한 테스트 케이스를 제공하십시오. 최소는 "발생한 문제를 설명하기에 충분한 코드 만 표시"를 의미합니다. Compilable은 "오타를 수정하거나 공란을 채우지 않고 시스템에서 컴파일 할 수있는 충분한 코드를 제공합니다"를 의미합니다. – Sebivor

답변

2

당신은 당신의 구조 정의를 표시하지 않은,하지만 난 문자열이 어떤 최대 크기 char의 배열입니다 기대합니다.

문자열을 할당하려면 strncpy을 사용해야합니다. 그 기능을보세요.

기본적으로, hauptfach 회원이 긴 MAX_LEN+1 자입니다 가정 :

strncpy(students[0].hauptfach, "Informatik", MAX_LEN+1); 
students[0].hauptfach[MAX_LEN] = 0; // Force termination if string truncated. 

아차, 죄송합니다 나는 당신의 질문을 오해. 위의 내용은 여전히 ​​유효 할 수 있습니다.

그런 구조체는 복사 할 수 없습니다. 배열 정의에서 초기화해야합니다 :

struct mystruct students[5] = { 
    {"Info", "Max Becker", 2781356}, 
    {"Soziologie", "Peter Hartz", 6666666}, 
    {"Hurensohnologie", "Huss Hodn", 0221567}, 
    {"Info", "Tomasz Kowalski", 73612723}, 
    {"Info", "Kevin Mueller", 712768329} 
}; 

또는 앞에 표시된 것처럼 필드를 개별적으로 할당 할 수 있습니다.

struct mystruct temp = {"Soziologie", "Peter Hartz", 6666666}; 
students[0] = temp; 
+0

고마워요. 하지만 malloc()을 지금 어디서 사용할 것인가? 숙제는 힙에 관한 것입니다 ... – PeterPanter

+0

오, 이봐, 나는 두 번 잘못 읽었다. ('malloc'을 놓쳤다.)이 경우, 내 개별 구조 할당 접근법을 사용하십시오. 쉬운 방법이 없습니다. 또 다른 옵션은'set_record (struct record *, const char * subject, const char * name, unsigned student_id)'에 모든 데이터를 전달하는 함수를 만드는 것입니다. 리차드의 답변에서이 접근법이 제안 된 것 같습니다. – paddy

+0

다시 한번 감사드립니다. 비록 우리가 C에 관한 우리의 3 번째 강의 였기 때문에 우리의 과제의 전체적인 디자인이 malloc(), free()를 사용하는 것 같았 기 때문에 좀 더 단순한 의도가 있다고 확신 할지라도 이것을 시도 할 것입니다. 그리고 * .c 파일에 타이핑하여 컴파일하는 등 몇 가지 포인터 작업이 필요합니다. – PeterPanter

1

이 두 문장은 정말 함께 갈 수 없어 :

이 가 이

(1)라고

1 students = malloc(5*sizeof(student)); 
2 students[0] = {"Info", "Max Becker", 2781356}; 
또 다른 옵션은 다음과 같이 복사 한 후 단일 인스턴스를 초기화하는 의해처럼 하나 개의 전체 배열 요소를 대체 할 수있다 런타임에 메모리를 동적으로 할당하려고합니다.

(2)는 컴파일 타임에 고정 주소에 나열한 값을 지정하려고한다고합니다. 불행하게도 컴파일러는 students[0]의 주소가 무엇인지 미리 알 수 없으므로 사용자가 원하는 것을 수행 할 수 없습니다.

void initstudent(student *s, const char hf[], const char name[], int matnr){ 
    strncpy(s->hauptfach, hf, MAXLEN); 
    strncpy(s->name, name, MAXLEN); 
    s->matnr=matnr; 
} 

를 한 후 학생들의 각이 적용

난 당신이 도우미 함수를 만드는 게 좋을 것.

+0

고마워,하지만이게 내가해야 할 일이 아닌 것 같아. 할당은 단순히 "5 개의 학생을위한 힙 배열"students "를 작성한 다음 배열을 5 명의 학생으로 채 웁니다. 우리가 시작해야하는 것은 student * students – PeterPanter

+0

입니다."불행히도 컴파일러는 다음과 같은 주소를 알 수 없습니다. 학생들은 [0] 미리 앞서 있습니다 "사실, 컴파일러는 학생 [0]의 주소가 미리 학생임을 알게 될 것입니다. 컴파일러는 학생들과 학생에게 할당 할 코드를 생성 할 수 있습니다. [0]. 주소는 사소한 수정으로 작동해야합니다 :'students [0] = (student) { "Info", "Max Becker", 2781356}; – Sebivor

관련 문제