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])
// ...
Nach dem Kompilieren der Anwendung öffnet sich nun das Formular mit einem Button. Betätigt man diesen wird die procedure start; aufgerufen (wir befinden uns hier in der main unit (Unit1)).
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;
Die procedure die ich versuche aufzurufen ist im letzten code-Ausschnitt dieses Beitrags. Die If-Abfrage trifft bis jetzt auf jeden Fall zu, und die Methode setLength(data.Cluster,x,y); wird aufgerufen, wobei die Parameter x,y jeweils den Integerwert von 25 betragen (da die Dimensionen dementsprechend vorerst immer 25*25 Felder sein sollen).
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;
Wieso um alles in der Welt wird hier eine Exception ausgelöst ?
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