ich muss folgende Rechnung ausrechnen x = ( (0.....255) * (65535) ) + (0.....65535) In Zahlen int32 = ( (int) * (Zahlenwert) ) + (long) Bezeichnung warum erhalte ich für x nicht den richtigen Wert? Sind diese Bezeichnungen inkompatiebel? hat mir jemand eine Idee...?
mach da 65535L draus. Das L zwingt den Compiler die Zahl als long anzusehen und daher die Multiplikation ebenfalls als long Multiplikation auszuführen
hmm.... habe mal was anderes gerechnet: int32=Dezimalzahl; Das Ergebniss: 2418083584=500000 aber wieso?
> aber wieso?
Ohne dein genaues Programm zu sehen, wird dir wohl
keiner sagen können wo und wie du die C-Regeln verletzt
hast.
Aber ich geb mal eine Vermutung ab:
= ist eine Zuweisung
== ist ein Vergleich
if( a = b )
^
|
Das hier ist eine Zuweisung. a wird der Inhalt von
b zugewiesen und anschliessend wird geprüft, ob
das eine 0 war. Wenn nicht, gilt nach den C-Regeln
das Ergebnis der Zuweisung als wahr und der then-Teil
wird ausgeführt.
In C haben auch Zuweisungen ein Ergebnis! Nämlich die
Zahl, die zugewiesen wurde. Das ermöglicht Konstrukte
wie:
a = b = c = 5;
Ohne dein genaues Programm zu sehen, wird dir wohl keiner sagen können wo und wie du die C-Regeln verletzt hast. ist unwichtig. Es geht hier lediglich um eine zuweisung eines Dezimalwertes zu einem int32 Wert.
@Mark >>Ohne dein genaues Programm zu sehen, wird dir wohl >>keiner sagen können wo und wie du die C-Regeln verletzt >>hast. >ist unwichtig. Es geht hier lediglich um eine zuweisung eines >Dezimalwertes zu einem int32 Wert. Aber nicht in C, da gibt es mehr als genug Stolperfallen. Aber eine einfache Zuweisung ala long x; char a; long b; long c; sollte einfach als x = (a * b) + c; funktionieren. MfG Falk
Mark wrote: > Ohne dein genaues Programm zu sehen, wird dir wohl > keiner sagen können wo und wie du die C-Regeln verletzt > hast. > > ist unwichtig. Es geht hier lediglich um eine zuweisung eines > Dezimalwertes zu einem int32 Wert. Wenn du meinst. Du rufst wohl auch beim Arzt an und sagst: "Herr Doktor, was fehlt mir?" Aber mal eine ganz andere Frage: Woher weist du eigentlich, dass die Zuweisung nicht funktioniert?
1 | int32_t Ergebnis; |
2 | int8_t Wert1; |
3 | int32_t Wert2; |
4 | |
5 | Ergebnis = ((int32_t)Wert1 * 65535) + Wert2; |
Das sollte zumindest das richtige Ergebnis liefern. Ansonsten wird, wie von anderen schon angedeutet, jede Berechnung in 16-Bit durchgeführt, wenn keiner der Operanden größer als 16 Bit ist. Das Problem ist eben, dass bei der Multiplikation beide Werte <= 16 Bit sind... BTW: Bist Du sicher, dass Du mit genau 65535 multiplizieren willst und nicht mit 65536? Sieht mir nämlich fast so aus, als willst Du in den oberen 16 Bit den ersten Wert abspeichern und den zweiten dazuaddieren...
Ergebniss = (Timerüberlaufzähler) * Timerüberlaufwert(65535) + (das was im Timer ist 0.....65535) Aber mal eine ganz andere Frage: Woher weist du eigentlich, dass die Zuweisung nicht funktioniert? Der Doktor hats mir geflüstert.....
Du schnallst es nicht. Wir wollen dir alle helfen. Aber dazu musst du uns in die Lage versetzen das zu tun. Dazu gehört auch Information. Was glaubst du wie oft es vorkommt, dass jemand in einem Posting beschreibt was er getan hat und wenn man dann ins Programm schaut, hat er ganz was anderes gemacht oder irgendeine Nebenbedingung nicht bedacht. Die Frage: Woher weist du eigentlich .... hat einen Hintergrund. Es soll schon vorgekommen sein, dass jemand in seiner Berechnung nach Fehlern suchte und in Wirklichkeit war sein Ausgabecode fehlerhaft und die Berechnung völlig in Ordnung. Du kannst micht beleidigen und dich über mich lustig machen. Aber hinterher sitzt du immer noch mit demselben Problem da, dass DU nicht lösen kannst. Viel Spass beim Knobeln. (Das grossgeschriebene "DU" ist nicht als Schreien zu verstehen, sondern als "Anheben der Stimme, zwecks Betonung")
> warum erhalte ich für x nicht den richtigen Wert?
Da kann man nur Sagen:
Weil Du dem Compiler/Rechner (in einer ihm verständlichen Sprache) nicht
sagst, was Du haben willst.
Ich möchte mich entschuldigen für meine Aussage. Bin momentan im stress und finde neben der Arbeit nur wenig Zeit um mit dem Microcontroller weiter zu kommen. Ich werde meinen Code nochmals überprüfen und später poasten. mfg Mark
Ooops das war ja die alte Version. Sieht so aus, als ob es auch so geht. Warum bei dir nicht?
Herb wrote: > Ooops das war ja die alte Version. > > Sieht so aus, als ob es auch so geht. > > Warum bei dir nicht? Hab auf meiner jetzigen Maschine keinen Compiler. Tust du mir einen Gefallen? Mach mal a zu unsigned int und lass mal sehen was dann raus kommt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.