[Gelöst] Länge von dynamischen Array ändert sich plötzlich

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

[Gelöst] Länge von dynamischen Array ändert sich plötzlich

Beitrag von ConcAPPtLab »

Hallo liebe Community,

ich bin gerade dabei ein kleines Spiel zu programmieren. Im Spiel müssen beliebig viele Kreise erzeugt werden, die dann bewegt werden.

Lösung ist ja eigentlich ganz einfach: record mit Shape und weiteren EIgenschaften des Shapes erstellen, alles als dynamisches Array deklarieren, fertig ist der Lack.

Allerdings habe ich (nach geraumer Zeit, zugegeben) festgestellt, dass es eine Stelle im Code gibt, an dem sich die Größe des Arrays mit den Shapes explosionsartig erhöht, obwohl ich kein SetLength() benutze.

Dies ist der Code:

Code: Alles auswählen

 
type
 
TGerm = record  //Germ=Bakterie -> ein Shape ist eine Bakterie #nurzurinfo :p
    Shape: TShape;
    m: extended;
    Xo, Yo: integer;
  end;
 
procedure TForm1.StartGame;
var Shapes: array of TGerm;
    i, lasti, x: integer;
begin
  Stop:=false;
 
  {Create necessary shapes}
    SetLength(Shapes, StrToInt(Edit1.Text));
 
    if StrToInt(Edit1.Text)>300 then
      begin
        CenterLabel(Label1, Field, Label1.Caption);
        Label1.Caption:='Lade Spiel';
        Label1.Visible:=true;
      end;
 
    i:=-1;
    lasti:=0;
 
    repeat
        Application.ProcessMessages;
        if (Label1.Visible=true) and (i=lasti+100) then  //kleine Animation, nichts wichtiges
          begin
            Application.ProcessMessages;
            if (Label1.Caption='Lade Spiel.') or (Label1.Caption='Lade Spiel..')
            or (Label1.Caption='Lade Spiel') then
              begin
                Label1.Caption:=Label1.Caption+'.';
              end
            else
              begin
                Label1.Caption:='Lade Spiel';
              end;
            lasti:=i;
          end;
        Shapes[i].Shape:=TShape.Create(Form1);
        Shapes[i].Shape.Parent:=Form1;
        Shapes[i].Shape.Left:=random(Field.Width-StrToInt(Edit2.Text))+Field.Left;
        Shapes[i].Shape.Top:=random(Field.Height-StrToInt(Edit2.Text))+Field.Top;
        Shapes[i].Shape.Shape:=stCircle;
        Shapes[i].Shape.Width:=StrToInt(Edit2.Text);
        Shapes[i].Shape.Height:=StrToInt(Edit2.Text);
        Shapes[i].Shape.Brush.Color:=RGB(Random(256), Random(256), Random(256));
        Shapes[i].Shape.Pen.Style:=psClear;
        Shapes[i].Xo:=Shapes[i].Shape.Left+Round(Shapes[i].Shape.Width/2); //hier verändert sich die Größe ein wenig
        Shapes[i].Yo:=Shapes[i].Shape.Top+Round(Shapes[i].Shape.Height/2); //hier explodiert die Größe
        i:=i+1;
    until (i=StrToInt(Edit1.Text)-1) or (Stop=true);
 
//und so weiter und so fort
Bin schon fast am Verzweifeln, weil ich einfach keinen Fehler finde. Ich bin mir trotzdem ziemlich sicher, dass die Lösung ganz einfach ist...

Grüße
ConcAPPtLab
Zuletzt geändert von ConcAPPtLab am So 8. Mär 2015, 18:45, insgesamt 1-mal geändert.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Länge von dynamischen Array ändert sich plötzlich

Beitrag von martin_frb »

Kompiliere mal mit Range Check


Shapes.Yo:=Shapes.Shape.Top+Round(Shapes.Shape.Height/2); //hier explodiert die Größe

Wenn i = -1 dann überschreibt die Anweisung Speiche außerhalb des Array (in diesem Fall die Länge)

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Länge von dynamischen Array ändert sich plötzlich

Beitrag von ConcAPPtLab »

Wie gesagt. Die Lösung ist wahrscheinlich ganz einfach xD

Vielen Dank :)

i war gleich -1.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Antworten