Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 09, 2025 18:16

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: (Zeiger)Fehler bei Programmende
BeitragVerfasst: So Nov 09, 2003 11:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Ein "Hilfe:" im Titel ist nicht notwendig. Bitte in Zukunft weglassen - Delphic

ICh hab nen sehr komischen und nervenden Fehler der seit neustem plötzlich auftritt. und zwar erst, wenn cih das Programm beende. Also wenn ich rechts oben auf das "x" klicke, kommt so etwas:
Code:
  1.  
  2. Im Projekt xy ist eine Exception der Klasse EInvalidPointer aufgetreten. Meldung: 'Ungültige Zeigeroperation'. [..]
  3.  

und zwar sehr oft.
Dieser Fehler macht mein ganze Programm kaputt und ich kann in keiner Weise nachvollziehen, wo das Problem liegen soll, mit Zeigern mach ich eigentlich nichts.
Ich rufe größtenteils für die Instanz einer Klasse den Konstruktor auf, fürher ging das aber auch ohne Fehler:

Code:
  1.  
  2. //[...]
  3. var
  4.      objekt : meineklasse;
  5. //[...]
  6. procedure TForm1.ButtonInitClick(Sender: TObject);
  7. begin
  8.  
  9.   objekt:=meineklasse.Create(1,1);
  10.   timer1.Enabled:=true;
  11.  
  12. end;
  13.  
  14.  


Über Hilfe, woran dieser Fehler liegen könnte, wäre ich sehr dankbar

MfG Mindwalker

Edit: Ach ja, ich reserviere auch nirgendwo zusätzlich dynamisch Speicher. Auch ruf ich keinen destruktor oder so auf

Edit2: Der Fehler kommt nur, wenn ich, wie oben im Code geschrieben, den Konstruktor aufrufe....

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 11:35 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
ich seh jetzt nicht ganz genau, wo das objekt deklariert ist, aber gibst du das objekt danach auch sauber frei? Wenn ja, hast du ausprobiert danach noch objekt := nil zu setzen? Das hilft manchmal wunder. Und schau, dass du alle Compilerschalter anhast, die beim debuggen helfen und vielleicht hilft auch MemProof.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 12:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich kenne diesen Fehler nur wenn man sich intern irgendwelche Pointer zerschießt und Delphi am Programmende alles wieder frei geben will. Kann es sein, dass du dein Objekt irgendwo zerschießt?

Ich glaube ehrlich gesagt nicht so ganz, dass es genau mit der Klasse (bzw dessen Erstellung) zu tun hat. Ich glaube eher, das es im Zusammenspiel mit der Klasse passiert (also im näheren Umfeld der Klasse). Aber das kann man so auf blauen Dunst herraus schlecht sagen.

PS: Wie schaut denn der Konstruktor deiner Klasse aus? Hast du das inherited aufgerufen?

PPS: In Delphi ist es unoffiziell Standard ein T vor einem Klassenname zu setzen. Das erleichtert Dritte deine Quellen besser zu verstehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 12:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
delphic hat geschrieben:
ich seh jetzt nicht ganz genau, wo das objekt deklariert ist, aber gibst du das objekt danach auch sauber frei?

Das Objekt wird unter Interface deklariert. Ich geb eigentlich gar nichts frei, ich geh mal davon aus, dass der automatische Destruktor am programmende automatisch aufegrufen wird. Ist bei C++ auf jeden Fall so.

Lossy hat geschrieben:
Also ich kenne diesen Fehler nur wenn man sich intern irgendwelche Pointer zerschießt und Delphi am Programmende alles wieder frei geben will. Kann es sein, dass du dein Objekt irgendwo zerschießt?

Inwiefern zerschießen? Ich übergeb nur einmal den Objektpointer an den Thread, wie du mir es vorgeschlagen hast, aber der Fehler tritt auch auf, wenn ich den Thread nicht aufrufe. Außerdem ging es früher ja auch so.

Ich benutze aber auch keine Pointer...
Zitat:
Ich glaube ehrlich gesagt nicht so ganz, dass es genau mit der Klasse (bzw dessen Erstellung) zu tun hat. Ich glaube eher, das es im Zusammenspiel mit der Klasse passiert (also im näheren Umfeld der Klasse). Aber das kann man so auf blauen Dunst herraus schlecht sagen.

Könnte es vieleicht an irgendwelchen "propertys" hängen. Mir fällt leider nichts "nicht triviales" ein, was ich geändert habe und was den Fehler verursachen könnte... naja, ich schaus mir noch mal durch. Wenn ich die klasse hier poste, wirds vieleicht etwas viel.

Zitat:
PS: Wie schaut denn der Konstruktor deiner Klasse aus? Hast du das inherited aufgerufen?

ich weiß jetzt nicht, was inherited ist, aber so sieht es aus

Code:
  1. constructor Emotor.Create( input_port_,output_port_:integer);
  2. var i,j:integer;
  3. begin
  4.  
  5.   input_port:=input_port_;
  6.   output_port:=output_port_;
  7.   //usw
  8.  
  9. end;
  10.  

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 12:50 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Zitat:
Das Objekt wird unter Interface deklariert. Ich geb eigentlich gar nichts frei, ich geh mal davon aus, dass der automatische Destruktor am programmende automatisch aufegrufen wird. Ist bei C++ auf jeden Fall so.


Ein automatisches Freigeben von Objekten erfolgt in der Regel nicht. Manuell erstelle Objekte müßen auch manuell frei gegeben werden.

Bist Du Dir sicher, das Du keine Objekte oder reservierte Handles frei gibst? Solche Fehler am Programmende werden meistens durch Doppelfreigaben ausgelöst.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 12:53 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
KidPaddle hat geschrieben:
Zitat:
Das Objekt wird unter Interface deklariert. Ich geb eigentlich gar nichts frei, ich geh mal davon aus, dass der automatische Destruktor am programmende automatisch aufegrufen wird. Ist bei C++ auf jeden Fall so.


Ein automatisches Freigeben von Objekten erfolgt in der Regel nicht. Manuell erstelle Objekte müßen auch manuell frei gegeben werden.

Bist Du Dir sicher, das Du keine Objekte oder reservierte Handles frei gibst? Solche Fehler am Programmende werden meistens durch Doppelfreigaben ausgelöst.

Gruß
KidPaddle


hmm, das Objekt ist ja nicht manuell erstellt. Nur der konstruktor wird manuell aufgerufen.
Wie könnte ich das Objekt denn freigeben? Vieleicht hilft es ja...

Ja ich bin mir sicher :-)
Ich hab ja nur dieses Objekt

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 13:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also beim Überschreiben des Konstruktors solltest du IMMER auch den konstruktor des Grundobjektes aufrufen.
Code:
  1. constructor Create(...);
  2. begin
  3.   inherited Create;
  4.   ...
  5. end;

Das inherited sorgt dafür, dass die selbige Methode aus der direkten Vorfahrenklasse aufgerufen wird.

Klassen werden nicht automatisch frei gegeben. (Nur interface aber das ist ein ganz anderes Thema) Hatte vorhin auch was Falsches gesagt. Nicht Delphi löscht es sondern Windows. Aber da du es ja gar nicht frei gibst kann es nicht das Problem sein.
Aber versuch erst einmal das inherited. Wenn das nicht klappt wäre es evtl auch sinnvoller, wenn du mal die betreffenden Quellen (als zip) hoch lädst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
hat leider nichts gebracht :cry:
Also ich hab jetzt mal die Klassendatei angehängt... ist leider noch sehr chaotisch, naja und auch nicht gerade wenig. Das ganze soll einen Motor über die serielle Schnittstelle steuern... das funktioniert auch halbwegs.
Wahrscheinlich stehen da trotzdem auch noch einige andere Fehler drinnen.
Danke schon mal für die Hilfe.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 14:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was verwendest du eigentlich für ein Betriessystem?

Du wirst dich fragen weswegen ich das wissen will. Und zwar ist es bei NT (NT4, 2K, XP) so, dass du nicht direkt auf Ports zugreifen kannst. Also ich meine da war so etwas. Will dafür meine Hand dafür nicht ins Feuer legen. Aber ich meine ich hätte so etwas mal gehört. Ich kann nicht sagen (wenn dem so ist) ob es einfluss auf dein Programm hat. Aber vielleicht kannst du dein Programm ja mal ohne die Inport funktion ausführen. Ist aber nur eine wage Vermutung.

Ich habe mir aber mal deine Quelle angesehen. Bei dem Thread empfielt es sich eigentlich das FreeOnTerminate vor dem Resume zu setzen. Das dürfte aber für den Fehler nicht verantwortlich sein. Du hattest ja gesagt, dass der einzige der auf die Klasse zugreift der Thread sein wird. Mir fällt gerade ein, dass du die Motorenklasse auch direkt am anfang von dem Thread erstellen könntest. Und am Ende Logischerweise wieder frei geben.

PS: Du solltest in der Tat mal deine Quellen ein wenig aufräumen. Speziell was die Benennung deiner Variablen angeht. Private Variablen haben eigentlich als Prefix ein F oder F_. Das aber nur mal am Rande.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Ich versteh nicht, wie es Delphi immer schafft mich an den Rand der Verzweiflung zu treiben. Ich muss das Programm morgen fertig haben... und jetzt so etwas.
Auch wenn Windows XP etwas gegen Ports oder so hat, es funktioniert doch alles so gut wie perfekt, außer diesem Fehler bei Programmende.

Ich hab deine Tips jetzt noch beachtet. Die Motorklasse im Thread zu erstellen passt aber nciht so richtig, weil der Motor ja auch weiterhin "existiert" und den Thread je nach belieben starte und beenden soll (je nach dem was der Motor gerade macht), außerdem sollen ggf. auch mehrer Objektinstanzen erstellt werden können und einen Thread benutzen.

Übrigens Ich hab jetzt den Konstruktor Aufruf jetzt unter FormCreate geschrieben.. oder gibt es da bessere Alternativen?

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
Ich hab gerade gemerkt, dass nach dem Zeigerfehler noch ganz viele "Zugriffsverletzungsfehler" kommen. Vieleicht hilft das ja jemanden bei der Fehleranalyse.
Ich hoffe gerade nur noch darauf, dass der Fehler so verschwindet, wie er auch gekommen ist :cry:

Edit: Gibt es vieleicht irgend ne Möglichkeit, die Fehlerquelle zu lokalisieren? Vieleicht kann mir Delphi ja irgendwie helfen anstatt nur so nen allgemeinen Fehler zu nennen. Ich hab übrigens Delphi 3pro

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Zuletzt geändert von Mindwalker am So Nov 09, 2003 16:12, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 16:09 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
lass delphi mal alle projektdateien neu compilieren("projekt neu erzeugen"). und dann könnte vielleicht MemProof weiterhelfen, um herauszufinden,w ers krachen lässt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Mai 31, 2003 23:59
Beiträge: 42
So, ich hab mir jetzt mal das programm runtergeladen und die Anleitung durchgelesen und mein Delphi dementsprechend angepasst.

Jetzt zeigt mir Delphi nettwerweise auch wo die Fehler liegen! Das ist doch schon mal ein Fortschritt. Ich kann damit zwar trotzdem nicht viel anfangen, da ich den zusammenhang zu meinem Programm nicht sehe, aber ich hoffe ihr könnt mir helfen:

hier kommt der zeigerfehler aus der Datei Control:
Code:
  1.  
  2. procedure TWinControl.Remove(AControl: TControl);
  3. begin
  4.   if AControl is TWinControl then
  5.   begin
  6.     ListRemove(FTabList, AControl);
  7.     ListRemove(FWinControls, AControl); //hier wird er angezeigt
  8.   end else
  9.     ListRemove(FControls, AControl);
  10.   AControl.FParent := nil;
  11. end;
  12.  


Und hier kommen sehr viele Ausnahme fehler, immer wieder:
Code:
  1.  
  2. function TCustomCheckBox.GetChecked: Boolean;
  3. begin
  4.   Result := State = cbChecked;  //hier
  5. end;
  6.  

Und ich hab doch nur zwei Checkboxen??
Anscheinend liegt es wohl an der VCL oder?
Vieleicht behebt sich das Problem wenn ich die Gui nochmal neu aufbau.

Sehr komisch aber. Naja, vieleicht hat Delphi 3 noch viele "tolle" Bugs.[/code]

_________________
"OpenGL verbindet"<br>- für die Völkerverständigung zwischen Delphi und C++ ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 16:49 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Ich habe einige Zeit mit D3 gearbeitet und keine größeren Bugs bemerkt. Stell doch mal bitte das komplette Projekt bereit, damit man sich den Fehler ansehen kann.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2003 16:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich glaube mal auch nicht, dass es an Delphi liegt. Ich kann mir aber durchaus vorstellen, dass es irgendwie deinen Objekte im Speicher zerlegt. Also, dass du durch welche operationen auch immer in einen Fremden Speicher gerätzt und dadurch dessen Inhalt zerstörst. Dabei kann so etwas dann auch auftreten. Schuld für so etwas kann auch ein Überschrittenes Array sein.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]