Seltsames Verhalten bei der Wertzuweisung oder nur ein Denkfehler meinerseits

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Seltsames Verhalten bei der Wertzuweisung oder nur ein Denkfehler meinerseits

      Hallo

      Ich bin da heute auf was meiner Meinung nach seltsames gestoßen.

      Ich habe in der Vergangenheit schon öfters Wordvariablen den Inhalt von Bytevariablen zugewiesen und korrekte Ergebnisse erhalten.
      Heute war das aber anders.
      Vielleicht auch deshalb weil in konkreten Fall die Wordvariable mit dem Wert 65535 (also &HFFFF) belegt wurde und in der Folge dann durch eine Funktion die einen Bytewert zurück gibt in nur im Lowbyte verändert wurde.

      Bisher war ich eigentlich davon ausgegangen, dass bei einer derartigen Zuweisung die gesamte Variable betroffen ist.
      Nur erhalte ich im vorliegenden Fall als Ergebnis nicht &H0001 sondern &HFF01 (dezimal 65,281‬).
      Sprich das Highbyte der Wordvariable wird nicht beeinflusst.

      Ist das ein Fehler oder erwarte ich zuviel und das Verhalten ist schon immer so und es fiel mir nur nicht auf, weil die Variablen üblicherweise in einem Programmablauf eher mit dem Wert Null vorbelegt werden?

      BASCOM Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 11059200
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. $baud = 9600
      7. Config Submode = New
      8. Function ResultByte() As Byte
      9. ResultByte = 1
      10. End Function
      11. Dim W As Word
      12. W = 65535
      13. W = ResultByte()
      14. Print W
      15. End
      Display All
    • Wie ich inzwischen festgestellt habe ergibt
      Wordvariable = Bytevariable das korrekte Ergebnis aber
      Wordvariable = Bytefunktion verändert nur das Lowbyte der Wordvariable lässt aber dessen Highbyte in Ruhe.
      Das ist für mich aber ein eher unerwartetes Verhalten und ist mir bisher auch noch nicht aufgefallen.
      Dieses Verhalten kenne ich eigentlich auch nicht von anderen Programmiersprachen.
    • Ich würde sagen, das ist völlig korrekt so.

      Denn intern wird der Funktion beim Aufruf ein Pointer auf die Ergebnis-Variable, in deinem Fall Variable W (Word), übergeben.
      Deine Function soll genau 1 Byte zurück geben, so ist ja die Function definiert.
      Und das schreibt sie dann an den Pointer - und zwar genau 1 Byte.

      Da Variablen im Speicher im Format Lowbyte-Highbyte abgelegt sind, betrifft es nur das Lowbyte in der Variable W (Word).

      Würdest du W als Long definieren, würde nur das Byte im Low-Word und davon das LowByte verändert.
      Ganz kurios wird es bei Fließkomma-Variablen, falls da der Compiler nicht einschreitet.

      In der Regel sollte man die Ergebnisvariable genauso dimensionieren, wie das zu erwartende Ergebnis.
      In deinem Fall W as Byte

      oder in der Definition der Funktion als Rückgabewert Word festlegen.

      Nachtrag:

      Die direkte Zuweisung einer Byte-Variablen an eine Word-Variablen erkennt der Compiler als Typen-Konvertierung.
      Also wandelt er das Byte in ein Word und weist es zu. Daher werden beide Bytes beschrieben.

      So kann man auch ein Word-Wert einem Byte-Wert zuweisen. Allerdings nur, solange der Word-Wert im Wertebereich eines Bytes liegt.
      Darüber hinaus wird nur der LowByte Wert übernommen.

      The post was edited 1 time, last by Mitch64 ().