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]
^^^^^^
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
@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
@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