ich hab mal wieder ein Problem mit arrays, leider helfen mir die unzähligen im-Netz-bereits-existierenden Hilfeschreie anderer Progger nicht weiter...
also dachte ich mir, wie man in den Wald ruft, so schallt es heraus

Die Anwendung soll ein kleines 2D-Spiel werden, wobei es eine 2-dimensionale Map gibt (vergleichbar mit Schiffeversenken, Schach etc.). Diese soll mit einem dynamischen Array (Cluster) realisiert werden, welches sich in einer separaten Unit (unit_data) in der Klasse data:Tdata befindet (dynamisches array, weil der Spieler die Dimensionen der Karte verändern kann). Tfield=class sind die einzelnen Elemente die dem array zugewiesen werden und befinden sich auch in der unit_data.
Code: Alles auswählen
Tdata = class
private
Cluster:array of array of TField; // die map, bestehend aus x*y TFields
public
procedure setCluster_dimensions(x,y:integer); // um dem dyn. array die Länge zuzuweisen
function getField(i,j:integer):Tfield; // gibt ein Element des dyn. arrays aus (mit dem index cluster[i,j])
procedure setField(i,j:integer;f:Tfield); // weist ein Element dem dyn. arrays zu (mit dem index cluster[i,j])
// ...
start; soll nun alle Spielvorbereitungen erledigen (die "settings" einstellen).
Erster Schritt wäre hierbei die Länge von Cluster zu definieren um anschließend diesem die Elemente zuzuweisen. Allerdings gibt es hier schon die "Exception SIGSEGV"

Code: Alles auswählen
procedure TForm1.start;
begin
// creating map
showMessage('0'); // nach Betätigung des Buttons kommt diese Nachricht
data.setCluster_dimensions(25,25); // hier wird die Exception ausgelöst
showMessage('1'); // dieser output kommt nie zustande :(
end;
Code: Alles auswählen
procedure Tdata.setCluster_dimensions(x, y: integer);
begin
// the map size (/ cluster) is limited by 128*128 Fields and has its minimum by 8*8
if (x<8)or(y<8)or(x>128)or(y>128) then showMessage('ERROR : procedure Tdata.setCluster_dimensions(x, y: integer); '+sLinebreak+'parameters for dimensions are not in valid range ('+intToStr(x)+':'+intToStr(y)+')')
else begin
setLength(data.Cluster,x,y); // der Überltäter, wie ich vermute
end;
end;
Ich meine, das array ist zwar private und ich kann nicht direkt darauf zugreifen, aber dafür habe ich ja die procedure setCluster_dimensions, die letztendlich nur das herkömmliche setLength aufruft.
Was soll denn an diesem Aufruft illeal sein ? .. setLength(Cluster,25,25);
mfG.
tightTannic