![]() |
1- und 2 Dimensionales Array vergleich
Hallo
Folgendes problem: Ich habe zwei Arrays, ein 1-dimensionales und ein 2-dimensionales. Das 2-dim. soll mehrere 1-dim. Arrays speichern können. Es soll diese 1-dim. Arrays aber nur speichern, wenn sie nicht schon in diesem Array vorhanden sind, also doppelte Einträge sollen vermieden werden. Dazu habe ich jetzt folgenden Code:
Delphi-Quellcode:
So ich hoffe ihr könnt mir helfen, weil ich versteh wirklich nicht, warum dabei immer ein Zugriffsfehler erscheint. :gruebel:
type
TBooleanDynArray = array of boolean; var kaufband: TBooleanDynArray; kaufbaende: array of TBooleanDynArray; ... H:=0; //Anzahl der mögl. Ausgaben SetLength(kaufband,bI+1); //bI ist eine Konstante for i:=1 to bI do begin kaufband[i]:=false; end; ... ausgabe:=true; //Gehe davon aus, dass neuer Eintrag gefunden wurde for h:=0 to H-1 do begin if kaufbaende[h]=kaufband then begin //Ich denke hier liegt das Problem ausgabe:=false; //Wenn Eintrag schon existiert, dann kein neuen Eintrag gefunden end; end; if ausgabe then begin inc(H); SetLength(kaufbaende,H); SetLength(kaufbaende[H-1],bI+1); for i:=1 to bI do begin kaufbaende[H-1,i]:=false; end; kaufbaende[H-1]:=kaufband; end; Danke schonmal für eure Bemühungen und seid nicht so streng mit mir ich bin NewBee in Delphi. DankE! |
Re: 1- und 2 Dimensionales Array vergleich
Moin Raddi,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS. Was mir als erstes Aufgefallen ist:
Delphi-Quellcode:
Da ein dynamisches Array immer mit dem Index 0 beginnt, wird das erste Element nicht initialisiert.
SetLength(kaufband,bI+1); //bI ist eine Konstante
for i:=1 to bI do begin kaufband[i]:=false; end; Als nächstes solltes Du erst einmal herausbekommen, wo die AV auftritt, dies wohl am besten, indem Du mal im Einzelschritt durch die verdächtigen Abschnitte gehst. (F5=Breakpoint, F7=Einzelschritt, F8=Einzelschritt bei dem Prozeduren/Funktionen am Stück abgearbeitet werden). Übrigens könnte H nach der for-Schleife einen beliebigen Wert enthalten, oder nimmst Du an, dass h <> H ist? Gross-/Kleinschreibung wird in Delphi nicht unterschieden. |
Re: 1- und 2 Dimensionales Array vergleich
Moin,
ich habe die gleichen Probleme gesehen und hier mal einen erweiterten Vorschlag...
Delphi-Quellcode:
Diese Klasse realisiert dein Problem.
type
TMyArray = array of boolean; TMyArrays = class private _Arrays:array of TMyArray; function GetArray(index: word): TMyArray; public constructor create; destructor destroy; override; function Count:word; procedure addArray(x:array of boolean); property Arrays[index:word]:TMyArray read GetArray; end; : { TMyArrays } procedure TMyArrays.addArray(x: array of boolean); var i, j:integer; abbruch:boolean; begin abbruch:=false; i:=0; while (i < length(_Arrays)) and not abbruch do begin if length(_Arrays[i]) = length(x) then begin j:=0; while (j < length(x)) and not abbruch do begin abbruch:=(x[j] <> _Arrays[i][j]); inc(j); end; abbruch:=not abbruch; end; if not abbruch then inc(i); end; if not abbruch then begin setlength(_Arrays, length(_Arrays)+1); setlength(_Arrays[length(_Arrays)-1], length(x)); for i:=1 to length(x) do _Arrays[length(_Arrays)-1][i-1]:=x[i-1]; end; end; function TMyArrays.Count: word; begin Result:=length(_Arrays); end; constructor TMyArrays.create; begin setlength(_Arrays, 0); end; destructor TMyArrays.destroy; begin setlength(_Arrays, 0); inherited; end; function TMyArrays.GetArray(index: word): TMyArray; begin Result:=_Arrays[index]; end; und hier ein Beispiel für den Aufruf:
Delphi-Quellcode:
hoffe es ist zuverstehen und es hilft dir...
procedure TForm.ButtonClick(Sender: TObject);
var a, b:array of boolean; MyArrays:TMyArrays; begin setlength(a, 1); a[0]:=true; setlength(b, 1); b[0]:=false; MyArrays:=TMyArrays.create; try MyArrays.addArray(a); MyArrays.addArray(b); showmessage(inttostr(MyArrays.Count)); finally MyArrays.Free; end; end; MfG Thorsten |
Re: 1- und 2 Dimensionales Array vergleich
hi
Hmm na dann liegts an der Groß-/Kleinschreibung. Bin davon ausgegangen, dass da unterschieden wird. Werds gleich mal testen, danke für den Hinweis. Sollte das nicht klappen werd ich mal das von omata probieren. Gruß! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 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