Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit For... to... do... und Integer Array (https://www.delphipraxis.net/40528-problem-mit-do-und-integer-array.html)

Benjin 17. Feb 2005 00:47


Problem mit For... to... do... und Integer Array
 
Hallo,

ich benutze folgende Funktion, um festzustellen ob sich ein Integer als Wert in einem Integerarray befindet:

Delphi-Quellcode:
function IsInArray(navindex:integer; const a:array of Integer):Boolean;
var
   p,i : integer;
begin
   for i := 0 to High(a) do
   begin
      p := a[i];
      if p = navindex then
      begin
         Result := true;  //Treffer
         Exit;
      end;
   end;
   Result := false; // nix gefunden
end;
Die Funktion gibt entsprechend einen boolschen Wert zurück.

Dies funktioniert ganz wunderbar außer bei

IsInArray(0, [...]) oder IsInArray(0, [...])

Vermute das etwas mit der 0 und der For Schleife nicht hin haut,
komme aber nicht drauf.
Vermutlich ist es einfach zu spät... :freak:

Binärbaum 17. Feb 2005 00:54

Re: Problem mit For... to... do... und Integer Array
 
Änder mal den Code ein wenig:
Delphi-Quellcode:
function IsInArray(navindex:integer; const a:array of Integer):Boolean;
var
   i : integer;
begin
   for i := 0 to High(a) do
   begin
      if (a[i] = navindex) then
      begin
         Result := true;  //Treffer
         Exit;
      end;
   end;
   Result := false; // nix gefunden
end;
Wahrscheinlich liegts an der Klammerung im if..then, ist aber nur eine Vermutung.

MfG
Binärbaum

leddl 17. Feb 2005 01:38

Re: Problem mit For... to... do... und Integer Array
 
Die Chose hat mich so gewurmt, daß ichs jetzt doch mal ausprobiert hab. Bei mir funktioniert dein Code einwandfrei.
Und - sorry Binärbaum - das mit der Klammersetzung war ein etwas seltsamer Tip. Was soll den diese Klammer an der Stelle verändern? :gruebel:
Zitat:

Zitat von Benjin
IsInArray(0, [...]) oder IsInArray(0, [...])

Wo ist da der Unterschied? :gruebel:
Also wie gesagt, bei mir hat das auch so funktioniert. Egal ob die 0 drin war oder nicht, es wurde korrekt angezeigt.

Etwas kannst du an dem Code aber auf jeden Fall verändern:
Delphi-Quellcode:
function IsInArray(NavIndex : Integer; Const a : Array of Integer):Boolean;
Var
   i : Integer;
Begin
   For i := 0 to High(a) Do
   Begin
      If a[i] = NavIndex Then
      Begin
         Result := true;  //Treffer
         Exit;
      End;
   End;
   Result := false; // nix gefunden
End;
Das p kannste dir nämlich sparen. ;) Aber ansonsten würd ich das so lassen, wie es is. Ich konnte auf jeden Fall - wie ja bereits schon gesagt - weder im Code noch beim Testen nen Fehler feststellen.
Was genau funktioniert da bei dir denn nicht? Wird es generell falsch angezeigt, oder nur in einem Fall?

Bart82 17. Feb 2005 07:04

Re: Problem mit For... to... do... und Integer Array
 
Delphi-Quellcode:
for i := 0 to High(a) do
Schreibe besser

Delphi-Quellcode:
for i := 1 to High(a) do
Da Arrays in Delphi normalerweise von 1..x laufen und nicht wie z.B. bei C von 0..x


Edit: @ daniel: Sorry, mein Fehler - bin von nem Index beim String ausgegangen, da ist es so! Bei den Arrays hast du vollkommen recht

Sanchez 17. Feb 2005 07:08

Re: Problem mit For... to... do... und Integer Array
 
Zitat:

Zitat von Bart82
Da Arrays in Delphi normalerweise von 1..x laufen und nicht wie z.B. bei C von 0..x

Seit wann den das? Dynamische Arrays laufen immer von 0 weg und bei statischen hat mans selbst in der Hand.

Wenn schon dann:
Delphi-Quellcode:
for i := Low(0) to High(a) do
grüße, daniel

leddl 17. Feb 2005 09:59

Re: Problem mit For... to... do... und Integer Array
 
Da hat sich jetzt aber auch der Fehlerteufel eingeschlichen! ;)
Es sollte nicht
Delphi-Quellcode:
for i := Low(0) to High(a) do
heißen, sondern
Delphi-Quellcode:
for i := Low(a) to High(a) do

Sanchez 17. Feb 2005 10:05

Re: Problem mit For... to... do... und Integer Array
 
Hoppala :mrgreen:

shmia 17. Feb 2005 10:12

Re: Problem mit For... to... do... und Integer Array
 
Wenn, dann aber gleich richtig.
Die Funktion liefert auch gleich die Info, an welcher Position sich der Suchwert befindet.

Delphi-Quellcode:
function FindInArray(value : Integer; Const a : Array of Integer):Integer;
Var
   i : Integer;
Begin
   For i := Low(a) to High(a) Do
   Begin
      If a[i] = value Then
      Begin
         Result := i;  //Treffer
         Exit;
      End;
   End;
   Result := -1; // nix gefunden
End;

function IsInArray(value : Integer; Const a : Array of Integer):Boolean;
begin
   Result := (FindInArray(value, a) <> -1);
end;

ibp 17. Feb 2005 10:19

Re: Problem mit For... to... do... und Integer Array
 
Zitat:

Zitat von Benjin
Dies funktioniert ganz wunderbar außer bei

IsInArray(0, [...]) oder IsInArray(0, [...])

[...] soll das ein leeres array sein?

opfer.der.genauigkeit 17. Feb 2005 10:32

Re: Problem mit For... to... do... und Integer Array
 
Darf man wissen, wie du deinen dynamischen Array erstellst?

SetLength(array, wert) ??

Da könnte der Hund vielleicht begraben sein. :-D

Zitat:

procedure SetLength(var S; NewLength: Integer);

Beschreibung

S ist eine String- oder dynamische Array-Variable.

NewLength enthält die neue Anzahl der Zeichen oder Elemente in S.

Bei einem kurzen String ändert SetLength einfach das Längenbyte (das Zeichen an der Position S[0]) auf den angegebenen Wert. In diesem Fall muß mit NewLength ein Wert zwischen 0 und 255 angegeben werden.

Bei einer langen String- oder einer dynamischen Array-Variable weist SetLength dem in S referenzierten String oder Array die angegebene Länge zu. Dabei bleiben die Zeichen im String oder die Elemente im Array erhalten, jedoch ist der Inhalt des neu zugewiesenen Speicherbereichs nicht definiert. Eine Ausnahme stellt das Vergrößern der Länge von dynamischen Arrays dar, in dem die Elemente Typen sind, die initialisiert werden müssen (Strings, Varianten, Variant-Arrays oder Records, die solche Typen enthalten). Wenn S ein dynamisches Typen-Array ist, das initialisiert werden muß, wird der neu zugewiesene Platz auf 0 oder nil gesetzt.

Nach dem Aufruf von SetLength ist sichergestellt, daß S auf einen eindeutigen String oder ein eindeutiges Array zeigt (d.h. dessen Referenzzähler den Wert Eins hat). Ist nicht genug Speicher für die Variable vorhanden, wird eine EOutOfMemory-Exception ausgelöst.
Ist nur ne Idee.

//Edit: Weil

Delphi-Quellcode:
procedure TTestForm.FormCreate(Sender: TObject);
var
  b: array of byte;
  i: integer;
begin
  SetLength(b, 1); //
  i := b[0]; // i ist 0
  i := High(b); // hight -> 0 .. High gibt - 1 wenn SetLength(b, 0)

  for i := 0 to High(b) do begin
    ShowMessage('0');
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.
Seite 1 von 2  1 2      

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