Hallo Liebe µC-Gemeinde, ich programmiere gerade einen MSP430G2553 und natürliche vertiefe ich meine C-Kenntnisse. Ich hänge bei der Programmierung an einem Problem und zwar: Ich möchte zwei Zahlen aus einem Array kopieren und dies in einem Integer eingebe. als Beispiel: unsigned char data[20]={blablabla15blabla}; volatile int x; wenn ich so schreibe: x= data[9]; bekomme ich der Wert x=49 (Zahl 1 in ASCII-code), ich muss das vor dem Kopieren umwandeln. Aber die Frage ist: Wie kann ich die 15 kopieren und dies den x übergebe? Vielen Dank im Voraus Marko
x = (data[9]-'0')*10 +(data[10]-'0') oder wenn du mal mehr unterschiedliche Zeichenlängen hast bspw. x = atoi(&data[9]) Ich hoffe bloß atoi ist nicht verwirrt, wenn die zahlen nicht mit /0 sondern mit textzeichen beendet werden. Gruß
Was auch immer du tun willst, mit deinem gezeigten Code klappt das nicht. MinGW gcc kann das nicht kompilieren: unsigned char data[20]={blablabla15blabla}; Vieleicht solltest du dein Konzept von Arrays überdenken? Vieleicht so: unsigned char data[20]="blablabla15blabla"; oder so: unsigned char data[20]={ 'b', 'l', 'a', 'b', 'l', 'a', 'b', 'l', 'a', 15, 'b', 'l', 'a', 'b', 'l', 'a'}; Im ersten Fall brauchst du atoi(), wie schon erwähnt. Im zweiten Fall klappt dein Code: x= data[9]; ~LilB
:
Bearbeitet durch User
Beitrag #5020244 wurde vom Autor gelöscht.
Markus H. schrieb: > x = (data[9]-'0')*10 +(data[10]-'0') wieso multiplizierst du mit 10? das verstehe ich nicht. Ergibt die Addition nicht die Summe beider Zahlen? danke dir Markus Marko
Marko schrieb: > wieso multiplizierst du mit 10? das verstehe ich nicht. > Ergibt die Addition nicht die Summe beider Zahlen? du willst doch aber nicht die summe oder? 1 + 5 = 6 1 * 10 + 5 = 15
Klar ergibt die Addition die Summe. Aber du hast ja unterschiedliche Wertigkeiten: Einer, Zehner, Hunderter, ...
Little B. schrieb: > Vieleicht solltest du dein Konzept von Arrays überdenken? > > Vieleicht so: > unsigned char data[20]="blablabla15blabla"; > > oder so: > unsigned char data[20]={ > 'b', 'l', 'a', 'b', 'l', 'a', 'b', 'l', 'a', 15, 'b', 'l', 'a', 'b', > 'l', 'a'}; > > Im ersten Fall brauchst du atoi(), wie schon erwähnt. Danke dir Little B. Ich kann das leider nicht ändern. mein data[] empfängt Daten von RX-Buffer des µC(UART), danach müssen ausgewertet werden. und so sieht es aus. data[20]={ 'b', 'l', 'a', 'b', 'l', 'a', 'b', 'l', 'a', '1','5', 'b', 'l', 'a', 'b','l', 'a'}; die 15 ist ein Stellwert für einen Motor. Daher verstehe ich nicht ganz, wie ich die 15 kopiere und dann an meinem Motor weitergebe. Danke für deine Antwort nochmal Marko
Peter II schrieb: > du willst doch aber nicht die summe oder? > > 1 + 5 = 6 > 1 * 10 + 5 = 15 Das stimmt, und ist mir das nicht eingefallen :) Vielen Dank Marko
Michael K. schrieb: > Klar ergibt die Addition die Summe. Aber du hast ja unterschiedliche > Wertigkeiten: Einer, Zehner, Hunderter, ... Dankeschön, das verstehe ich jetzt. Marko
Markus H. schrieb: > Ich hoffe bloß atoi ist nicht verwirrt, wenn die zahlen nicht mit /0 > sondern mit textzeichen beendet werden. atoi hört dann auf, wenn keine gültige Ziffer mehr kommt. ((strtol und scanf mit %d %i auch) Marko schrieb: > die 15 ist ein Stellwert für einen Motor. Daher verstehe ich nicht ganz, > wie ich die 15 kopiere und dann an meinem Motor weitergebe. Du musst da mal zwischen Zeichen und Wert unterscheiden. In dem String stehen Zeichen, die einen Zahlenwert in Dezimalnotation darstellen. Weitergeben möchtest du aber den Zahlenwert. Darum reicht kopieren nicht, du musst umwandeln. Von ASCII nach Integer: atoi
Marko schrieb: > Ich kann das leider nicht ändern. mein data[] empfängt Daten von > RX-Buffer des µC(UART), danach müssen ausgewertet werden. > und so sieht es aus. > > data[20]={ 'b', 'l', 'a', 'b', 'l', 'a', 'b', 'l', 'a', '1','5', 'b', > 'l', 'a', 'b','l', 'a'}; > > die 15 ist ein Stellwert für einen Motor. Daher verstehe ich nicht ganz, > wie ich die 15 kopiere und dann an meinem Motor weitergebe. Wenn dein Stellwert für den Motor IMMER an Position 9 und 10 im Array liegt, dann so: Markus H. schrieb: > x = (data[9]-'0')*10 +(data[10]-'0') > > oder wenn du mal mehr unterschiedliche Zeichenlängen hast bspw. > x = atoi(&data[9]) Sollte sich die Position des Stellwertes ändern, dann musst du Wissen über das Protokoll haben.
:
Bearbeitet durch User
Little B. schrieb: > Markus H. schrieb: >> x = (data[9]-'0')*10 +(data[10]-'0') >> >> oder wenn du mal mehr unterschiedliche Zeichenlängen hast bspw. >> x = atoi(&data[9]) könnte mir bitte Jemand sagen, warum man den '0' abziehen muss? was bedeutet das? Danke im Voraus Marko
Hallo, > könnte mir bitte Jemand sagen, warum man den '0' abziehen muss? was > bedeutet das? Die Ziffer 0 entspricht in der ASCCI-Tabelle dem Wert 48(dez). Nehmen wir an das data[9] das Zeichen für die Ziffer 5 steht. Das entspricht im ASCII-Code dem Wert 53. Ziehst du nun von diesen 53 die 48 (für die Ziffer 0) ab, ergibt sich der Wert 5. rhf
Roland F. schrieb: > Hallo, > >> könnte mir bitte Jemand sagen, warum man den '0' abziehen muss? was >> bedeutet das? > > Die Ziffer 0 entspricht in der ASCCI-Tabelle dem Wert 48(dez). Nehmen > wir an das data[9] das Zeichen für die Ziffer 5 steht. Das entspricht im > ASCII-Code dem Wert 53. Ziehst du nun von diesen 53 die 48 (für die > Ziffer 0) ab, ergibt sich der Wert 5. > > rhf Der C-Standard garantiert, dass die Zifferzeichen direkt aufeinander folgen. (damit dies so gemacht werden kann) Ein Zeichen ist in C auch nur ein Ganzzahlwert. Die '0' ist aber leichter zu lesen und auch noch richtig, wenn mal kein ASCII benutzt wird.
Little B. schrieb: > Sollte sich die Position des Stellwertes ändern, dann musst du Wissen > über das Protokoll haben. Ich habe gerade festgestellt, dasss mein Stellwert die Positon ändert! was meinst du mit dem Protokoll? Gruß und danke
Hallo,
> was meinst du mit dem Protokoll?
Das Protokoll beschreibt den Aufbau des Datensatzes und damit auch die
möglichen Positionen des Stellwertes innerhalb dieses Datensatzes.
rhf
Was steht denn anstelle des blablabla Du kannst vorher die Position der ersten Ziffer suchen. Du kannst auch scanf (mit dem richtigen Formatstring) benutzen.
Vorsicht bei atoi(), hier ist es unmöglich falsche Formate zu erkennen. Wenn nicht sicher ist, dass das Format stimmt, sollte strtol(), strtoll(), strtoul() oder strtoull() verwendet werden und die möglichen Fehler geprüft werden (errno, Pointeraddressen, ...).
wie wär das: mit regex Prüfen, das was ankommt auch das ist, was man will, und dann damit die Zahl aus dem String extrahieren und dann mit atoi umwandeln.
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.