Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Access Violation bei "SetLength"
Shrea - Sa 29.10.11 16:45
Titel: Access Violation bei "SetLength"
Hallo zusammen,
ich als Neuling in Delphi (und im Forum ;)) programmiere derzeit eine Physik.-Simulation.
Dabei habe ich in meiner Klasse "TStar" ein dynamisches Array. Wenn ich die Funktion "SetLenght" nun ausführe kriege ich eine AccessViolation. Zusammengefasst sieht das so aus:
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:
| unit stern;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, global, math; type dist = array of extended;
type Tstar = class(TFrame) Image1: TImage; private d: dist;
public procedure start(stz:integer);
implementation
procedure TStar.start(stz:integer);
var stz: integer; begin stz:= 5; setlength(d, stz); end;
end. |
Ich wäre euch sehr dankbar könntet ihr mir mit meinem kleinen Problemchen helfen
Grüße
guinnes - Sa 29.10.11 17:46
Du mußt erst eine Instanz von TStar erzeugen
Shrea - Sa 29.10.11 17:48
TStar wird davor erzeugt... um genau zu sein "stz" mal.
Delphi-Quelltext
1:
| (FindComponent('s'+IntToStr(a)) as TStar).start(stz); |
Damit rufe ich dann die Procedure auf. (Im Debugger sagt er mir das "d" ein nicht verfügbarer Wert ist?!)
Boldar - Sa 29.10.11 17:56
Zeig doch mal den Code wo du TStar erzeugst...
Shrea - Sa 29.10.11 17:57
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); var a,b:integer; . . . for a:=1 to stz do begin star:=TStar.Create(form1.TabSheet2); star.Parent:=Form1.TabSheet2; star.Name:='s'+inttostr(a); star.Show; end; . . . for a:=1 to stz do (FindComponent('s'+IntToStr(a)) as TStar).start(stz); end; |
guinnes - Sa 29.10.11 18:04
Ich frage mich, warum du der Methode Start ein stz übergibst und dann noch ein stz lokal deklarierst
Shrea - Sa 29.10.11 18:06
Siehe Zeile 23 erster Post. Das habe ich nur zur Veranschaulichung getan damit man weis das "stz" deklariert ist!
guinnes - Sa 29.10.11 18:25
Shrea hat folgendes geschrieben : |
Siehe Zeile 23 erster Post. Das habe ich nur zur Veranschaulichung getan damit man weis das "stz" deklariert ist! |
Das meine ich nicht, sondern :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TStar.start(stz:integer);
var stz: integer; begin stz:= 5; setlength(d, stz); end; |
Du übergibst der Methode als Parameter das stz, benutzt es aber nicht, sondern setzt dein eigenes stz. Das ist sicher nicht der Fehler, ist aber extrem fehleranfällig. Dazu wäre die genaue Fehlermeldung ( mit der Adresse ! ) recht hilfreich
Shrea - Sa 29.10.11 18:31
Die Übergabe habe ich gerade entfernt und die Deklaration auch (Da sie wie gesagt global festgelegt ist). Die Fehlermeldung lautet:
"Im Projekt cluster.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: Zugriffsverletzung bei Addresse 00404D80 in Modul 'cluster.exe'.
Lesen von Adresse 000002C4. Prozess wurde angehalten. Mit Einzelanweisung oder Start forsetzten"
Bergmann89 - Sa 29.10.11 18:49
Hey,
FindComponent kann auch nil liefern. Also ebntweder prupfst du das vorher, oder du baust es bisl um, sodass es etwas sinnvoller (und vorallem schneller) ist. Mach dir ein Array of TStar, das deine Star-Objekte speichert. Und da kannst du dann deine Objekte direkt raus holen. Das mit dem FindComponent funktioniert glaueb nur, wenn du die Objekte in der IDE zusammenklickst (bin mir aber grad net sicher).
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var StarArr: array of TStar;
SetLength(StarArr, stz) for a := 0 to High(StarArr) do begin StarArr[i] := TStar.Create(form1.TabSheet2); StarArr[i].Parent := Form1.TabSheet2; StarArr[i].Name := 's'+inttostr(a); StarArr[i].Show; end;
for a := 0 to High(StarArr) do StarArr[i].start(stz); end; |
MfG Bergmann.
guinnes - So 30.10.11 18:46
Jetzt habe ich es gesehen :
Wenn der Owner Tabsheet2 ist, so mußt du natürlich auch im Tabsheet2 nachkucken ( FindKomponent vom Tabsheet2 benutzen ), Aber der Bergmann hat recht, ein Array ist schneller und sicherer
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!