PureBasic4.0 hat geschrieben:
Das liegt an dem Umdreh-Code:
Code: Alles auswählen
Output = ""
StringLength = MemoryStringLength(*Pass)
For z = StringLength - 1 To 0 Step -1
*Pass = *PassPointer + z
Output + Chr(*Pass\c)
Next
Die MemoryStringLength-Funktion gibt - wegen mir noch unbekannten Gründen - an diesen Stellen die falsche String-Länge zurück.
Ersetze "StringLength" einfach durch "PassLength". Dadurch wird die ForNext-Schleife zwar immer die maximale Passwortlänge durchlaufen, obwohl das bei den kürzeren Passwörtern nicht nötig wäre, aber der Funktionsaufruf von "MemoryStringLength" bleibt erspart. Ich denke, das gibt bezüglich der Geschwindigkeit einen Ausgleich und sollte für eine Notlösung mal genügen.
PureBasic4.0 hat geschrieben:
Im Code hast du die Werte falsch gesetzt.
Kommentierter Code:
Code: Alles auswählen
PassLength = 4
MyAlphabet$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#FirstChar = 'A'
#LastChar = '9'
Define *PassPointer = AllocateMemory((PassLength + 1) * SizeOf(Character)) ; "1" ist korrekter
Define *CharsPointer = AllocateMemory((Len(MyAlphabet$) + 1) * SizeOf(Character))
Define *CharsPos = AllocateMemory(PassLength)
Define *Pass.Character, *Chars.Character
Define PlacePos.l, i.l, z.l, Output.s, StringLength.l, StartTime.l
If Not *PassPointer Or Not *CharsPointer Or Not *CharsPos
If *PassPointer: FreeMemory(*PassPointer): EndIf
If *CharsPointer: FreeMemory(*CharsPointer): EndIf
If *CharsPos: FreeMemory(*CharsPos): EndIf
End
EndIf
PokeS(*CharsPointer,MyAlphabet$)
; ===================================
; Starte an beliebiger Zeichenfolge
; 1. Stelle: g
PokeB(*CharsPos + 2,32) ; Der Wert "32" gibt die Position des unten angegebenen Zeichens in der MyAlphabet$-
; Variable an.
PokeC(*PassPointer + 2,'A') ; Hier hast du das Zeichen von "g" auf "A" abgeändert, deshalb musst du auch oben den
; Wert "32" anpassen. (A=0, B=1, C=2 usw.)
; 2. Stelle: B
PokeB(*CharsPos + 1,1) ; Hier das gleiche, wie oben.
PokeC(*PassPointer + 1,'A')
; 3. Stelle: C
PokeB(*CharsPos,0) ; Wieso gibt's hier eigentlich kein PokeC?
; PokeC wird vom Code ausgeführt. Erst wenn mit PokeB das letzte Zeichen der MyAlphabet$-Variable
; gesetzt wird, muss hier auch PokeC ausgeführt werden, sonst funktioniert die Überprüfung auf das
; letzte Zeichen nicht, weil das Zeichen erst nach der Überprüfung gesetzt wird. Es steht dir also
; frei, ob du das PokeC hier auch bei einem "nicht letztes Zeichen" ausführst.
; ====================================
StartTime.l = ElapsedMilliseconds()
Repeat
PlacePos = 0
Repeat
*Pass = *PassPointer + PlacePos
If *Pass\c <> #LastChar
PokeB(*CharsPos + PlacePos,PeekB(*CharsPos + PlacePos) + 1)
*Chars = *CharsPointer + PeekB(*CharsPos + PlacePos) - 1
*Pass\c = *Chars\c
Break
Else
For i = PlacePos To 0 Step -1
PokeB(*CharsPos + i,1)
*Pass = *PassPointer + i
*Pass\c = #FirstChar
Next
PlacePos + 1
If PlacePos = PassLength
Break 2
EndIf
EndIf
ForEver
;Debug PeekS(*PassPointer)
Output = ""
StringLength = MemoryStringLength(*Pass)
For z = StringLength - 1 To 0 Step -1
*Pass = *PassPointer + z
Output + Chr(*Pass\c)
Next
Debug Output
ForEver
MessageRequester("RunTime",Str(ElapsedMilliseconds() - StartTime) + " ms")
FreeMemory(*PassPointer)
FreeMemory(*CharsPointer)
FreeMemory(*CharsPos)
Mfg DerProgger