www.mikrocontroller.net

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


Autor: Thorsten (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: Dirk Dörr (dirkd)
Datum:

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

Autor: The Daz (Gast)
Datum:

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

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kommst du darauf ?

Ohne Kaffe geht es wirklich nicht ;-)

Hast Recht, das Konstrukt im ersten Posting sollte funktionieren.

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Thorsten (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Thorsten (Gast)
Datum:

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

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.