Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#11

Re: verzweifle an fließkommazahlen....:-(

  Alt 29. Dez 2005, 15:22
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat