Ich muß wohl wirklich endlich mal den Fehler finden, damit ich mein kleines UCC komlett veröffentlichen kann. -.-''
Na ja, darin hab ich zwar nichts direkt für's Double, aber LargeWord macht's ja och
Delphi-Quellcode:
var
pd: PDouble;
d: Double;
i: integer;
begin
i := FindData(PLargeWord(@d)^, pd, 100000) + 1;
Das Ergebnis der Funktion kann man mit dem von POS vergleichen, nur daß der Index hier bei 0 anfängt.
nichts gefunden: -1
Index der ersten Übereinstimmung: >=0
So und hier noch die entsprechende Funktion:
Delphi-Quellcode:
Function FindData(SerarchWord: LargeWord; Data: Pointer; Count: LongInt): LongInt;
ASM
PUSH EBX
TEST &Data, &Data
JE @Exit
TEST &Count, &Count
JLE @Exit
MOV ECX, &Count
MOV EBX, DWORD PTR [&SerarchWord]
MOV EDX, DWORD PTR [&SerarchWord + 4]
JMP @InLoop
@Loop:
ADD &Data, 8
DEC ECX
JECXZ @Exit
@InLoop:
CMP EBX, [&Data]
JNE @Loop
CMP EDX, [&Data + 4]
JNE @Loop
POP EDX
SUB EAX, EDX
SHR EAX, 3
POP EBX
POP EBP
RET
@Exit:
MOV EAX, -1
POP EBX
End;
Falls nötig, dann kann LargeWord auch in Int64 geändert werden.
Und wenn es jemanden interessiert, folgendes stünde och noch zur Verfügung.
Delphi-Quellcode:
Function FindData(SerarchWord: Byte; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchWord: Word; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchWord: LongWord; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchWord: LargeWord; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchWord: ShortInt; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchWord: SmallInt; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchWord: LongInt; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchWord: LargeInt; Data: Pointer; Count: LongInt): LongInt; Overload;
Function FindData(SerarchData: Pointer; Data: Pointer; Count: LongInt; ElementSize: LongInt): LongInt; Overload;
PosEx wird es nicht vorläufig nicht geben, da dieses ja eigentlich nicht benötigt wird:
Code:
i := FindData(PLargeWord(@d)^, pd [color=#ff0000]+ Offset[/color], 100000 [color=#ff0000]- Offset[/color]) + 1;