Forum: Compiler & IDEs zu dumm Daten in einem String abzulegen?!?


von Christian (Gast)


Lesenswert?

Hallo,

ich hab' mich bereits recht lange selber mit dem Problem beschäftigt, 
aber da mir in naher Zukunft keine Lösung zu kommen scheint frag' ich 
doch mal lieber euch - ich denke das Problem ist eigentlich echt simple 
zu lösen - ich seh's oder weiß es bloß mal wieder nicht:

warum ist

kompass = (0x01*256 + 0x91)/2;
__________________________________________
nicht gleich :

uart_rxbuf[1] = 0x01;
uart_rxbuf[2] = 0x91;

kompass = (uart_rxbuf[ 1 ]*256 + uart_rxbuf[ 2 ])/2;

????
Es geht ja nur um die Zahlen - die Formel ist wurscht.
Ziel ist es einen elektronischen Kompass auszulesen (2xcm-1 oder so 
heißt der)

Vielen Dank für eure Unterstützung!!!

Christian

von Schmittchen (Gast)


Lesenswert?

Ist die Variable Kompass oben evtl. von einem anderen Datentyp als 
Kompass unten? (16bit vs. 8bit)?
Ich kann mir da nur was mit Überlauf vorstellen...

>warum ist
[...]
>nicht gleich :
sollte eigentlich gleichwertig sein.
Was funktioniert denn nicht?

Schmittchen.

von Christian (Gast)


Lesenswert?

Hallo Schmittchen,

Danke sehr für deine Antwort!!!!
Die Variablen sind beide gleich!!! Bei mgl. 1 kommt 200 aus dem Display 
raus, bei Mgl. 2 kommt 72 raus - Mgl. 1 stimmt - 2 nicht. Es ist in der 
exakt selben Funktion - ich nehm entweder die eine Zeile raus und 
ersetze sie durch die Variablen, die ich zuvor auf den selben Wert setze 
- und schon kommt was anderes raus!!!! Gibts vielleicht eine andere 
Möglichkeit aus einem UART String die richtigen Zahlen rauszuholen????

Vielen Dank

Christian

PS: vielleicht hab' ich ja den String falsch initialisiert:

char uart_rxbuf[4];
unsigned char uart_rx_pos;

-ist das korrekt????

von Schmittchen (Gast)


Lesenswert?

Das muß aber doch ein Problem mit einem Überlauf sein!

> unsigned char uart_rx_pos;
was ist das? Hat aber wahrscheinlich nix mit deinem Problem zu tun.

Ich vermute folgendes:
>kompass = (uart_rxbuf[ 1 ]*256 + uart_rxbuf[ 2 ])/2;
der erste Rechenschritt lautet uart_rxbuf[1]*256, das Ergebnis wird 
evtl./wahrscheinlich/vielleicht im Register zwischengespeichert, in dem 
vorher uart_rxbuf[1] gespeichert war?!?! Das würde überlaufen und wäre 
danach 0. Dann + 0x91. Dann geteilt durch 2 ergäbe die 72(dez).

Im anderen Fall macht der Compiler daraus wahrscheinlich was anderes.

Ich kann deine verzweifelte Sucherei gut nachvollziehen.

Schmittchen.

von Schmittchen (Gast)


Lesenswert?

Ich habe doch gewußt, daß ich noch was vergessen habe (wurde gestört).

Also: Was dagegen tun?
Ich würde es mal mit einem Cast auf eine 16Bitvariable versuchen.

kompass = ( unsigned int(uart_rxbuf[1]*256) + uart_rxbuf[2] ) /2;

wenn alles fehlschlägt noch einen Cast auf die gesamte Summe. Das sollte 
dann aber reichen.

Schmittchen.

von Christian (Gast)


Lesenswert?

Hallo,

es funktioniert leider immer noch nicht. Wenn der Wert tatsächlich in 
der Variable abgespeichert wird wär das doch tierisch blöd, weil ich ja 
mit dem Variableninhalt nochmal rechnen möchte und die nicht plötzlich 
nen anderen Wert haben soll!!!
Das mit deinem Cast hab' ich vermutlich missverstanden - bzw. hats der 
Compiler missverstanden und ich hab' das folgendermaßen unelegant 
gelöst:

unsigned int variable;
unsigned int variable2;
uart_rxbuf[1] = 0x01;
uart_rxbuf[2] = 0x91;
kompass = ( variable2 = (variable = uart_rxbuf[1]*256) + 
uart_rxbuf[2])/2;

es kommt dabei immer noch 72 raus.

"> unsigned char uart_rx_pos;
was ist das? Hat aber wahrscheinlich nix mit deinem Problem zu tun." - 
nein hat nix damit zu tun.

Der Compiler gibt mir aber auch keinen Warnmeldungen mit möglichem 
Überlauf oder sowas aus - bin echt am Verzweifeln....


Viele Grüße

Christian

von Christian (Gast)


Lesenswert?

Hurra - Problem gelöst!!!!!!!

ich Trottel hab' char uart_rxbuf[4]; statt
unsigned char uart_rxbuf[4]; geschrieben - ich weiß zwar nicht warums 
nicht als char ohne unsigend funktioniert, möchte mich aber trotzdem 
nochmal für deine Ideen und Tips bedanken!!!


Christian

von Jonas Diemer (Gast)


Lesenswert?

na, ohne unsigned geht der char von -127 bis 128 (wenn ich nicht irre). 
und der läuft dann natürlich eher über...

von Schmittchen (Gast)


Lesenswert?

> Wenn der Wert tatsächlich in der Variable abgespeichert wird wär das doch 
tierisch blöd

Ich hatte mir das nur so gedacht. Wär ja möglich gewesen, daß der 
Compiler die Variable aus dem SRAM in ein Register zieht, um dann mit 
dem Register die Berechnungen durchzuführen. Die Originalvariable im 
SRAM bliebe davon unbeeindruckt. War nur ein Versuch das seltsame 
Verhalten zu ergründen. Zum Glück macht der Compiler das ja jetzt dank 
konkreter Angaben (unsigned...) richtig.

Schmittchen.

von Jonas Diemer (Gast)


Lesenswert?

naja, aber über register brauchst du dir in ner hochsprache eigentlich 
keine sorgen zu machen, es sei denn du bettest asm ein oder debuggst den 
compiler...

von Christian (Gast)


Lesenswert?

Hallo zusammen,

@ schmittchen: Tschuldigung, dass ich meine Meinung über deine Idee 
weiter oben so negativ dargestellt habe - war wirklich nicht meine 
Absicht!!!!!! Bei einem 2. durchlesen hatte mein Posting auch auf mich 
eine ziemlich beleidigende Wirkung - war nicht so gedacht!!!

Vielen Dank allen nochmals!!

Christian

von Schmittchen (Gast)


Lesenswert?

> Tschuldigung, dass ich [...] deine Idee weiter oben so negativ dargestellt habe

Hoppla, hab ich garnicht bemerkt/so empfunden.

Es muß nicht jeder Thread mit einem "Danke", "Super" usw. enden, sondern 
es wäre schön, wenn der Fragesteller am Ende des Threads seine/die 
Lösung bzw. die Art des Umsetztens hier kurz rückmelden würde. Das 
möchte ich nur ganz allgemein erwähnen. Du hast das ja zwischendrin 
schon gemacht.
Manchmal tauchen auch Fragen auf, die von keinem beantwortet werden 
(können), der Fragesteller die Lösung alleine findet und diese dann 
anschließend hier auch noch postet. Klingt dann zwar manchmal nach 
Monolog, hilft aber weiter, wenn jemand in der gleichen Situation 
steckt.

Schmittchen. "Vielen Dank für Ihre Aufmerksamkeit :-)"

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.