

@DD:
Code: Alles auswählen
counter + 1
hash + ((counter/2)*(counter/2))*(-1 + (r*2))
hash%*hMap\Mapsize
If hash<0 : hash + *hMap\Mapsize : EndIf
Gruß, Alex
Code: Alles auswählen
counter + 1
hash + ((counter/2)*(counter/2))*(-1 + (r*2))
hash%*hMap\Mapsize
If hash<0 : hash + *hMap\Mapsize : EndIf
Des gibts doch it, mach die Augen auf!! Langsam regts mich aufcxAlex hat geschrieben:Danke helleNur r ist leider nicht der Rest, sondern einfach eine eigenständige Variable und ich versteh deinen Code leider nicht genug um es selbst anzupassen
![]()
@DD:Ich quadriere hier einfach counter/2 ( (counter/2)² ), wo ist da ein counter/2 zu viel?Code: Alles auswählen
counter + 1 hash + ((counter/2)*(counter/2))*(-1 + (r*2)) hash%*hMap\Mapsize If hash<0 : hash + *hMap\Mapsize : EndIf
Gruß, Alex
Code: Alles auswählen
counter + 1
hash + ((counter/2)*(counter/2))*(-1 + (r*2)) ; HIER STEHT 2 MAL (counter/2) !! VORHER ZWISCHENSPEICHERN UND DANN ERST QUADRIEREN, DAMIT SICHER NICHT 2 MAL COUNTER/2 GEMACHT WIRD!!
hash%*hMap\Mapsize
If hash<0 : hash + *hMap\Mapsize : EndIf
cxAlex hat geschrieben:Es müssen nicht 2^31 Datensätze sein. Der Hashing-Algo (DJB2) erzeugt schon mal so hohe Werte, das If hat schon seinen Sinn.
Code: Alles auswählen
CompilerElse
mapsize = *hMap\mapsize
!INC dword[p.v_counter]
!MOV EAX,dword[p.v_counter]
!MOV EBX, dword[p.v_mapsize]
!MOV ECX,2
!CDQ
!DIV ECX ; counter/2
Code: Alles auswählen
Macro _DoQuad()
CompilerIf #True
counter + 1
hash + ((counter/2)*(counter/2))*(-1 + (r*2))
hash%*hMap\Mapsize
If hash<0 : hash + *hMap\Mapsize : EndIf
CompilerElse
mapsize = *hMap\mapsize
!INC dword[p.v_counter]
!MOV EAX,dword[p.v_counter]
!MOV EBX, dword[p.v_mapsize]
!MOV ECX,2
!CDQ
!SHL EAX,1 !;DIV ECX ; counter/2
!IMUL EAX,EAX ; ((counter/2)*(counter/2))
!MOV ESI, dword[p.v_r]
!ADD ESI, ESI ; r*2
!DEC ESI ; -1
!IMUL EAX,ESI
!ADD EAX, dword[p.v_hash] ; hash + rest
!CDQ
!DIV EBX ;hash%*hMap\mapsize
; !MOV EAX, EDX - Wert wird in EDX belassen, da unten mit EDX weitergerechnet wird, und nicht mit EAX
; If hash<0 : hash + *hMap\Mapsize : EndIf
!AND EDX,EDX ;!AND EAX,EAX , Prüfung ob kleiner Null wird auf EDX geändert, da steht der Wert
!JGE @f
!ADD EDX,EBX
!@@:
!MOV dword[p.v_hash], EDX
; r ! 1
!XOR dword[p.v_r], 1
CompilerEndIf
EndMacro