Guten Abend! Vor weg: Dies sind meine erste Geh-Versuche mit C - also seid bitte nachsichtig ;-) Irgentwie bekomme ich dauerthaft Probleme, die ich mir nicht erklären kann. Beim Compilieren des angehängten Codes gitb mir der Compiler folgendes aus: ---------- solarcontrol.c: In function `__vector_13': solarcontrol.c:72: warning: passing arg 1 of `strcat' discards qualifiers from p ointer target type solarcontrol.c:72: warning: passing arg 2 of `strcat' makes pointer from integer without a cast solarcontrol.c: In function `main': solarcontrol.c:96: warning: passing arg 1 of `strchr' discards qualifiers from p ointer target type solarcontrol.c:105: warning: passing arg 1 of `strchr' discards qualifiers from pointer target type ---------- Ich hab auch schon fleißig Google gefragt, finde aber keine funktionierende Lösung. Ehrlich gesagt: ich weiß auch nicht genau, was das Problem ist Danke, dass ihr meinen Post gelesen habt und mir vllt. gleich antworten werdet ;-) Grüße Jürgen Fitschen
Erste Warnung: strcat erwartet keinen "volatile"-Pointer. Macht nix. Zweite Warnung: strcat erwartet als zweites Argument einen Pointer auf einen nullterminierten String; Du übergibst statt dessen einen einzelnen char. Das geht in die Hose. Dritte Warnung: Auch strchr erwartet keinen "volatile"-Pointer. Macht wohl auch hier nix. Vierte Warnung: Wie dritte Warnung. Die typecasts bei Deinen strchr-Aufrufen sind unnötig; 3 und 13 sind bereits vom Typ int.
Jo, vielen Dank! klappt ... So - ich mag ja eigentlich nicht nochmal sonne blöde Frage stellen, aber ich hab weiter gearbeitet und schon wieder steh ich vor einer Mauer: nun Versuche ich das über den Usart Empfangende zu prasen: void tPraser(char cmdLine[]) { char *cmd[10]; char *tmp; char i; strcpy (tmp, cmdLine); while (strchr(tmp, " ")){ strncpy (tmp, cmd[i], strchr(tmp, " ")); tmp = strchr(tmp, " "); tPrint(cmd[i]); //Ausgabe zum Test i++; } cmd[i]=tmp; //tExec(); } Der Code scheint nicht so zu funktionieren, wie er soll, jedenfalls bekomm ich keine Rückgabe :-( Ich glaub mal ich hab da was mit den Zeigern durcheinander gebracht. Eigentlich hab ich das Zeigersystem soweit verstanden, aber die Beispiele bei Google warn mal so und mal so ... jedenfalls weiß ich nicht genau, ob die Funktionen wirklich die Daten haben wollen, oder die Adressen, wo die Daten gespeichert sind. Nochmals Danke, Jürgen Fitschen
> void tPraser(char cmdLine[]) > { > char *cmd[10]; > char *tmp; > char i; > > strcpy (tmp, cmdLine); Autsch. Du hast ein weit verbreitetes Verstaendnisproblem. Ein Pointer ist kein String. Frag Dich doch mal im obigen, wo denn die cmdLine hinkopiert wird? Die Antwort lautet: Irgendwohin, zufaellig. Da tmp keinen gültigen Pointerwert enthält, kann niemand sagen, wohin der strcpy die Zeichen kopiert. Was Du brauchst ist eine definierte Speicherfläche, auf der die Arbeiten kannst. Du brauchst Speicher, um dort Zeichen zu speichern. Und den musst Du reservieren. Ein Pointer für sich reserviert aber nichts. Ein Pointer kann auf so eine Speicherfläche zeigen, mehr aber nicht. void tPraser(char cmdLine[]) { char *cmd[10]; char tmp; char i; char Buffer[256]; tmp = Buffer; strcpy (tmp, cmdLine); So, jetzt zeigt tmp auf einen reservierten Speicherbereich (naemlich auf den Anfang von Buffer) und erst jetzt kann der strcpy gezielt irgendwohin (naemlich in Buffer) eine Kopie von cmdLine erzeugen. Selbiges mit all den cmd die da in weiterer Folge hast. cmd ist ein Array von 10 Pointern. Aber wo zeigen die hin? Wo ist der Speicher in dem tatsaechlich die Character stehen?
. void tPraser(char cmdLine[]) { char *cmd[10]; char tmp; char i; char Buffer[256]; tmp = Buffer; strcpy (tmp, cmdLine); So, jetzt zeigt tmp auf einen reservierten Speicherbereich (naemlich auf den Anfang von Buffer) und erst jetzt kann der strcpy gezielt irgendwohin (naemlich in Buffer) eine Kopie von cmdLine erzeugen. Das stimmt nur dann, wenn aus der Zeile char tmp; wieder die richtige Schreibweise char* tmp; gemacht wird, sonst "zeigt" tmp garnirgendwohin, sondern ist ein einzelner char.
Danke fuer die Korrektur. Urspruenglich wollte ich aus dem tmp direkt das Array machen, hab dann allerdings gemerkt das tmp im weiteren Code ebenfalls vorkommt. Also die Array-Aenderung an tmp wieder rueckgängig und dabei ist der '*' auf der Strecke geblieben :-)
> strchr(tmp, " ")
Auch flasch. Auf der rechten Seite muss ein char stehen, kein
char *:
strchr(tmp, ' ')
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.