mikrocontroller.net

Forum: PC-Programmierung C Programmierung


Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Danish B. (danishbelal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube du suchst:
x-'0'

Autor: Hinz (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Such mal nach atoi

Autor: Markus H. (haniham) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Little B. (lil-b)
Datum:

Bewertung
1 lesenswert
nicht 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.
Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter II (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Michael K. (kichi)
Datum:

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

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Little B. (lil-b)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland F. (rhf)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland F. (rhf)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus H. (haniham) Benutzerseite
Datum:

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

Autor: dddd (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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, ...).

Autor: mec (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.