Hallo,
ich habe ein kleines Problem beim Auswerten eines Strings.
Der String sieht folgendermaßen aus: 1.f.0.0.0.1.$
Diesen String möchte ich gern mit folgendem Code auswerten und die
einzelnen Zahlenwerte in ein Array schreiben:
1
longeingang[10];
2
char*ptr;
3
chardelimiter[]=".";
4
5
ptr=strtok(empfang,delimiter);
6
for(x=0;x<=6;x++){
7
eingang[x]=strtol(ptr,NULL,16);
8
ptr=strtok(NULL,delimiter);
9
}
Die einzelnen Teilstücke die durch strtok erzeugt werden funktionieren
soweit einwandfrei, doch die Umwandlung mit strtol funktioniert leider
nicht und ich weiß nicht warum. Kann mir jemand von euch vielleicht
weiterhelfen?
Hi
warum machst du das nicht wie in dem Beispiel hier:
http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/
Du kannst dir dann das strtok() sparen. Eventuell noch pEnd++ um den "."
zu überspringen.
Ansonstn kann ich noch die Funktion atol() empfehlen, die erstellt dir
auch einen long aus einem String.
Thomas
Stefan schrieb:> Danke für die schnelle Antwort ich habe es gleich mal ausprobiert doch> leider ist eingang immer 0.> Hier mal mein geänderter Code:>>
1
>eingang[0]=strtol(empfang,&pEnd,16);
2
>
hier fehlt das anschliessende pEnd++ um den darauffolgenden '.' zu
überspringen. Die nachfolgenden strtol verweigern daher alle, weil sie
mit einem '.' nichts anfangen können.
>
1
>for(x=1;x<=6;x++){
2
>
Wenn ich ein <= in der Abbruchbedingung einer for-Schleife sehe,
klingeln bei mir alle Alarmglocken.
Diese Schleife wird 7 mal durchlaufen. Du hast aber in deinem String nur
6 Zahlen. Der letzte Bestandteil deines Strings "1.f.0.0.0.1.$" ist ein
$ und das ist keine Zahl mehr.
Ich hab den Code auf deine Einwände geändert doch leider funktioniert er
immer noch nicht, ich weiß nicht woran es noch liegen kann. Hier nochmal
der aktuelle Code:
Stefan schrieb:> Ich hab den Code auf deine Einwände geändert doch leider funktioniert er> immer noch nicht, ich weiß nicht woran es noch liegen kann.
Hast du dein PRINT kontrolliert?
Du musst das 'funktioniert nicht' an anderer Stelle suchen, der
Codeausschnitt an sich ist jetzt ok.
(Auch wenn du das for falsch rum geändert hast. Schreibs als x < 6 und
nicht als x <= 5. Kommt hier aufs selbe raus, d.h. das ist jetzt nicht
das Problem)
Übrigens: Dein Originalcode war ebenfalls ok.
Wo kommt "empfang" her?
Karl heinz Buchegger schrieb:> Hast du dein PRINT kontrolliert?
Ich weiß nicht wo da der Fehler liegen sollte.
Karl heinz Buchegger schrieb:> Wo kommt "empfang" her?
empfang kommt aus der Interruptroutine vom UART
Hier der Code dazu:
1
empfang[count]=data;
2
count++;
3
if(data=='$'){
4
empfang[count]='\0';
5
count=0;
6
new_ms=1;
7
}
Wenn ich mir in der Schleife die Einzelnen Teile von pEnd ausgeben
lassen sehe ich auch das dies alles wunderbar funktioniert doch in der
eingang-variable ist leider nur 0.
Datentypen.
Zeig doch endlich mal ein wenig mehr!
Wenn ich mir deine Codeschnipsel in ein Testprogramm meiner Wahl
vervollständige, funktioniert alles so wie es soll.
>Zeig doch endlich mal ein wenig mehr!
Machen wir es doch mal auf die altbewährte Tour:
@Stefan
Zeig deinen kompletten Code oder mach dich vom Acker!
Die Hellseher sind im Urlaub.
sebastians schrieb:>> Diese Schleife wird 7 mal durchlaufen.> Stimmt nicht. sie geht von 1 bis 6, nicht von 0 bis 6. Also wird sie 6> mal durchlaufen.
Richtig
Und zusammen mit dem ersten Extrahieren ausserhalb der Schleife sind es
7 Aufrufe von strtol, was trotzdem immer noch falsch ist.
Da hast du natürlich recht das die Schleife einmal zu oft durchlaufen
wird, dies habe ich geändert doch mein Problem das nur 0 in der variable
eingang ist, bleibt weiterhin bestehen und ich weiß nicht warum.
Stefan schrieb:> Da hast du natürlich recht das die Schleife einmal zu oft durchlaufen> wird, dies habe ich geändert doch mein Problem das nur 0 in der variable> eingang ist, bleibt weiterhin bestehen und ich weiß nicht warum.
Mach mal deinen String konstant.
Du ´zeigst nicht, wo der String herkommt, auch da könnte noch was sein.
Wenn im String noch irgendwelche Leerzeichen oder so rumlungern, dann
sieht man die manchmal bei Kontrollausdrucken nur schwer.
Karl heinz Buchegger schrieb:> Mach mal deinen String konstant.
Hab ich gemacht leider gleiches Ergebniss wie vorher. Im Array sind
leider nach wievor nur Nullen.
Karl heinz Buchegger schrieb:> Du ´zeigst nicht, wo der String herkommt, auch da könnte noch was sein.
Hier mal der Code vom UART-Interrupt wo der String gebildet wird: