2016-07-28 12 views
0

Ich habe ein Problem mit diesem Code. Ich möchte ein Programm programmieren, das verschiedene persönliche Informationen in einem Array enthält. Und ich möchte, dass 15 Arrays an einem Ort im Speicher eingerichtet werden (malloc). Auch das Programm sollte die persönlichen Daten einer Person auf Anfrage ausgeben (printf) (angestellter [0 - 14]).Array von Strukturen und malloc [C]

Die Codefehler I recive sind die folgenden:

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"; 

Dies ist mein Code:

#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

'angestellteller' ist eine einzelne Variable vom Typ' struct ansteller'; Sie können keine Subskriptionen verwenden. –

+1

Offenbar weisen Sie Speicher zu und weisen ihn einer Variablen namens db zu. Solltest du db statt angestellter nicht verwenden? – bruceg

Antwort

1

Wo Sie angestellter verwenden, das eine einzelne Instanz von struct angestellter ist, sollten Sie db verwenden, das Ihr dynamisch zugewiesenes Array ist. Sie sollten es auch als struct angestellter * anstelle von struct angestellter ** deklarieren. Dies muss auch an print_angestellter weitergegeben werden.

Sie müssen auch strcpy verwenden, um Zeichenfolgen zu kopieren. Sie können einem Zeichenarray nicht direkt eine Zeichenfolge zuweisen.

#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

Dies ist die richtige Antwort. Vielen Dank! – asdasdasd1234

+0

'print_ansteller 'könnte die Strukturelemente direkt übergeben:' printf ("% d,% s,% s \ n", db [x] .nummer, db [x] .vorname, db [x] .nachname); ' – chqrlie

0

Sie scheinen zwei Probleme zu haben. Zuallererst verwenden Sie in Ihrer print_angestellter() Funktion die globale Struktur angestellter, die völlig in Ordnung ist. Es ist jedoch eine Struktur, kein Array oder Zeiger auf Speicher. Daher können Sie den Operator [] nicht verwenden, daher die Fehler. Es scheint, dass Sie print_angestellter() oder angestellter ein Array von struct angestellter s neu entwerfen müssen. Sie haben auch einen ähnlichen Fehler in main(), tun angestellter[0] statt db[0] gemacht. Um dies zu beheben, schlage ich vor, ein Zeigerargument zu print_angestellter() hinzuzufügen, sagen wir print_angestellter(int, struct *angestellter a) und angestellter[0] durch a[0] zu ersetzen. Sie verwenden auch =, um Zeichenfolgen zu kopieren, aber das kopiert die Zeigeradressen nicht den Inhalt der Zeichenfolge. Verwenden Sie stattdessen strcpy().

0

Sie schrieb "struct angestellter ** db = malloc (sizeof (angestellter) * 15);" bedeutet Zeiger des Arrays, es ist ok, aber Sie sollten verwenden "db [0] -> Nummer" zu ersetzen "angestellter [0] -> nummer"; Die Funktion "void print_angestellter()", sollte formaler Parameter "dp" hinzugefügt werden, wenn Sie "malloc" verwenden, vergessen Sie nicht, "free" zu verwenden, um den von Ihnen angewendeten Speicher freizugeben;

+0

Willkommen bei StackOverflow. Vielleicht möchten Sie [** Wie formatiere ich meine Posts mit Markdown oder HTML? **] (http://stackoverflow.com/help/formatting), um Ihnen zu helfen, Ihre Antwort so zu formatieren, dass sie mit dem Code besser lesbar ist unterscheidbar von dem allgemeinen Text, etc .. –