AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Element in Array mit Differenzwert?

Ein Thema von Zacherl · begonnen am 7. Mär 2009 · letzter Beitrag vom 7. Mär 2009
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Element in Array mit Differenzwert?

  Alt 7. Mär 2009, 16:20
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Element in Array mit Differenzwert?

  Alt 7. Mär 2009, 16:31
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;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Element in Array mit Differenzwert?

  Alt 7. Mär 2009, 16:35
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 ...
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: Element in Array mit Differenzwert?

  Alt 7. Mär 2009, 16:44
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 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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Element in Array mit Differenzwert?

  Alt 7. Mär 2009, 16:50
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:Result := NOT lpArray[i] in [min..max]; sieht richtig aus, macht aber etwas anderes, nämlich das...Result := (NOT lpArray[i]) in [min..max]; Da wird der Zahlenwert bitweise negiert. Richtig wäre es so:Result := not (lpArray[i] in [min..max]);
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Element in Array mit Differenzwert?

  Alt 7. Mär 2009, 17:01
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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