wie char-array als als Parameter übergeben.

Gast #1543908
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.
Gast #1543993
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.
Gast #1544028
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).
#1544041
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren