Delphi-PRAXiS

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;

Benjin 17. Feb 2005 11:35

Re: Problem mit For... to... do... und Integer Array
 
Hmm,
sorry für die viele Verwirrung.
Also die Initalisierung der 2 Arrays, die ich durchsuchen lassen, mit anschließender Wertzuweisung sieht wie folgt aus:

Delphi-Quellcode:
...
  SetLength(ArticlWVid, 3);
  SetLength(ArticlWAudio, 3);
  ArticlWVid[0] := 1;
  ArticlWAudio[0] := 2;
...
Zitat:

Benjin hat folgendes geschrieben:
Dies funktioniert ganz wunderbar außer bei

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

Um dies nochmal zu erläutern:
Mit [...] ist irgendein Array gemeint, über den der Suchalgorithmus läuft.
Die Besonderheit dabei ist, das der Suchalgorithmus für alle Werte außer für (0, irgenein Array) das korrekte Ergebnis liefert. D.h. obwohl 0 kein Wert in dem zu durchsuchenden Array ist, gibt der Alg. TRUE zurück.
Interessanterweise gibt er ebenfalls TRUE zurück, wenn ich 0 den beiden Arrays als Wert hinzufüge...

opfer.der.genauigkeit 17. Feb 2005 11:46

Re: Problem mit For... to... do... und Integer Array
 
Du mußt irgendwo ne 0 in deinem Code versteckt haben. :shock:
Anders kann ich mir das nicht erklären.
Der Code funktioniert bei mir, wenn keine 0 im Array vorhanden ist.

Debug mal durch und schau dir an, was in deinem Array für
Werte stehen (markier den Array während des debuggens und drück Strg + F7)

Benjin 17. Feb 2005 13:19

Re: Problem mit For... to... do... und Integer Array
 
Also die Lösung lag letzendlich in der Definiton der Arrays:

Ich hatte zwar eine Länge von 3 angegeben, aber nur jeweils die POsition [0] mit einem Wert belegt.

D.h. die nicht belegte Positionen wurden wohl als Integerwert 0 behandelt, um Exceptions zu vermeiden?

Interessantes Compilerverhalten, wenn auch recht undurchsichtig....
In dem Fall wäre mir eine Exception lieber gewesen :-D

Binärbaum 17. Feb 2005 13:28

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

Zitat von Benjin
Also die Lösung lag letzendlich in der Definiton der Arrays:

Ich hatte zwar eine Länge von 3 angegeben, aber nur jeweils die POsition [0] mit einem Wert belegt.

D.h. die nicht belegte Positionen wurden wohl als Integerwert 0 behandelt, um Exceptions zu vermeiden?

Interessantes Compilerverhalten, wenn auch recht undurchsichtig....
In dem Fall wäre mir eine Exception lieber gewesen :-D

Was ist daran undurchsichtig?
In den meisten Fällen ist es so, dass bei einer neuen und noch unbefüllten Datenstruktur die Werte erstmal mit Nullen gefüllt werden. Was man dann nicht initialisert hat ist also null.

MfG
Binärbaum

leddl 17. Feb 2005 13:42

Re: Problem mit For... to... do... und Integer Array
 
Grmpf... Ich bin doch einfach mal davon ausgegangen, daß du bereits überprüft hast, ob das Array richtig initialisiert wurde.
Aber interessehalber würde ich doch gerne meine Frage beantwortet haben:
Zitat:

Zitat von leddl
Zitat:

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

Wo ist da der Unterschied? :gruebel:


Benjin 17. Feb 2005 14:13

Re: Problem mit For... to... do... und Integer Array
 
in dem Ausdruck gibt es keinen, [...] steht für irgendein Array, in meinem Fall checke ich zwei arrays und die sind verschieden, daher fälschlicherweis das "oder".

leddl 17. Feb 2005 17:49

Re: Problem mit For... to... do... und Integer Array
 
Aaaaah, jetzt kapier ich das! :mrgreen:

Naja, schön daß es jetzt funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13: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