2016-08-03 6 views
0

Hallo, brauche Hilfe beim Erstellen einer multidimensionalen Array Ich bin neu bei C, jede Hilfe wird geschätzt. Dies ist der CodeErstellen eines multidimensionalen Arrays bei c

#include <stdio.h> 

char init_board(int row, int col); 

int main(int argc, char** argv) { 
     int row = argv[3]; 
     int col = argv[4]; 
     char** board = init_board(row, col); 

     for (int i = 0; i < row; i++) { 
       for (int j = 0; j < col; j++) { 
         printf("%d", board[i][j]); 
       } 
     } 


     return 0; 
} 

char init_board(int row, int col) { 

     int count = 0; 
     int count2 = 0; 
     char** out; 
     while (count < row) { 
       while (count2 < col) { 
         out[count][count2] = "."; 
         count2++; 
       } 
       count++; 
       count2 = 0; 
     } 
     return out; 
} 

eine Idee, wie ich dieses Problem beheben kann? was mache ich falsch? wenn ich kompilieren erhalte ich folgende Warnungen und wenn ich es laufen, sagt Segmentation Fault

[email protected]:~/s216/arc/ass1/ass1$ gcc ass1.c -std=c99 -o test 
ass1.c: In function ‘main’: 
ass1.c:6:12: warning: initialization makes integer from pointer without a cast [enabled by default] 
    int row = argv[3]; 
      ^
ass1.c:7:12: warning: initialization makes integer from pointer without a cast [enabled by default] 
    int col = argv[4]; 
      ^
ass1.c:8:17: warning: initialization makes pointer from integer without a cast [enabled by default] 
    char** board = init_board(row, col); 
       ^
ass1.c: In function ‘init_board’: 
ass1.c:27:23: warning: assignment makes integer from pointer without a cast [enabled by default] 
    out[count][count2] = "."; 
        ^
ass1.c:33:2: warning: return makes integer from pointer without a cast [enabled by default] 
    return out; 
^
[email protected]:~/s216/arc/ass1/ass1$ ./test x x 5 5 
Segmentation fault 
[email protected]:~/s216/arc/ass1/ass1$ 
+0

'int row = argv [3] haben sollte;' linke Seite ist ein 'int ', rechte Seite ist ein' char * '. Das sind keine kompatiblen Typen - genau so, wie es dir die Warnung sagt. Sie müssen 'argv [3]' in ein int mit etwas wie 'atoi' oder besser noch' strtol' umwandeln. – kaylum

+1

Vielleicht ist das völlig irrelevant, aber wenn ** alles fettgedruckt ist **, dann sticht nichts wirklich hervor. Formatierung soll die Aufmerksamkeit auf einen bestimmten Teil des Posts lenken, aber wenn du auf alles aufmerksam machst, hättest du genauso gut auf nichts aufmerksam machen können. – iRove

Antwort

1

Wenn Sie int row = argv[3]; schreiben Sie einen int machen und es auf den Wert von argv[3] initialisiert. argv ist jedoch vom Typ char **, der ein Zeiger auf einen Zeiger oder effektiv ein Array des Typs char * ist. Dies ist eine ungültige Zuweisung. Sie müssen einen Zeichenpuffer erstellen, um die Argumente zu lesen, und dann atoi(argv[i]) verwenden, um den ganzzahligen Wert zu erhalten.

+0

ok ich werde versuchen, dass – Arc

2

Typ argv[3] und argv[4] ist char*. Daher sind die Zeilen

int row = argv[3]; 
int col = argv[4]; 

falsch. Sie versuchen, zwei int Objekte mit char* zu initialisieren.

Wenn Sie das Programm ausführen mit:

program 10 20 30 40 

dann,

Der Wert argv[0] wird "program" sein. Der Wert argv[1] wird "10" sein.
Der Wert argv[2] wird "20" sein.
Der Wert argv[3] wird "30" sein.
Der Wert argv[4] wird "40" sein.

Ja, sie scheinen Nummern in der Befehlszeile zu sein, aber sie sind Zeichenfolgen in einem C-Programm. Sie können atoi verwenden, um die ganzzahligen Zahlen aus den Strings zu extrahieren.

int row = atoi(argv[3]); 
int col = atoi(argv[4]); 

Stellen Sie sicher,

#include <stdlib.h> 

verwenden, um die Deklaration der Funktion zu erhalten.

0

die anfangs gibt es viele Fehler mit dem Code, Belive i der folgende Code ist, was es gewesen ..

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

char **init_board(int row, int col); 

int main(int argc, char** argv) { 

     int row = atoi(argv[3]); 
     int col = atoi(argv[4]); 
     char** board = init_board(row, col); 

     for (int i = 0; i < row; i++) { 
       for (int j = 0; j < col; j++) { 
         board[i][j] = 'x'; 
         printf("%c", board[i][j]); 
       } 
     } 


     return 0; 
} 

char **init_board(int row, int col) { 

     char** out = malloc(sizeof(char*) * row); 
     for (int i = 0; i < row; i++) 
      out[i] = malloc(sizeof(char) * col); 

     return out; 
} 
+0

Normalerweise ist es besser, eine Lösung zu erklären, anstatt nur einige Zeilen anonymen Code zu veröffentlichen. Sie können lesen [Wie schreibe ich eine gute Antwort] (https://stackoverflow.com/help/how-to-answer), und auch [Vollständig Code-basierte Antworten zu erklären] (https://meta.stackexchange.com/fragen/114762/erklären-ganz-% E2% 80% 8C% E2% 80% 8Bcode-basierte Antworten) –