Seite 1 von 1

Debugger und Dim mit mehr als 2^31 Elementen

Verfasst: 27.03.2013 16:50
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.

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

Verfasst: 27.03.2013 18:32
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

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

Verfasst: 28.03.2013 11:42
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

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

Verfasst: 28.03.2013 14:31
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.