Forum: PC-Programmierung C Programmierung


von Marko (Gast)


Lesenswert?

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

von Danish B. (danishbelal)


Lesenswert?

Ich glaube du suchst:
x-'0'

von Hinz (Gast)


Lesenswert?

Such mal nach atoi

von Markus H. (haniham) Benutzerseite


Lesenswert?

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ß

von Little B. (lil-b)


Lesenswert?

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.
von Marko (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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

von M. K. (kichi)


Lesenswert?

Klar ergibt die Addition die Summe. Aber du hast ja unterschiedliche 
Wertigkeiten: Einer, Zehner, Hunderter, ...

von Marko (Gast)


Lesenswert?

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

von Marko (Gast)


Lesenswert?

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

von Marko (Gast)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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

von Little B. (lil-b)


Lesenswert?

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
von Marko (Gast)


Lesenswert?

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

von Roland F. (rhf)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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.

von Marko (Gast)


Lesenswert?

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

von Roland F. (rhf)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

Was steht denn anstelle des blablabla

Du kannst vorher die Position der ersten Ziffer suchen.

Du kannst auch scanf (mit dem richtigen Formatstring) benutzen.

von Markus H. (haniham) Benutzerseite


Lesenswert?

wenn du vielleicht das drumhrum erzählst können wir dir auch dort helfen

von dddd (Gast)


Lesenswert?

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

von mec (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.