mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rechnen mit int32, long,


Autor: Mark (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach da
 65535L
draus. Das L zwingt den Compiler die Zahl als
long anzusehen und daher die Multiplikation
ebenfalls als long Multiplikation auszuführen

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm.... habe mal was anderes gerechnet:

int32=Dezimalzahl;

Das Ergebniss:
2418083584=500000


aber wieso?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Falk (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int32_t Ergebnis;
int8_t Wert1;
int32_t Wert2;

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

Autor: Mark (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: Mark (Gast)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Herb (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab's mal durchdebuggt.
Mit dem cast geht's.

MfG

Autor: Herb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ooops das war ja die alte Version.

Sieht so aus, als ob es auch so geht.

Warum bei dir nicht?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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


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.