![]() |
Programm hängt sich beim Start auf
Hallo zusammen,
ich habe schon wieder ein Problem, das ich bislang noch nicht lösen konnte: Beim Start wird beim Erzeugen einer Zentralen Verwaltungsklasse einmal ein Objekt zum Managen diverser typisierter Dateien sowie in einer For-Schleife eine Liste mit Objekten einer Steuerungsklasse gefüllt und dieser klein ein Indexwert zugewiesen. Jede Steuerungsklasse soll jetzt jeweils ihre Informationen aus der Dateiverwaltungsklasse nehmen, die auf die Dateien zugriff hat. Der Rückgabewert dieser Funktion ist ein Array, aus welcher sich die Steuerungsklasse mithilfe des Indexes ihre Werte nehmen kann(ich weiß, das ist nicht besonders effizient, besser wäre es nur den gewünschten Datensatz sich geben zu lassen, aber bislang funktioniert das problemlos, vielleicht werde ich es auch noch umprogrammieren). Wenn allerdings noch nichts in der Datei steht, wird ein leeres Array übergeben, dies wird geprüft und dann sollen Standardwerte in die Datei geschrieben werden. Problem ist jetzt folgendes: Dadurch, dass mehrere Objekte der Steuerungsklasse erzeugt werden, ist das Array beim Create des 2. Objektes mit einem Datenpaket bereits gefüllt, deswegen gilt
Delphi-Quellcode:
nicht mehr. Dies habe ich versucht durch ein
high(Array)<0
Delphi-Quellcode:
zu lösen. Diese Änderung bewirkt allerdings, dass sich das Programm bereits beim Start aufhängt (Unter Mac: Das Docksymbol hüpft aufgeregt ohne dass sich was tut) und das ohne jegliche Fehlermeldung. Die Prozessorauslastung geht dabei auf ca.90% hoch.
high(Array)<Index
Hier mal der Code:
Delphi-Quellcode:
Hier der entsprechenden Funktionen zur Dateispeicherung/Laden:
var ZwischenSpeicherDatensatz: TMyRecord
begin BufferArray:= DateiVerwaltung.DateiLaden; if high(BufferArray)<Index then //Hier ist Das Problem begin ZwischenSpecherDatensatz.Var1:= ... {Hier entsprechende Zuweisungen} DateiVerwaltung.DateiAktualisieren(Index, ZwischenSpeicherDatensatz); Exit; end; //Die Felder werden aus dem BufferArray gefüllt FVar1:=BufferArray[Index].Var1 {Hier weitere Zuweisungen} end;
Delphi-Quellcode:
Wenn ich mit dem Debugger drüber gehe, springt er genau bei der markierten Zeile heraus, bei
procedure TDateiVerwaltung.DateiAktualisieren(Index: integer; Datensatz: TMyRecord);
begin try seek(FFile, Index); write(FFile, Datensatz); except showmessage('Problem beim speichern der Datei'); end; end; //und function TDateiVerwaltung.DateiLaden: TMyArray; //Dynamisches Array var DatenArray: TMyArray; Datensatz: TMyRecord; Index, FileIndex: integer; begin try FileIndex:= System.FileSize(FFile)-1; if FileIndex < 0 then exit; //Falls die Datei noch leer ist, wird nichts zurückgegeben. (Dies muss beim Aufruf berücksichtigt werden) Index:= 0; repeat seek(FFile, Index); read(FFile, Datensatz); SetLength(DatenArray, Index+1); //Daten werden ins Array geschrieben DatenArray[Index].Var1:= Datensatz.Var1; {weitere Zuweisungen} until eof(FFile); result:= DatenArray; except showmessage('Problem beim Laden der Datei'); end; end;
Delphi-Quellcode:
gibt es kein Problem.
high(Array)<0
Sämtliche Objekte sind alle korrekt instanziert, da ist nirgenwo ein Fehlzugriff auf ein (noch) nicht vorhandenes Objekt. Schönes Wochenende |
AW: Programm hängt sich beim Start auf
Delphi-Quellcode:
Du verwendest da zwei verschiedene Arrays. Willst du das wirklich?
SetLength(TempLokArray, Index+1);
//Daten werden ins Array geschrieben Array[Index].Var1:= Datensatz.Var1; Übrigens: Man verwendet nicht einfach den Variablennamen Array! |
AW: Programm hängt sich beim Start auf
Kann man im FPC auch eine Bereichsprüfung aktivieren?
![]() Wenn ja, dann solltest du das dringend mal machen. |
AW: Programm hängt sich beim Start auf
Zitat:
Wird natürlich sofort korrigiert. Das mit dem Bereichscheck habe ich jetzt mal oberflächlich schnell probiert, bei dem Fall
Delphi-Quellcode:
kommen zwar Fehlermeldungen, die ich im einzelnen jetzt nicht analysiert habe, das muss ich dann noch mal ganz in Ruhe morgen machen; Aber im anderen Fall
high(BufferArray)<0
Delphi-Quellcode:
wie gewohnt keine Fehlermeldung, nur hüpfendes Icon. Wie gesagt, ich werde mich morgen damit noch mal in Ruhe auseinandersetzen.
high(BufferArray)<Index
[EDIT] Ich weiß jetzt doch, warum bei der Bereichsprüfung im 1. Fall ein Fehler auftritt. Während der 1. Durchlauf noch "richtig" durchläuft, steht im Zweiten ja schon etwas in der Datei drin, deswegen gilt nicht mehr high(BufferArray)<0 und das Programm springt gleich in den Text zum auslesen der Daten und will auf Bufferarray[1] zugreifen, geht nicht, da Bufferarray ja nur ein Objekt beinhaltet. Das nur so am Rande. |
AW: Programm hängt sich beim Start auf
Zitat:
Zitat:
Delphi-Quellcode:
auf ein "richtiges" Element zugegriffen wird und dir nicht sowas wie einen Buffer-Overflow einfängst und dabei womöglich noch ürgendwas Anderes überschreibst oder auf einen nichtexistierenden Speicherbereich triffst.
TempLokArray[Index].
Zitat:
|
AW: Programm hängt sich beim Start auf
Zitat:
Zitat:
Wenn ich mit dem Debugger Zeile für Zeile durchgehe tritt der Fehler genau bei
Delphi-Quellcode:
auf.
if high(BufferArray)<Index then
Ich vermute auch, dass der Fehler evt. bei der Datei liegen könnte, denn exakt dasselbe hatte ich schon mal, da war durch Fehlbedienung diese Datei zerschossen, bzw. nicht richtig befüllt/ geleert worden. Ein löschen der Datei hatte damals den Fehler behoben. |
AW: Programm hängt sich beim Start auf
Zitat:
In dieser gezeigten Code-Zeile kann eigentlich nichts falsch sein und es kann da auch keine Exception auftreten, außer - BufferArray und Index sind Felder eines Objektes und das Objekt ist nicht initialisiert/vorhanden. - z.B. durch Buffer-Overflow wurde das Array zerschossen, oder das Parent-Objekt, in welchem die Variable drin steckt. Wenn man mit F8/F9 in die Exception reinrennt, dann springt der Debugger gern mal die nächste Zeile (Nja, die Rücksprungadresse aus'm Stacktrace zeigt ja auch auf diese Zeile), aber der Fehler ist eigentlich schon etwas weiter vorne, oder in einem untergeordneten Funktionsaufruf. |
AW: Programm hängt sich beim Start auf
Zitat:
Delphi-Quellcode:
weiter zu
BufferArray:= DateiVerwaltung.DateiLaden;
Delphi-Quellcode:
gehen will, verschwindet der Cursor, wie wenn man CTRL-R drücken würde (ich weiß nicht welcher Befehl das in Delphi ist). Danach kommt, wie gesagt, nichts und das Programm startet nicht bzw. bleibt hängen beim Start. Deswegen weiß ich auch nicht, was genau dann passiert. Ich kann mal den Code posten, wo die Steuerungsklasse instanziert wird:
if high(BufferArray)<Index then
Delphi-Quellcode:
so wird praktisch für jeden Infoarrayeintrag parallel ein Listeneintrag mit dem Steuerungsobjekt gemacht.
procedure TVerwaltung.InfosLesen; //Die Verwaltungsklasse liest für sich aus einer 2. Datei Infos aus und packt sie in ein Array, da liegt auch nicht das Problem
var DatIndex, Index: integer; InfoDatensatz: TInfos; begin Index:= System.FileSize(InfoDatei)-1; if Index<0 then exit else begin DatIndex := 0; repeat seek(InfoDatei, DatIndex); read(InfoDatei, InfoDatensatz); SetLength(Infoarray, DatIndex+1); //infos werden ausgelesen InfoArray[DatIndex].Var1:=InfoDatensatz.Var1; {usw} Steuerungsklasse:= TSteuerungsklasse.Create(DatIndex, StrToInt(InfoArray[DatIndex].Var1));//Zwei Parameter werden übergeben SteuerungsObjektList.Add(Steuerungsklasse); DatIndex:=DatIndex+1; until eof(InfoDatei); end; end; Hier noch die Create- Methode der Steuerungsklasse:
Delphi-Quellcode:
inherited Create;
Index:= aIndex; //übegeben durch Parameter FVar1:= aVar1; {weitere Standardwerte werden initialisiert} //Dann wird die Oben genannte Methode aufgerufen DatenLaden; |
AW: Programm hängt sich beim Start auf
Zitat:
Ctrl+R ist dort Suchen+Ersetzen. (Replease) Meinst du sowas wie Reset? (Programm abbrechen) Lokale Variable "Index" in InfoLesen und nochmal ein gleichnamiges Feld "Index" in der Klasse? Oder ist das "Index" der Crate.Methode was Anderes? Auf was steht Infoarray, wenn mit Exit das InfoLesen verlassen wird? - Array immer leer, wenn nichts gelesen wurde - Read verschiebt die Position zum nächsten Eintrag, also braucht man es auch nur einmal am Anfang zu positionieren - eine kopfseitig geprüfte Schleife funktioniert auch mit leeren Mengen
Delphi-Quellcode:
- Arraygröße vorher bestimmen
SetLength(InfoArray, 0);
seek(InfoDatei, 0); DatIndex := 0; while not eof(InfoDatei) do begin read(InfoDatei, InfoDatensatz); SetLength(InfoArray, DatIndex+1); //infos werden ausgelesen InfoArray[DatIndex].Var1:=InfoDatensatz.Var1; {usw} Steuerungsklasse:= TSteuerungsklasse.Create(DatIndex, StrToInt(InfoArray[DatIndex].Var1));//Zwei Parameter werden übergeben SteuerungsObjektList.Add(Steuerungsklasse); Inc(DatIndex); end;
Delphi-Quellcode:
Und ich hoffe mal, InfoArray enthält keine bösen Zeigertypen oder kompilerabhängige Typen, welche sich gern mal verändern, z.B. bei Umstellung auf Unicode oder 64 Bit.
SetLength(InfoArray, System.FileSize(InfoDatei));
seek(InfoDatei, 0); DatIndex := 0; while not eof(InfoDatei) do begin read(InfoDatei, InfoDatensatz); //infos werden ausgelesen InfoArray[DatIndex].Var1:=InfoDatensatz.Var1; {usw} Steuerungsklasse:= TSteuerungsklasse.Create(DatIndex, StrToInt(InfoArray[DatIndex].Var1));//Zwei Parameter werden übergeben SteuerungsObjektList.Add(Steuerungsklasse); Inc(DatIndex); end; |
AW: Programm hängt sich beim Start auf
Ctrl-R ist blödsinn, :oops: ich meine natürlich Cmd-R. Das ist bei mir "Start". In meinem Fall jetzt sind in der InfoDatei 4 Einträge, also wird die Schleife 4 mal durchlaufen und das Array mit 4 Einträgen gefüllt. Wenn Nichts in der InfoDatei drin steht, bricht der Ladevorgang ab. Somit ist auch Array nichts.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz