2016-11-18 4 views
-2

Ich habe diese zwei Funktionen und ich muss das table Array übergeben und seinen Inhalt ändern.Wie übergibt man ein mehrdimensionales Array als Zeiger?

void play_game(int mines, int c, int r) { 
    char (*table)[c][r]; 
    build_field(*table, c, r); 
} 

void build_field(char *table ,int tamanhox, int tamanhoy) { 
    int i, x; 
    for(i=1;i<tamanhoy+1;i++){   
     table[tamanhoy][tamanhox] = '-';   
     for(x=0;x<tamanhox-1;x++){ 
      table[tamanhoy][tamanhox] = '-'; 
    } 
} 

In diesem Code ist es Fehler bei table[tamanhoy][tamanhox].

+1

schreiben Wenn Sie bereit sind, ein bestimmtes Speicherlayout zu übernehmen unterhalb Sie Ihren Tisch als passieren können ' char ** '. Andernfalls müssen Sie Ihre eigene Matrixdarstellung auf einem flachen 'char *' Speicherbereich erstellen und diese verwenden. Es gibt viele gute C-Matrix-Bibliotheken. – David

+0

@David: 'char **' ist kein multidimensionales Array, kann nicht eins darstellen oder auf eins zeigen! Das ist eine völlig andere Datenstruktur. Der Typ OP kann leicht an eine Funktion übergeben werden. Und die Lösung ist offensichtlich. – Olaf

+0

@Olaf: Ja, sie sind unterschiedliche Datenstrukturen. Aber wenn Sie ein bestimmtes Speicherlayout annehmen, können Sie unbedingt ein char ** verwenden, um in ein mehrdimensionales Array zu indizieren. Es ist verständlicherweise schlechte Form, aber manchmal kann man es nicht umgehen. Ich sehe, dass du dich in dem Link, den ich gerade gepostet habe, über diese Technik beschwert hast, also denke ich, dass wir nur widersprechen werden. http://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory – David

Antwort

1

Sie erhalten einen Fehler, weil Sie das Argument table zu einem Zeiger auf eine char, nicht ein Zeiger auf ein Array von Arrays zu deklarieren. Sie auch nicht machen table tatsächlich irgendwo zeigen.

Beide Probleme können durch nicht machen table ein Zeiger auf ein Array von Array gelöst werden, und durch Änderung der Reihenfolge Sie die Argumente an die build_field Funktion übergeben:

char table[c][r]; 
build_field(c, r, table); 

... 

void build_field(int tamanhox, int tamanhoy, char table[][tamanhoy]) 
{ 
    // Use table like a normal array of array (i.e. table[x][y] = z) 
} 

Es gibt ein paar andere Probleme mit dem Code, den Sie auch zeigen, wie Sie immer table[tamanhoy][tamanhox] in der build_field Funktion verwenden, wenn Sie wahrscheinlich table[x][i] bedeuten.

Sie sind auch außerhalb der Grenzen in der Funktion, denken Sie daran, dass Indizes sind Null-basierte, so gültige Indizes für die erste "Dimension" ist 0 bis tamanhox - 1 (inklusive).

+1

Als Nebenbemerkung: Die Verwendung beider Dimensionen wie 'char table [tamanhox] [tamanhoy]' ergibt dasselbe, ist aber besser aus einer Dokumentationsansicht. Es macht deutlich, dass die zwei Ganzzahlen die Dimensionen ohne einen zusätzlichen Kommentar sind. Der richtige Typ für Array-Dimensionen ist auch 'size_t', nicht' int'. Dies macht auch deutlich, dass Sie niemals einen negati- ven Wert überschreiten dürfen. Für bestimmte Systeme, z.B. Bei den meisten 64-Bit-Architekturen kann 'int' nicht alle Indizes darstellen, da diese mehr als 32 Bits erlauben. Auf solchen Systemen ist "size_t" typischerweise 64 Bits. Ähnlich für einige 16-Bit-Architekturen mit mehr als 16 Bit Adressraum. – Olaf

1

Diese Erklärung

char (*table)[c][r]; 

erklären nicht ein Array. Es deklariert einen Zeiger auf ein Objekt vom Typ char[c][r]. By the way warum nicht? :)

char[r][c] 
    ^^^^^ 

Also vor der Verwendung dieses Zeigers muss es richtig initialisiert werden.

In dieser Funktionsdeklaration

void build_field(char *table ,int tamanhox, int tamanhoy); 

der erste Parameter hat char * eingeben. Die Typen char (*)[c][r] und der Typ char * sind verschiedene inkompatible Typen.

Sie könnten die Funktionsdeklaration zum Beispiel den folgenden Typ

void build_field(int tamanhox, int tamanhoy, char (*table)[tamanhox][tamanhoy]); 

Aber innerhalb der Funktion schreiben Sie müssen den Zeiger dereferenzieren. Zum Beispiel

(*tablw)[I][j] 

Die genaue Parameterdeklaration hängt davon ab, wie der Zeiger initialisiert wird und was Sie tun werden. Vielleicht meinen Sie die folgenden Erklärungen

char (*table)[r]; 

und

void build_field(int tamanhox, int tamanhoy, char (*table)[tamanhoy]); 

Der Compiler gibt einen Fehler, da der Funktionsparameter table eingeben * char hat. So ist table[I] ein Skalarobjekt vom Typ char.Sie dürfen nicht den tiefgestellten Operator wie table[I][x] darauf anwenden. Und außerdem dieser Ausdruck

table[tamanhoy][tamanhox] 
     ^^^^^^^^ ^^^^^^^^^ 

in jedem Fall nicht sinnvoll, weil zumindest sollten Sie

table[i][x] 
    ^^^^^^ 
Verwandte Themen