mikrocontroller.net

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


Autor: Anos B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Frage 2.10 in
http://www.dclc-faq.de/kap2.htm

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mindestens die Größe des (/der) inneren Arrays (23) muss angegeben 
werden, sonst kann die Function die Elemente nicht berechnen:
void Menu(int a, int b, int Itemsmax, char Menutext[][23]){

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Stefan Hennig (stefanhennig)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.