Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Element in Array mit Differenzwert? (https://www.delphipraxis.net/130387-element-array-mit-differenzwert.html)

Zacherl 7. Mär 2009 15:20


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:
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;
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.

Gruß Zacherl

jaenicke 7. Mär 2009 15:31

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;

quendolineDD 7. Mär 2009 15:35

Re: Element in Array mit Differenzwert?
 
Delphi-Quellcode:
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;
Nicht getestet ...

Zacherl 7. Mär 2009 15:44

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.

jaenicke 7. Mär 2009 15:50

Re: Element in Array mit Differenzwert?
 
Zitat:

Zitat von Zacherl
@quendolineDD:
Mit einem Min und Max Wert hatte ich es auch probiert, aber das hat irgendwie dank der IN Abfrage komischerweise nicht korrekt funktioniert.

Wenn du es exakt genauso gemacht hast ist das kein Wunder, denn:
Delphi-Quellcode:
Result := NOT lpArray[i] in [min..max];
sieht richtig aus, macht aber etwas anderes, nämlich das...
Delphi-Quellcode:
Result := (NOT lpArray[i]) in [min..max];
Da wird der Zahlenwert bitweise negiert. Richtig wäre es so:
Delphi-Quellcode:
Result := not (lpArray[i] in [min..max]);

Zacherl 7. Mär 2009 16:01

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 07:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz