Ich habe ein Problem. ich möchte in C ein 2-dimensionales const char array an eine Funktion als Parameter geben. die Funktion Menu() soll mir aus dem const char Menu[7][23] Eintrag, welcher die Menü-einträge enthält, ein Textmenü basteln. habe ich bis jetzt so versucht: const char Menu1[7][23] = {"Text Zeile 1", "Text Zeile 2", "Text Zeile 3", "Menü-Zeile 4", "Menüauswahlpunkt 5", "etc... weitere Zeilen", "weiter bis Punkt7"}; void Menu(int a, int b, int Itemsmax, char Menutext[][]) { ..Inhalt ... ... } ... ... Menu(1, 2, 7, Menu1); ... ... Der Compiler will diese oder ähnliche Varianten nicht. Weiß jemand, wie man ein 2-dim. char array korrekt als Funktions-Parameter übergeben kann. Wenn das nicht möglich ist, macht man das dann mit Pointern? Wie würde man das selbe oder ähnliches mit Pointern übergeben? Falls das jemand schonmal benutzt hat, wären beispiele gut. egal, welche C-Compiler abart. Das war in diesem fall der MikroC-Compiler für PIC24 und dsPIC controller. es muß nicht ganz genau auf diesen C-Compiler passen. denn rest kriege ich warscheinlich alleine passend.
Mindestens die Größe des (/der) inneren Arrays (23) muss angegeben werden, sonst kann die Function die Elemente nicht berechnen:
1 | void Menu(int a, int b, int Itemsmax, char Menutext[][23]){ |
> Mindestens die Größe des (/der) inneren Arrays (23) muss angegeben > werden, sonst kann die Function die Elemente nicht berechnen: warum denn das? bei int main( int argc, char** arg ) geht es auch ohne.
In einem char a[][] sind im Speicher die Daten anders organisiert/abgelegt als bei char **a. Bei letzterem hast du ein Array von Zeigern. Bei ersterem berechnest du die Position der "Zeiger" (anschaulich, es gibt in dem Fall physikalisch keine Zeiger innerhalb des 2D Array).
Peter schrieb: >> Mindestens die Größe des (/der) inneren Arrays (23) muss angegeben >> werden, sonst kann die Function die Elemente nicht berechnen: > warum denn das? > > bei int main( int argc, char** arg ) > > geht es auch ohne. Ja, aber das ist ein Array von Pointern, nicht ein zweidimensionales Array. Da ist C (wie in so manchem) sehr unintuitiv. Es macht nämlich einen Unterschied, ob Du definiert: const char ac[7][23]={"Text","Text",...}; oder schreibst: const char* apc[7]={"Text","Text",...}; Blöderweise greifst Du in beiden Fällen in gleicher Weise auf die Elemente zu. (C ist da blöd, nicht Du!) ac[1][2]==apc[1][2], weil ein Array ohne Index immer (implizit) zu einem Pointer auf das erste Arrayelement gemacht wird. Der Typ von ac[7] ist eben nicht 'const char [23]' oder so, sondern 'const char*'. Ich finde das unübersichtlich, weil es zwei Dinge geben kann, die man gleich verwendet, die aber im Speicher völlig unterschiedlich aussehen. Soviel dazu, dass C eine Hardware-nahe Sprache sei. Ist es nämlich nicht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.