Fehler bei 2-dim Arrays

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

    • Fehler bei 2-dim Arrays

      Hallo zusammen,
      ich bin gerade über ein Problem gestolpert, was für mich nach einem Compiler Fehler aussieht.
      Normalerweise kann ich doch sowas machen:
      var = Not var
      Bei 1-dim Arrays geht das auch
      arr(var) = not arr(var)
      Bei 2-dim Arrays gibt der mir aber den 2. Index negiert zurück:
      arr(var1,var2) = Not arr(var1,var2) => Not var2
      Ich nutze gerade Bascom 2.0.8.2.
      Könnte mal jemand checken, ob das in der neuesten 2.0.8.3 auch so ist?
      Danke schon einmal.
    • Hallo Michael,
      hier ein kleines Beispielprogramm:

      BASCOM Source Code

      1. Dim Arr(3 , 3) As Byte
      2. Dim Col_index As Byte
      3. Dim Row_index As Byte
      4. Col_index = 2
      5. Row_index = 2
      6. Arr(col_index , Row_index) = 128
      7. Print Arr(col_index , Row_index)
      8. Arr(col_index , Row_index) = Not Arr(col_index , Row_index)
      9. Print Arr(col_index , Row_index)
    • Ja klar, und dieser Zelle weise ich einen neuen Wert zu, der sich aus der Negation des Inhalts ergibt.
      Und genau das wird nicht gemacht. Meinst du nicht, das dort 127 (Not 128) stehen müsste und nicht 253 (not row_index)?
      Aber egal, ich schreibe mal an MCS, vielleicht ist es in der aktuellsten Version behoben.
    • Ich kann den Fehler nachvollziehen mit der Version 2.0.8.3.

      Ist mit folgendem Programm belegbar:

      BASCOM Source Code

      1. $Regfile = "m8def.dat"
      2. $HWStack = 20
      3. $SWStack = 60
      4. $Framesize = 60
      5. $Crystal = 8000000
      6. $Baud = 9600
      7. Dim Arr(3 , 3) As Byte
      8. Dim Col_index As Byte
      9. Dim Row_index As Byte
      10. Col_index = 2
      11. Row_index = 2
      12. Arr(col_index , Row_index) = 128
      13. Print Arr(col_index , Row_index)
      14. Arr(col_index , Row_index) = Not Arr(col_index , Row_index)
      15. Print Arr(col_index , Row_index)
      16. Print "Herauskommen müsste:"
      17. Col_Index = 128
      18. Print Col_Index
      19. Col_Index = Not Col_Index
      20. Print Col_Index
      21. End
      Display All
      Genau, wende dich damit an MCS-Support!
    • Allerdings funktioniert es über einen kleinen Umweg

      BASCOM Source Code

      1. $Regfile = "m8def.dat"
      2. $HWStack = 20
      3. $SWStack = 60
      4. $Framesize = 60
      5. $crystal = 16000000
      6. $Baud = 9600
      7. Dim Arr(3 , 3) As Byte
      8. Dim Col_index As Byte
      9. Dim Row_index As Byte
      10. Dim Tempbyte As Byte
      11. Col_index = 2
      12. Row_index = 2
      13. Arr(col_index , Row_index) = 128
      14. Tempbyte = Arr(col_index , Row_index)
      15. Print Arr(col_index , Row_index)
      16. Tempbyte = Arr(col_index , Row_index)
      17. Tempbyte = Not Tempbyte
      18. Arr(col_index , Row_index) = Tempbyte
      19. Print Arr(col_index , Row_index)
      20. Print "Herauskommen müsste:"
      21. Col_Index = 128
      22. Print Col_Index
      23. Col_Index = Not Col_Index
      24. Print Col_Index
      25. End
      Display All
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hier noch ein paar weitere Compiler Fehler bzw. Dinge, die der Compiler übersieht:

      BASCOM Source Code

      1. $regfile = "m1284pdef.dat"
      2. $crystal = 20000000
      3. $hwstack = 200
      4. $swstack = 200
      5. $framesize = 300
      6. Declare Sub Init_code(this_array() As Word)
      7. Dim My_array(4) As Word
      8. Dim My_word As Word
      9. My_word.31 = 1
      10. My_array(1).31 = 1
      11. My_array(2).48 = 1
      12. My_array(1)8 = 1
      13. Init_code My_array(1)
      14. Do
      15. Loop
      16. End
      17. Sub Init_code(this_array() As Word)
      18. Local I As Byte
      19. For I = 0 To 15
      20. This_array(1).i = 1
      21. Print This_array(1) 'print korrekten Wert
      22. This_array(1) = 0
      23. Next I
      24. This_array(1).0 = 1
      25. Print This_array(1) 'prints 1, korrekt
      26. This_array(1) = 0
      27. This_array(1).8 = 1
      28. Print This_array(1) 'prints 1, falsch
      29. This_array(1) = 0
      30. This_array(1).9 = 1
      31. Print This_array(1) 'prints 2, falsch
      32. End Sub
      Display All


      Während Zeile 11 einen Fehler (Bit index out of range) erzeugt, wird Zeile 12 compiliert.
      Gesetzt wird dabei My_array(2).15, so als wären alle Bits hintereinander.
      Kann ich verstehen, würde ich aber einen Hinweis erwarten.
      Zeile 13 erzeugt dann wieder einen Fehler, obwohl dieses Bit ja noch im Array liegt.
      Zeile 15 erzeugt keinen Fehler und hat mich eine Stunde gekostet, den fehlenden „.“ zu finden.
      Die Bitnummer wird dann komplett ignoriert. Anstelle der „8“ kann irgendetwas stehen, was einfach ignoriert wird.
      Allerdings gibt der Code Explorer in 2.0.8.2 einen Fehler aus, in 2.0.8.3 nicht.
      Aber das kann daran liegen, dass ich 2.0.8.3 gerade erst installiert habe und vielleicht das nötige Häkchen noch nicht gefunden/gesetzt habe.
      In der Sub funktioniert das Setzen der Bits im Word Array, wenn ich für das Bit eine Variable verwende.
      Mit Konstanten leider nicht, wenn die Bitnummer >7 ist. Dann wird immer Bit 0-7 gesetzt, also bei 8 das Bit 0, bei 9 das Bit 1 usw.
      Werde ich wieder an MCS geben.