Autor Beitrag
SpaghettiCodix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Sa 06.10.07 16:15 
Hallo,

habe einen Record geschrieben, den ich in einem Array nutzen will.
Beim Compilieren stürzt Delphi ab. Warum?


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type
 TRechteck = record
 Rct:TRect;
 lang:byte;
 breit:byte;
 txt:shortstring;
 farbe:TColor;
 number:byte;
end;


type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
usw.................
.....................
.....................
.....................
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
    MyRect:array of TRechteck;
begin
 For i:= 0 to 48 do MyRect[i].lang:=1;
end;

end.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 06.10.07 16:18 
user profile iconSpaghettiCodix hat folgendes geschrieben:
Beim Compilieren stürzt Delphi ab. Warum?
Wie äußert sich der Absturz? Kommt eine Fehlermeldung, dass Delphi einen Fehler verursacht hat und geschlossen werden muss? Oder ist Delphi plötzlich ganz weg?

Bei mir funktioniert das jedenfalls so, Delphi hat da kein Problem mit. Wie wäre es, wenn du das Projekt einfach mal zum Testen anhängst?
Ach so: Du meinst die Delphi 2005 Personal?
SpaghettiCodix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Sa 06.10.07 16:29 
[quote="user profile iconjaenicke"]
user profile iconSpaghettiCodix hat folgendes geschrieben:

Bei mir funktioniert das jedenfalls so, Delphi hat da kein Problem mit. Wie wäre es, wenn du das Projekt einfach mal zum Testen anhängst?
Ach so: Du meinst die Delphi 2005 Personal?


Ja Delphi 2005 Personal. Ich habe die Unit doch eingefügt.
Delphi hängt sich während dem Compilieren auf und gibt nur die Meldung: 'Fehler an Adresse:XXXX' usw. aus. Mußte danach einen Kaltstart des Rechners durchführen.

Hier nochmal das Wesentliche:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type
 TRechteck = record
 Rct:TRect;
 lang:byte;                                     //<-soll 1 zugewiesen werden
 breit:byte;
 txt:shortstring;
 farbe:TColor;
 number:byte;
end;
.............

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
    MyRect:array of TRechteck;                      //<- das Array
begin
 For i:= 0 to 48 do MyRect[i].lang:=1;              //<- füllen
end;
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Sa 06.10.07 16:33 
Bei dynamischen Arrays muss noch die Länge per SetLength gesetzt werden!

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 06.10.07 16:49 
Das ist klar, aber der Fehler würde ja erst nach dem Kompilieren auftreten, wenn das Programm bereits läuft und der Knopf gedrückt wird. Er hat aber geschrieben, dass Delphi selbst bereits beim Kompilieren abstürzt.

Bei mir passiert das jedenfalls nicht, ich kann ein Programm mit dem geposteten Quelltext in Delphi 2005 kompilieren. Dass das Programm nachdem es nach dem Kompilieren gestartet wurde und nachdem der Knopf darin gedrückt wurde abstürzt, ist ja klar. Aber das ist ja nochmal eine andere Sache.
SpaghettiCodix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Sa 06.10.07 17:05 
user profile iconjakobwenzel hat folgendes geschrieben:
Bei dynamischen Arrays muss noch die Länge per SetLength gesetzt werden!


Ja, das wars. Jetzt gehts. Habe jetzt aber ein Zeigerproblem.

Meldung: Ungültige Zeigeroperation.

Und zwar hier:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
type
TRechteck = record
Rct:TRect;                          //<---------
lang:byte;
breit:byte;
txt:shortstring;
farbe:TColor;
number:byte;
end;
........

Procedure TForm1.Proz2;
var
  i,z,Reihe:integer;
    Rect:TRect;                                  //<------
begin
z:=0; Reihe:=1;
 for i:=1 to 48 do
 begin
  inc(z);
  if (10+(z*20)) >= (Form1.clientheight - 30) then
  begin
     inc(Reihe); z:=1;
  end;
    rect.Left:=110*Reihe; Rect.Bottom:=10+(z*20);
    rect.Right:=80+(110*Reihe); Rect.Top:=35+(z*20);
    Form1.Canvas.Rectangle(rect.Left,rect.bottom,rect.right,rect.top);
    Form1.Canvas.TextOut(rect.Left+2,rect.bottom+2,inttostr(10+(z*20))+'   '+inttostr(i));
    setlength(Myrect,48);
    with MyRect[i] do
    begin
    rct.left:=rect.left;        //<- ohne diese Anweisung funzt alles ?!!?
    rct.bottom:=rect.bottom;    //<- Einwandfrei
    farbe:=clred;
    lang:=i;
    end;
 end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 06.10.07 17:08 
Erstens solltest du die Länge außerhalb der Schleife vorher setzen, zweitens geht deine Schleife von 1 bis 48, bei einem Array der Länge 48 gehen die Indizes aber von 0 bis 47.

Aber warum hast du denn geschrieben, dass Delphi beim Kompilieren abstürzt, wenn doch das Programm fertig kompiliert und ausgeführt wird und dann erst bei einem Klick auf den Button ein Laufzeitfehler auftritt?^^
SpaghettiCodix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Sa 06.10.07 18:06 
user profile iconjaenicke hat folgendes geschrieben:
Erstens solltest du die Länge außerhalb der Schleife vorher setzen, zweitens geht deine Schleife von 1 bis 48, bei einem Array der Länge 48 gehen die Indizes aber von 0 bis 47.

Aber warum hast du denn geschrieben, dass Delphi beim Kompilieren abstürzt, wenn doch das Programm fertig kompiliert und ausgeführt wird und dann erst bei einem Klick auf den Button ein Laufzeitfehler auftritt?^^


Stimmt, der Absturz war erst, nachdem ich den Button angeklickt hatte, sorry.
Aber wie schon gesagt, hatte ich die Funktion 'SetLength' vergessen.

Der jetztige Zeigerfehler macht mir allerdings Kopfzerbrechen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 with MyRect[i] do
    begin
    rct.left:=rect.left;               <- hier gibt es ne fehlerhafte Zeigeroperation
    rct.bottom:=rect.bottom;           <- das hier funzt einwandfrei - WARUM?
    farbe:=clred;
    lang:=i;
    end;
SpaghettiCodix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Sa 06.10.07 18:21 
Ich habs.

Habe das globale Array gelöscht und habe es in der Funktion deklariert.
Jetzt funzt es :-)
Wahrscheinlich sollte man 'Myrect:Array of TRechteck'.... und 'setlength(Myrect,48)
im selben Bereich haben.

Ist das ein Problem, wenn das Array 0..48 und die Schleife 1 bis 48 ist?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 06.10.07 19:51 
Ja, ist es, da das Array 0..47 und deine Schleife 1..48 ist ... Damit greifst Du auf EIN Element HINTER dem Speicher des Arrays zu --> Boom!

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
SpaghettiCodix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52
Erhaltene Danke: 1

WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
BeitragVerfasst: Sa 06.10.07 21:10 
user profile iconBenBE hat folgendes geschrieben:
Ja, ist es, da das Array 0..47 und deine Schleife 1..48 ist ... Damit greifst Du auf EIN Element HINTER dem Speicher des Arrays zu --> Boom!


Euch allen vielen Dank :-)

Es hat gefunzt. Ich lasse die Schleife von 0 bis 47 zählen.