Debugger und Dim mit mehr als 2^31 Elementen

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Debugger und Dim mit mehr als 2^31 Elementen

Beitrag von NicTheQuick »

Hallo Leute,

könnt ihr folgendes Phänomen unter PB x64 bestätigen?

Code: Alles auswählen

Structure bah
EndStructure

Macro SIZE
	1 << 62 - 2
EndMacro

s = SIZE
Dim pfui.bah(SIZE)

Debug ArraySize(pfui())
Debug size
Debug SIZE
Ich kriege hier folgende Ausgabe:
4611686018427387901
4611686018427387902
4611686018427387902
Das heißt ArraySize() gibt mir ein Element weniger aus als ich definiert habe.

Dass das normalerweise anders ist, sieht man, wenn man in dem Macro einfach eine "10" oder sowas rein schreibt.

Das ist aber noch nicht das Kuriose. Schreibt man nämlich in das Macro "1 << 31", meckert der Debugger bei dem Dim, dass die Array-Größe nicht negativ sein darf. Schreibt man hingegen "1 << 31 - x" mit x > 1 funktioniert es wieder. Wenn man x = 1 setzt, geht es aber nicht. Selbst wenn "1 << 31 - 1" auf ein Long gecastet wird, ist der Wert nämlich positiv, was man hier sieht:

Code: Alles auswählen

l.l = 1 << 31
Debug l ;negativ
l - 1
Debug l ;positiv
Noch verrückteres geschieht dann bei noch höheren Werten wie "1 << 62 - x". Ist das x hier gleich 2, dann funktioniert es, andernfalls anscheinend nicht. Ich hab nicht alle Werte durchgetestet. :wink:

Das war nicht alles. Jetzt schreiben wir den Code oben um, indem wir die letzten beiden Debug-Zeilen vor das Dim schieben:

Code: Alles auswählen

Structure bah
EndStructure

Macro SIZE
	1 << 62 - 2
EndMacro

s = SIZE
Debug size
Debug SIZE
Dim pfui.bah(SIZE)

Debug ArraySize(pfui())
Jetzt geht auch das mit dem "1 << 62 - 2" nicht mehr.

Für mich sieht das ganz nach einem fehlerhaften Check im Debugger aus. Aber vielleicht möchte das noch jemand für mich unter x86 Linux und Windows testen. Dann müsste man allerdings der Variablen "s" den Typ Quad zuordnen.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Debugger und Dim mit mehr als 2^31 Elementen

Beitrag von cxAlex »

Verhält sich bei mir gleich. Könnte ein Bug sein, im englischen Forum hab ich jetzt schon 2,3 Bugs gesehen die mit Operatoren zu tun hatten und ob man Sie mit Variablen oder Zahlen parametrisiert, da wurde wohl etwas gröber verpfuscht in den letzten Updates.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Debugger und Dim mit mehr als 2^31 Elementen

Beitrag von mk-soft »

Fehler bei Dim. Kann da nicht rechnen

Hier mit IMA

Code: Alles auswählen

Structure bah
EndStructure

Macro SIZE
   1 << 62 - 2
EndMacro

s = SIZE
Dim pfui.bah(1 << 62 - 1)

Debug ArraySize(pfui())
Debug s
Debug SIZE
Das hier ist richtig da das Überlaufbit nicht ausgewertet wird

Code: Alles auswählen

l.l = 1 << 31
Debug l ;negativ - Größter negativer wert
l - 1 
Debug l ;positiv - Größter negativer Wert - 1 ergibt größten positiven Wert
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Debugger und Dim mit mehr als 2^31 Elementen

Beitrag von NicTheQuick »

mk-soft hat geschrieben:Das hier ist richtig da das Überlaufbit nicht ausgewertet wird

Code: Alles auswählen

l.l = 1 << 31
Debug l ;negativ - Größter negativer wert
l - 1 
Debug l ;positiv - Größter negativer Wert - 1 ergibt größten positiven Wert
Ja, das war mir klar, dass das richtig ist. Damit wollte ich nur andeuten, dass der Wert 1 << 31 durchaus positiv ist. Dim beschwert sich dann aber mit der Meldung, dass er negativ wäre. Vermutlich deswegen, weil intern nochmal +1 gerechnet wird, weil z.B. Dim(10) ja auch 11 Elemente ergeben und nicht nur 10.
Antworten