Bug mit PeekQ() in If - Bedingung ?

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Lupo
Beiträge: 147
Registriert: 16.02.2005 15:15

Bug mit PeekQ() in If - Bedingung ?

Beitrag von Lupo »

Ich glaube ich habe einen Bug gefunden :) :)

Wenn man den Speicher mit PeekQ ausliest, dann ist eine erfolgreiche
If-Bedingung abhängig, ob man PeekQ vor oder nach das = setzt :wink:

Code: Alles auswählen


zahl.q
zahl = 66
offset.l = 0

*buffer.l = AllocateMemory(16)

PokeQ(*buffer, zahl)

Debug PeekQ(*buffer)

; OK 
If PeekQ(*buffer) = zahl
  Debug "OK"
Else
  Debug "WRONG"
EndIf

; OK
If  zahl = PeekQ(*buffer)
  Debug "OK"
Else
  Debug "WRONG"
EndIf

;OK
If PeekQ(*buffer + offset) = zahl
  Debug "OK"
Else
  Debug "WRONG"
EndIf

; NOT OK !!!!
If zahl = PeekQ(*buffer + offset)
  Debug "OK"
Else
  Debug "WRONG"
EndIf

FreeMemory(*buffer)
Vergleicht man ohne Addition im Argument von PeekQ ist alles
ok, wenn man aber ein offset dazuaddiert (hier ist es 0) dann funktioniert
der Vergleich nicht, wenn PeekQ auf der rechten Seite steht :cry:

Mit Longs ist alles ok. Ich hab extra die neueste Version von PB4.0
runtergeladen, aber da gehts auch nicht.

Kann das wer bestätigen und bitte auch weitermelden? Ich bin im
englischen Forum nicht angemeldet und mein Englisch ist /:-> /:->

Danke LUPO
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Bug bestätigt.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Ist definitiv ein Bug: (ASM-Auszug)

Code: Alles auswählen

; NOT OK !!!! 
; If zahl = PeekQ(*buffer + offset) 
  MOV    ebx,dword [v_zahl]
  MOV    edi,dword [v_zahl+4]      ;hier oder für Zeiger muss anderes (freies!) Register verwendet werden. Oder pushen und nach call... wieder poppen
  MOV    edi,dword [p_buffer]      ;überschreibt 2.DWord von zahl
  ADD    edi,dword [v_offset]
  PUSH   edi
  CALL  _PB_PeekQ@4
QuadCompare3:
  CMP    ebx,eax
  JNE   .Cancel
  CMP    edi,edx          ;vergleicht jetzt Zeiger-Wert mit Daten-Wert
  JE    .Ok                  ;wäre jetzt Zufall
.Cancel:
  XOR    eax,eax
  JMP   .End
.Ok:
  MOV    eax,1
.End:
  OR     eax,eax
  JE    _EndIf11
; Debug "OK" 
; Else 
  JMP   _EndIf10
_EndIf11:
; Debug "WRONG" 
; EndIf 
_EndIf10:
Das zweite DWord von zahl wird mit Zeiger überschrieben.

Gruss
Helle
Antworten