kombi verschiedner Formate für Variablen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • kombi verschiedner Formate für Variablen

      Hallo mal wieder,

      ich hatte immer wieder Probleme bei logischen Vergleichen oder Rechenoperationen unter Variablen mit unterschiedlichem Format.

      Diese Frage ist dahre als reines "Verständnisding" zu sehen für die Zukunft...

      Also:
      Z.B. dann, wenn ich eine Variable mit einer anderen logisch verglichen habe oder wenn ich damit rechnen wollte.
      So habe ich mal stundenlang ein einem Problem herumgesucht, bei dem eine Variable in einem Timer nicht hochzählte.
      Der Counter war ein einer logischen, simplen If-Then-Bedingung:

      ------------------
      Dim X as integer
      Dim Y as word
      .
      .
      .
      if X>=Y then
      incr Counter
      endif
      -----------------
      Der Counter blieb aber immer "0", bis ich X auch als Word oder Y als Integer deklarierte.

      Sowas hatte ich auch immer mal wieder, wenn ich verschiedene Formate miteinander verrechnen wollte, es kam nur Müll heraus.

      Ich weiß, dass ich in einem Word nur einen bestimmten Zahlenraum habe wie in jedem anderen Format auch.

      Aber warum ist es nicht möglich, z.B. in einem logischen Vergleich verschiedene Formate zu verwenden oder in einer Rechnung, die eigentlich logisch funktionieren müsste?
      Das will sich mir nicht erschließen...

      Ich weiß, dass das in absolute Grundlagen der Controller eingreift, aber ich kann das einfach nicht verstehen, warum das mal geht und mal nicht.
      Auch wenn man den Zahlenraum dabei beachtet hat.

      Gibt es irgendwo ein Regelwerk, welche Zahl man mit welcher vergleichen oder verrechnen kann oder eben was verboten ist?

      In der Hilfe sehe ich zwar überall die Zahlenräumen und so triviale Dinge wie dass man keine negative Zahl in ein Byte oder Word schreiben kann, aber warum diese mathmatisch
      eigentlich erlaubten Vorgänge hin und wieder nicht funktionieren, steht nirgendwo...

      Gruss
      Peer
    • Es steht schon irgendwo, dass man Berechnungen mit gleichen Variablentypen machen sollte. Heißt das 'casting'?
      Ich kenn deine Effekte auch, hab' auch schon mal lange gesucht. Ich glaube!, es stecken verschiedene Rechenwege hinter verschiedenen Datentypen. Wenn ich dir eine binäre Zahl zeige (2byte, zB &HFFFF), kannst du nicht erkennen, ob das eine negative Zahl ist (integer, -1), oder eine größere Zahl (word), die einfach bit15 zur Darstellung braucht.

      In der Hilfe steht unter 'language fundamentals':
      Casting
      In BASCOM-AVR when you perform operations on variables they all must be of the same data type.
      long = long1 * long2 ' for example
      The assigned variables data type determines what kind of math is performed.
      For example when you assign a long, long math will be used.
      If you try to store the result of a LONG into a byte, only the LSB of the LONG will be stored into the BYTE.
      Byte = LONG
      When LONG = 256 , it will not fit into a BYTE. The result will be 256 AND 255 = 0.
      Of course you are free to use different data types. The correct result is only guaranteed when you are using data types of the same kind or that result always can fit into the target data type.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Peer Gehrmann schrieb:

      bei dem eine Variable in einem Timer nicht hochzählte.
      Enable interrupt vergessen? Wenn X ein Integer und y ein Word ist, und beide null, dann ist die Bedingung erfüllt.

      Peer Gehrmann schrieb:

      aber warum diese mathmatisch
      eigentlich erlaubten Vorgänge hin und wieder nicht funktionieren, steht nirgendwo...
      Du musst uns dein Programm zeigen, dann können wir dir das erklären.

      Möglicherweise bist du mit deinem Word aus dem Zahlenraum des Integer gekommen?
      Beide sind nur als natürliche Zahlen bis 2^15-1 vergleichbar.
    • im Grunde ist es schnell erklärt:

      If Äpfel >= Birnen then

      die etwas längere Erklärung:
      Es ist nicht sinnvoll ungleiche Variablen miteinander zu vergleichen, da die Zahlenräume unterschiedlich sind und man dann ebeso überprüfen müsste, ob eine Vergleichbarkeit vorliegt.

      nehmen wir folgendes an:
      w word
      b byte

      word = 1000
      b = 250

      jetzt ein Vergleich

      if w = b

      was hier passiert ist folgendes: if byte(w) = b
      Daran kann man erkennen, dass das Ergebnis nicht zufriedenstellend sein wird.

      Schlimm wird es hier:
      word = 1255
      b = 255

      Hierbei ergibt if byte(w) = b tatsächlich TRUE


      um dies abzufangen müsste man zuerst folgendes machen:
      if W <= 255 then
      if w = b


      Also "einfach" irgend etwas vergleichen, kann in die Hose gehen :D
      Code first, think later - Natural programmer :D