| Autor |
Beitrag |
SpaghettiCodix
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: 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?
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 06.10.07 16:18
SpaghettiCodix 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 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Sa 06.10.07 16:29
[quote=" jaenicke"] SpaghettiCodix 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: 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; breit:byte; txt:shortstring; farbe:TColor; number:byte; end; .............
procedure TForm1.Button1Click(Sender: TObject); var i:Integer; MyRect:array of TRechteck; begin For i:= 0 to 48 do MyRect[i].lang:=1; end; |
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Sa 06.10.07 17:05
jakobwenzel 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: 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; rct.bottom:=rect.bottom; farbe:=clred; lang:=i; end; end; |
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Sa 06.10.07 18:06
jaenicke 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. 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 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: 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,4
im selben Bereich haben.
Ist das ein Problem, wenn das Array 0..48 und die Schleife 1 bis 48 ist?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 52
Erhaltene Danke: 1
WIN XP
Delphi 2 Standart und Delphi 2005 Pers.
|
Verfasst: Sa 06.10.07 21:10
BenBE 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.
|
|