2017-02-14 8 views
-1

Ich versuche, die folgende Reihe von Zeichen-Arrays zu wachsen:Wie Array von Zeichen-Arrays in C wachsen

char input_channel_name[ 20 ][ 36 ]; 

Die Anzahl der Spalten wird immer 36 sein, aber die Anzahl der Zeilen variiert. Wenn ich meine Datei öffnen, kann ich die Anzahl der Kanalnamen als Integer greifen number_of_channels_in

habe ich versucht, es zu Folge Code zu konvertieren (mit Hilfe von Resizing 2D Arrays in C) ohne Glück:

#define ROWS 20 
#define COLS 36 

main(argc, argv) 
    char **input_channel_name; 

    input_channel_name = malloc(sizeof *input_channel_name * ROWS); 
     if (input_channel_name) 
     { 
      for (size_t i = 0; i < ROWS; i++) 
       input_channel_name[i] = malloc(sizeof *input_channel_name[i] * COLS); 
     } 

get_input_channels: 
    input_file = fopen(input_name, "rb") 
    fread(plotFileHeader.headerFloats, sizeof(float), 2, input_file); 
    number_of_channels_in = plotFileHeader.headerFloats[ N_CHAN_SUB ]; 
    add_rows = number_of_channels_in - ROWS; 

    char **tmp = realloc(input_channel_name, sizeof *input_channel_name * ROWS + add_rows); 
    if (tmp) 
    { 
     input_channel_name = tmp; 
     for (size_t i = 0; i < add_rows; i++) 
     { 
      input_channel_name[ROWS + i] = malloc(sizeof *input_channel_name[ROWS + i] * COLS); 
     } 
    } 

Ich behalte bekommen

Fehler C2143: Syntaxfehler: fehlende ';' vor 'Typ'

wenn ich versuche, input_channel_name = malloc

Irgendwelche Ideen zu setzen?

+2

Bitte nehmen Sie sich die Zeit, Ihr Programm ein proper [MCVE] machen . Prototyp main wie erforderlich, fehlende include-Direktiven usw. – StoryTeller

+1

'main (argc, argv)' -> 'int main (int argc, char ** argv) {...}' – BLUEPIXY

+0

Das ist kein "Array von' char'arrays ", sondern ein Zeiger auf den Zeiger. Völlig verschiedene Datentypen. – Olaf

Antwort

0

Ihre Programme Untergang ist, dass es Arrays als Zeiger behandelt. Sie sind in der Tat nicht ein und dasselbe, und Sie können uns nicht char** Zugriff auf eine echte mehrdimensionale Array direkt.

Der Weg, um einen Zeiger auf ein Feld von 36 Zeichen zu erklären, ist wie folgt:

char (*p_arr)[36] = NULL; 

es an die erste derartige Anordnung in einer malloc Punkt haben -ed Sie normalerweise fortfahren würden blockieren:

char (*p_arr)[36] = malloc(row_count * sizeof *p_arr); 

Oder, wenn Sie die typedefing Art sind:

typedef char c_arr_36[36]; 
c_arr_36 *p_arr = malloc(row_count * sizeof(c_arr_36)); 
+0

Ich werde versuchen, dies zu verdauen und einen Sinn daraus zu machen. Aus Neugier, ist die Antwort unter http://stackoverflow.com/questions/39208929/resizing-2d-arrays-in-c falsch? Es schien die einfachste Antwort zu sein, die ich finden konnte, und benutzte sie Zeile für Zeile. Auch in Ihrem Beispiel, was genau ist die Variable für das Array? Ist * p_arr kein Zeiger? Ist das nicht das, was ich vermeiden wollte? –

+0

@ Das.Rot - Die Antwort ist nicht falsch, aber es geht nicht um wahre mehrdimensionale Arrays, was Sie versucht haben zu tun. 'p_arr' ist in der Tat ein Zeiger, aber es ist ein * Zeiger-zu-einem-Array *. Dies ist etwas, das grundlegende C-Tutorials widerwillig zu decken scheinen. Wenn Sie mehr erfahren möchten, finden Sie in diesem Beitrag http://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays – StoryTeller