C Programmierung

Gast #5020230
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
#5020243
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
Beitrag #5020244 wurde von einem Moderator gelöscht.
Gast #5020293
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
#5020302
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
#5020324
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.
#5020691
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
#5020735
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.
Gast #5035346
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, ...).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren