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
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
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.
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.