Forum: Compiler & IDEs wie char-array als als Parameter übergeben.


von Anos B. (Gast)


Lesenswert?

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.

von Stefan B. (Gast)


Lesenswert?

Siehe Frage 2.10 in
http://www.dclc-faq.de/kap2.htm

von Hc Z. (mizch)


Lesenswert?

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]){

von Peter (Gast)


Lesenswert?

> 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.

von Stefan B. (Gast)


Lesenswert?

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).

von Stefan H. (stefanhennig)


Lesenswert?

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
Noch kein Account? Hier anmelden.