![]() |
Element in Array mit Differenzwert?
Hey,
ich habe folgendes Problem: Ich möchte ermitteln, ob sich ein bestimmter Wert bereits in einem Array befindet. Hierbei soll eine Differenz in beide Richtungen beachtet werden. Zum beispiel ist in meinem Array bisher nur der Wert 3. Meine Differenz ist 7 und ich will prüfen, ob der Wert 5 noch in die Liste passt, ohne mit den anderen Zahlen zu kollidieren. Die Rückgabe wäre hier FALSE, da 3 ja im Bereich (5-7) bis (5+7) liegt. Ich hoffe ihr versteht das Problem. Mein bisheriger Ansatz liefert leider keine brauchbaren Resultate:
Delphi-Quellcode:
Entweder ich habe grade eine Blockade, oder es tritt irgendwie ein Speicherüberlauf im DWord auf, da DWord ja nicht negativ werden kann. Ich hoffe mir kann da jemand helfen.
function IsElementInArray(lpArray: TRestoreArray; dwElement,
dwDelta: DWord): Boolean; var I, J: Integer; begin Result := false; for J := (0 - dwDelta) to dwDelta do begin for I := Low(lpArray) to High(lpArray) do begin if ((dwElement + J) = lpArray[I].dwOffset) then begin Result := true; Exit; end; end; end; end; Gruß Zacherl |
Re: Element in Array mit Differenzwert?
Wie wäre es mit einer einfachen Differenz? ;-)
Delphi-Quellcode:
function IsElementInArray(lpArray: TRestoreArray; dwElement,
dwDelta: DWord): Boolean; var i: Integer; begin Result := false; for i := Low(lpArray) to High(lpArray) do if Abs(lpArray[i].dwOffset - dwElement) <= dwDelta then begin Result := true; Exit; end; end; |
Re: Element in Array mit Differenzwert?
Delphi-Quellcode:
Nicht getestet ...
function IsElementInArray(lpArray: TRestoreArray; dwElement,
dwDelta: Integer): Bool; var i, min, max : integer; begin Result := False; min := dwElement - dwDelta; max := dwElement + dwDelta; i := Low(lpArray); repeat Result := NOT lpArray[i] in [min..max]; inc(i); until (i > High(lpArray)) or NOT Result; end; |
Re: Element in Array mit Differenzwert?
Danke euch beiden!
@quendolineDD: Mit einem Min und Max Wert hatte ich es auch probiert, aber das hat irgendwie dank der IN Abfrage komischerweise nicht korrekt funktioniert. @jaenicke: Stimmt ja :wall: Wieso kompliziert, wenns auch einfach geht. Deine Version ist auf jeden Fall performanter als meine. Im Endeffekt wars allerdings eigene Dummheit. Ich habe der Funktion immer Werte übergeben, die Dateioffsets einer EXE darstellen. Wenn der Wert allerdings nicht im Array war, habe ich die Offsets in virtuelle Adressen umgerechnet und dann dem Array hinzugefügt. Klar, dass jetzt leicht sogar zwei komplett gleiche Werte ins Array eingetragen werden können. |
Re: Element in Array mit Differenzwert?
Zitat:
Delphi-Quellcode:
sieht richtig aus, macht aber etwas anderes, nämlich das...
Result := NOT lpArray[i] in [min..max];
Delphi-Quellcode:
Da wird der Zahlenwert bitweise negiert. Richtig wäre es so:
Result := (NOT lpArray[i]) in [min..max];
Delphi-Quellcode:
Result := not (lpArray[i] in [min..max]);
|
Re: Element in Array mit Differenzwert?
Nein GENAU so hatte ich es nicht gemacht, aber so ähnlich. Kann sein, dass es sogar funktioniert hat, aber ich dachte, dass es nicht funktioniert, da der Fehler ja an der Konvertierung lag.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz