AGB  ·  Datenschutz  ·  Impressum  







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

Dynamisches Array.

Ein Thema von Lombok · begonnen am 7. Mär 2013 · letzter Beitrag vom 7. Mär 2013
Antwort Antwort
Lombok

Registriert seit: 7. Mär 2013
12 Beiträge
 
#1

Dynamisches Array.

  Alt 7. Mär 2013, 10:30
Delphi-Version: 5
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;

Geändert von Lombok ( 7. Mär 2013 um 11:12 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Dynamisches Array.

  Alt 7. Mär 2013, 10:43
Mit 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 KandidatenListen[(a-1),b] := za; wegen b > b-1.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Dynamisches Array.

  Alt 7. Mär 2013, 10:45
Dynamische Arrays beginnen bei 0 nicht 1.

Besser statt festen Grenzen Low() und High() verwenden

Ich würde, da ja von Anfang an bekannt ist, wie groß das Gitter ist, einmal auf Endgröße dimensionieren
Markus Kinzler
  Mit Zitat antworten Zitat
Lombok

Registriert seit: 7. Mär 2013
12 Beiträge
 
#4

AW: Dynamisches Array.

  Alt 7. Mär 2013, 11:05
Mit 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 KandidatenListen[(a-1),b] := za; wegen b > b-1.

Ich glaub du hast die Klammern falsch gelesen!

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).

Geändert von Lombok ( 7. Mär 2013 um 11:25 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

AW: Dynamisches Array.

  Alt 7. Mär 2013, 11:14
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.
  Mit Zitat antworten Zitat
Lombok

Registriert seit: 7. Mär 2013
12 Beiträge
 
#6

AW: Dynamisches Array.

  Alt 7. Mär 2013, 11:35
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.

Geändert von Lombok ( 7. Mär 2013 um 12:07 Uhr)
  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 14:06 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