2016-07-28 3 views
0

이 코드에 문제가 있습니다. 배열에 다양한 개인 정보가있는 프로그램을 코딩하고 싶습니다. 그리고 나는 15 개 배열을 메모리 (malloc)의 한 곳에서 설정하기를 원합니다. 또한 프로그램은 요청시 한 사람의 개인 정보 (angestellter [0 - 14])를 출력 (printf)해야합니다.구조체 배열과 malloc [C]

gcc ANGDB.c 
ANGDB.c: In function ‘print_angestellter’: 
ANGDB.c:14:18: error: subscripted value is neither array nor pointer nor vector 
nu = angestellter[x].nummer; 
       ^
ANGDB.c:15:18: error: subscripted value is neither array nor pointer nor vector 
vn = angestellter[x].vorname; 
       ^
ANGDB.c:16:18: error: subscripted value is neither array nor pointer nor vector 
nn = angestellter[x].nachname; 
       ^
ANGDB.c: In function ‘main’: 
ANGDB.c:25:13: error: subscripted value is neither array nor pointer nor vector 
angestellter[0] -> nummer = 1; 
      ^
ANGDB.c:26:13: error: subscripted value is neither array nor pointer nor vector 
angestellter[0] -> vorname = "George"; 
      ^
ANGDB.c:27:13: error: subscripted value is neither array nor pointer nor vector 
angestellter[0] -> nachname = "Washington"; 

이 내 코드입니다 :

#include <stdio.h> 
#include <stdlib.h> 

struct angestellter{ 
    int nummer; 
    char vorname[50]; 
    char nachname[50]; 
}angestellter; 

void print_angestellter(int x){ 
    int nu; 
    char vn[50]; 
    char nn[50]; 
    nu = angestellter[x].nummer; 
    vn = angestellter[x].vorname; 
    nn = angestellter[x].nachname; 
    printf("%d, %s, %s\n", nu, vn, nn); 
} 

int main(){ 
    struct angestellter **db = malloc(sizeof(angestellter)*15); 
    angestellter[0] -> nummer = 1; 
    angestellter[0] -> vorname = "George"; 
    angestellter[0] -> nachname = "Washington"; 
    print_angestellter(0); 
} 
+4

'angestellter'는'struct angestellter' 유형의 단일 변수입니다. 당신은 그것에 subscripting을 사용할 수 없습니다. –

+1

메모리를 할당하고 db라는 변수에 할당 한 것처럼 보입니다. angestellter 대신 db를 사용해야합니까? – bruceg

답변

1

의 단일 인스턴스 인 angestellter을 사용하는 경우 동적 할당 배열 인 db을 사용해야합니다. 또한 struct angestellter ** 대신 struct angestellter *으로 선언해야합니다. 이 또한 print_angestellter에게 전달되어야합니다.

문자열을 복사하려면 strcpy도 사용해야합니다. 문자열을 문자 배열에 직접 할당 할 수는 없습니다. 대체 - "> 수 데시벨 [0]"배열, 그 확인의 포인터를 의미하지만, 당신이 사용한다

#include <stdio.h> 
#include <stdlib.h> 

struct angestellter{ 
    int nummer; 
    char vorname[50]; 
    char nachname[50]; 
}; 

void print_angestellter(struct angestellter *db, int x){ 
    int nu; 
    char vn[50]; 
    char nn[50]; 
    nu = db[x].nummer; 
    strcpy(vn, db[x].vorname);  // use strcpy to copy strings 
    strcpy(nn, db[x].nachname); 
    printf("%d, %s, %s\n", nu, vn, nn); 
} 

int main(){ 
    struct angestellter *db = malloc(sizeof(struct angestellter)*15); 
    db[0].nummer = 1; 
    strcpy(db[0].vorname, "George"); 
    strcpy(db[0].nachname, "Washington"); 
    print_angestellter(db, 0); 
} 
+0

정답입니다. 고마워요! – asdasdasd1234

+0

'print_angestellter'는 구조체 멤버를 직접 전달할 수 있습니다 : printf ("% d, % s, % s \ n", db [x] .nummer, db [x] .vorname, db [x] .nachname);' – chqrlie

0

당신은 두 가지 문제를 갖고있는 것 같다 내가 받아 봐

강령 오류는 다음과 같습니다. 우선, print_angestellter() 함수에서 전역으로 angestellter 구조체를 사용합니다.이 구조체는 아무 문제가 없습니다. 그러나 배열 또는 메모리 포인터가 아닌 구조체입니다. 따라서 연산자 []을 사용할 수 없으므로 오류가 발생합니다. print_angestellter()을 다시 디자인하거나 angestellter의 배열을 struct angestellter으로 지정해야합니다. main()에서 비슷한 실수를했는데 db[0] 대신 angestellter[0]이 발생했습니다. 이 문제를 해결하려면 print_angestellter()에 포인터 인수를 추가하고 print_angestellter(int, struct *angestellter a)으로 만들고 angestellter[0]a[0]으로 대체하는 것이 좋습니다. 또한 =을 사용하여 문자열을 복사하지만 포인터 주소 인 이 아닌이 문자열의 내용을 복사합니다. 대신 strcpy()을 사용하십시오.

0

당신은 "구조체 angestellter ** dB = malloc을 (를 sizeof (angestellter) * 15)"썼다 "angestellter [0] -> nummer"; "void print_angestellter()"함수는 "malloc"을 사용할 때 형식 매개 변수 "dp"를 추가해야합니다.

+0

StackOverflow에 오신 것을 환영합니다. [** Markdown 또는 HTML을 사용하여 내 게시물의 서식을 지정하는 방법 **] (http://stackoverflow.com/help/formatting)을 방문하여 코드 형식을보다 쉽게 ​​읽을 수 있도록 서식을 지정할 수 있습니다 일반 텍스트와 구별 할 수 있습니다. –