2016-03-21 1 views
0

Ich habe einen Strukturtyp festgelegt:Besetzung gibt Fehler-Array-Typen mit assaining zweidimensionalen Anordnungen in c

typedef struct { 
    char *snt[MAX_LINE_LENGTH]; 
} sentence; 

und diese Zeile wird immer einen cast specifies array type Fehler:

sentence copySentence(sentence *source) { 
    sentence nw; 
    nw.snt = (char *[])source->snt; //Here is the error 
    return nw; 
} 

Was ist die beste fix für diese Codezeile und was ist das Problem?

+0

Mögliche Duplikat [gcc Compiler-Fehler: Cast gibt Array-Typ] (http://stackoverflow.com/questions/3427843/gcc-compile-error-cast-specifies-array- type) –

+0

ändere 'char * Satz [MAX_LINE_LENGTH];' in 'char ** Satz;' und 'malloc' nach' MAX_LINE_LENGTH'. Dann musst du nichts mehr werfen. – LPs

+1

Hör auf zu schreiben (besonders wenn du keine Ahnung hast, was du machst) –

Antwort

0

Sie deklarieren snt als ein Array von Zeigern auf Zeichen. Sie meinen es wahrscheinlich t eine Reihe von charactes sein, oder ein Zeiger auf ein Array von Zeichen:

char snt[MAX_LINE_LENGTH]; // array of characters to hold your sentence 
char *snt;     // pointer to array of characters 

Wenn Sie ein Element mit einem kompatibelen Elemente zuordnen, gibt es keine Notwendigkeit für eine Besetzung und Gießen ist hier als schädlich weil Sie verhindern, dass der Compiler Sie warnt. Beachten Sie, dass Sie nicht die Zeichen kopieren, Sie machen nur zwei Strukturen auf den gleichen Satz zeigen.

Ich überlasse Ihnen dies, als eine Übung.

1

Sowohl nw.snt als auch source->snt sind Zeigerarrays. Um das gesamte Array "tief zu kopieren", möchten Sie vielleicht memmove(nw.snt, source->snt, MAX_LINE_LENGTH * sizeof (char *)); verwenden.

Außerdem bevorzugen Menschen normalerweise, einen Zeiger auf eine Struktur zu übergeben, als diese Struktur direkt übergeben, um die Kosten der Argumentübergabe zu reduzieren. In diesem Fall können Sie

sentence *copySentence(sentence *source) { 
    sentence *nw; 
    nw = malloc(sizeof (struct sentence)); 
    memmove(nw.snt, source->snt, MAX_LINE_LENGTH * sizeof (char *)); 
    return nw; 
} 
+0

... und es wird ein neuer Fehler angezeigt fragen, was ist int Mitglied ...;) – LPs

+0

@LPs Typoooooooooo !!! –

+0

@LPs Ich hasse Auto-Korrektur ... –