Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Dynamisches Array. (https://www.delphipraxis.net/173619-dynamisches-array.html)

Lombok 7. Mär 2013 09:30

Delphi-Version: 5

Dynamisches Array.
 
Guten Morgen,
Ich habe ein kleines Problem mit einem Dynamischen Array.
Ich habe eine Prozedur welche Werte Prüfen soll und diese dann in das "fehlerbehaftete" Array reinschreiben soll das ganze ist 2 Dimensional
damit ich einem Wert mehrere Werte zuordnen kann.Jetzt bekomme ich aber nachdem b=5 wurde folgende Fehlermeldung:

"Im Projekt.exe ist eine Exception der Klasse EAccessViolation aufgetreten:"Zugriffsverletzung bei Adresse 00401C2D in Modul 'Projekt.exe'.Schreiben von Adresse 00000001."

Habe mit dem Debugger die Länge des Array Schritt für Schritt nachgeprüft es wir genau immer um 1 verlängert und dann erst der Wert hineingeschrieben.

Code:
var
KandidatenListen   : array of array of Byte;
.

procedure Tform1.KandidatenListe();
var
x,y,a,b,za :integer;                            
begin                              
   a := 0;
     for x:= 1 to 9 do begin
      for y:= 1 to 9 do begin
        if (Sudoku[x,y]=0) then begin
          b:=0;
          a := a+1;
          b := 1;
            for za:=1 to 9 do begin
             zahl := za;              
              If (Einheit_Pruefen(x,y)) and (Wagerecht_Pruefen(x)) and (Senkrecht_Pruefen(y)) then begin
              SetLength(KandidatenListen,(a));
              SetLength(KandidatenListen[(a-1)],b);
              KandidatenListen[(a-1),b]:= za;                  //Hier wirft es mich mit der Fehlermeldung raus.Wenn B=5 ist.
              Korx[a]:= x;
              Kory[a]:= y;
              Memo1.Lines.Add('['+(IntToStr(a-1))+','+IntToStr(b)+']'+'='+IntToStr(KandidatenListen[(a-1),b]));
              b:= b+1;
              end;
            end;
        end;
      end;                      
    end;
end;

gammatester 7. Mär 2013 09:43

AW: Dynamisches Array.
 
Mit
Delphi-Quellcode:
SetLength(KandidatenListen[(a-1)],b);
schaffst Du Platz für KandidatenListen[(a-1),0] .. KandidatenListen[(a-1),b-1]. Deshalb gibt es ein Bumm bei
Delphi-Quellcode:
KandidatenListen[(a-1),b] := za;
wegen b > b-1.

mkinzler 7. Mär 2013 09:45

AW: Dynamisches Array.
 
Dynamische Arrays beginnen bei 0 nicht 1.

Besser statt festen Grenzen
Delphi-Quellcode:
Low()
und
Delphi-Quellcode:
High()
verwenden

Ich würde, da ja von Anfang an bekannt ist, wie groß das Gitter ist, einmal auf Endgröße dimensionieren

Lombok 7. Mär 2013 10:05

AW: Dynamisches Array.
 
Zitat:

Zitat von gammatester (Beitrag 1206327)
Mit
Delphi-Quellcode:
SetLength(KandidatenListen[(a-1)],b);
schaffst Du Platz für KandidatenListen[(a-1),0] .. KandidatenListen[(a-1),b-1]. Deshalb gibt es ein Bumm bei
Delphi-Quellcode:
KandidatenListen[(a-1),b] := za;
wegen b > b-1.


Ich glaub du hast die Klammern falsch gelesen!

Delphi-Quellcode:
SetLength(KandidatenListen[(a-1)],b);
Schafft mir in Zeile(a) die Anzahl von (b) Spalten da ist Nie irgendwas (B-1) Anmerkung: (b:=1)(b=b+1)ergo immer => 1).

gammatester 7. Mär 2013 10:14

AW: Dynamisches Array.
 
Ich denke nicht, daß ich die Klammern falsch gelesen hab. Außerdem ist bei setlength(..., b) der Zugriff mit Index b immer illegal. Wenn Du Rangecheck einschaltest hast, wirst Du sofort die Meldung erhalten. Ohne Rangecheck knallt es je nach Speicherallokierung halt später.

Lombok 7. Mär 2013 10:35

AW: Dynamisches Array.
 
Zitat:

Zitat von gammatester (Beitrag 1206335)
Ich denke nicht, daß ich die Klammern falsch gelesen hab. Außerdem ist bei setlength(..., b) der Zugriff mit Index b immer illegal. Wenn Du Rangecheck einschaltest hast, wirst Du sofort die Meldung erhalten. Ohne Rangecheck knallt es je nach Speicherallokierung halt später.

Was meinst du mit illegale?


/Edit

Hab den Fehler gefunden Fehler lag bei
Code:
KandidatenListen[(a-1),b] := za;
musste zu:
Code:
KandidatenListen[(a-1),(b-1)] := za;
werden.

Glaub du meintest das richtige habs Falsch verstanden.
Danke.

Kann Geschlossen werden.


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