Forum: Mikrocontroller und Digitale Elektronik Pointer: char** übergeben


von Thorsten (Gast)


Lesenswert?

Hi,

weiss jemand, wie ich folgendes an eine Funktion übergeben kann ?

void command_sys()
{
  unsigned char argc=0, argv[10][20];
...

        command_shell(argc, argv);
}


void command_shell(char argc, char argv[10][20])
{
  unsigned char pointer=0, counter=0, i=0, j=0, text[10];

  sprintf(text, "\n\rArgs: %i: ", argc); uart_print(text);


  for(i=0; i<=9; i++)
  {
    for(j=0; j<=19; j++)
    {
      sprintf(text, "%c.", argv[i][j]);
      uart_print(text);
    }
  }
}

Ich habe diverses durchprobiert.
Die Adresse scheint richtig anzukommen, aber ich komme nicht mehr an
den Inhalt meines Feldes heran.

Ziel ist eine Commandshell auf dem M16C, welche die Parameter argC und
argV übergeben bekommt.

Weiss jemand Rat ??

Greetz,
Th.

von Peter (Gast)


Lesenswert?

pointer werden mit * uebergeben
void command_shell(char argc, char *argv[10][20])

von Dirk D. (dirkd)


Lesenswert?

> command_shell(char argc, char *argv[10][20])

So übergibst Du aber einen Zeiger auf das Elemet mit den Indizes 10 und
20 (nebenbei: das ist außerhalb des Arrays)

Du solltest argv als **argv übergeben.

Dann kannst Du so

for(i=0; i<=9; i++)
  {
    for(j=0; j<=19; j++)
    {
      sprintf(text, "%c.", argv[i*20+j]);
      uart_print(text);
    }
  }

darauf zugreifen.

Hoffe ich habe nix falsch gemacht, ich habe heute noch keinen Kaffee
;-)

von The Daz (Gast)


Lesenswert?

"So übergibst Du aber einen Zeiger auf das Elemet mit den Indizes 10
und
20 (nebenbei: das ist außerhalb des Arrays)"

Wie kommst du darauf ? Um das zu tun muessten die Indizes ja beim
Funktionsaufruf angegeben werden. Also

   command_shell(argc, argv[10][20]);

Ganz generell sollte das Konstrukt im ersten posting so funktionieren.
Ich benutze es auch, wenn auch nicht mit dem avr-gcc. Egal bei welcher
schreibweise, ob array oder einfach char*, in beiden Faellen wird
erstmal nur der pointer auf den array uebergeben. Wenn jetzt der Inhalt
nicht stimmt, dann ist der Speicher wohl ueberschrieben worden oder der
avr-gcc hat ne Macke. Da ich noch nie nen Compiler-Fehler gefunden habe
(obwohl ich mehrfach 100% sicher war) wuerde ich mir gerne mal deinen
kompletten code ansehen.

von Dirk D. (dirkd)


Lesenswert?

> Wie kommst du darauf ?

Ohne Kaffe geht es wirklich nicht ;-)

Hast Recht, das Konstrukt im ersten Posting sollte funktionieren.

von Rolf Magnus (Gast)


Lesenswert?

Nebenbei erwähnt, ist

   void command_shell(char argc, char *argv[10][20])

äquivalent zu:

    void command_shell(char argc, char *argv[][20]);

und zu:

    void command_shell(char argc, char *(*argv)[20]);

von Karl heinz B. (kbucheg)


Lesenswert?

und wieder mal der allseits beliebte 'ich dimensioniere
meine Arrays so eng wie möglich, auch wenn ich mich dabei
verzähle und daher alles mögliche am Stack zerstöre' - Fehler:

  unsigned char pointer=0, counter=0, i=0, j=0, text[10];
  sprintf(text, "\n\rArgs: %i: ", argc); uart_print(text);

"\n\rArgs: %i: "
selbst wenn ich davon ausgehe, dass für %i nur eine einzelne
Ziffer eingesetzt wird, so wird der komplette String dadurch
12 Zeichen lang (11 sichtbare + der abschliessende '\0').
Wie das in einen char[10] passen soll, ist mir ein Rätsel.

von Thorsten (Gast)


Lesenswert?

Hi,

vielen Dank für die Antworten!

Im wesentlichen ist das der relevante Teil des Codes.
In einem Teil erzeuge ich den Eingabestring, bei Abschluss mit ENTER
wird dieser in Teilstrings zerlegt (command_sys) und soll dann an die
command_shell übergeben werden.

Da ich ungerne mit viel globalem zeugs arbeite, sondern idR. Module
programmiere, suche ich halt nach einer Lösung, das String-Array zu
übergeben.

Die Adresse scheint richtig anzukommen (4-stellige Zahl war in beiden
Funktionen gleich), aber ich komm einfach nciht an den Inhalt ran :-(


Greetz,
Th.



PS: Hab den Code nicht hier, wenn Interesse besteht setz ich ihn morgen
rein.

von Karl H. (kbuchegg)


Lesenswert?

Korrigiere erst mal den Array-Ueberlauf. Dadurch zerschiest
du dir hoechst wahrscheinlich einige lokale Variablen.

von Thorsten (Gast)


Lesenswert?

Hi Leutz,

das mit dem text[10] ist schon korrigiert, war mir auch aufgefallen.
Hab nu ein globales text[100] da passt genug rein ;-)

Die Shell läuft nu erst mal mit globalen argc, argv, da ich mich mit
nem Grafikdisp. rumschlagen muss ;-)

Greetz,
Th.

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.