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.
pointer werden mit * uebergeben void command_shell(char argc, char *argv[10][20])
> 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
;-)
"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.
> Wie kommst du darauf ?
Ohne Kaffe geht es wirklich nicht ;-)
Hast Recht, das Konstrukt im ersten Posting sollte funktionieren.
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]);
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.
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.
Korrigiere erst mal den Array-Ueberlauf. Dadurch zerschiest du dir hoechst wahrscheinlich einige lokale Variablen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.