wie char-array als als Parameter übergeben.

Gast #1543908
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
> 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
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.