AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Programm hängt sich beim Start auf

Programm hängt sich beim Start auf

Ein Thema von TForm1 · begonnen am 2. Mai 2014 · letzter Beitrag vom 3. Mai 2014
Antwort Antwort
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#1

Programm hängt sich beim Start auf

  Alt 2. Mai 2014, 17:35
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 high(Array)<0 nicht mehr. Dies habe ich versucht durch ein high(Array)<Index 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.
Hier mal der Code:
Delphi-Quellcode:
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;
Hier der entsprechenden Funktionen zur Dateispeicherung/Laden:
Delphi-Quellcode:
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;
Wenn ich mit dem Debugger drüber gehe, springt er genau bei der markierten Zeile heraus, bei high(Array)<0 gibt es kein Problem.
Sämtliche Objekte sind alle korrekt instanziert, da ist nirgenwo ein Fehlzugriff auf ein (noch) nicht vorhandenes Objekt.

Schönes Wochenende
Der Fehler sitzt immer vor dem Computer...

Geändert von TForm1 ( 2. Mai 2014 um 21:16 Uhr) Grund: Fehler im Code
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.048 Beiträge
 
Delphi 12 Athens
 
#2

AW: Programm hängt sich beim Start auf

  Alt 2. Mai 2014, 20:16
Delphi-Quellcode:
    SetLength(TempLokArray, Index+1);
    //Daten werden ins Array geschrieben
    Array[Index].Var1:= Datensatz.Var1;
Du verwendest da zwei verschiedene Arrays. Willst du das wirklich?

Übrigens: Man verwendet nicht einfach den Variablennamen Array!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.201 Beiträge
 
Delphi 12 Athens
 
#3

AW: Programm hängt sich beim Start auf

  Alt 2. Mai 2014, 20:43
Kann man im FPC auch eine Bereichsprüfung aktivieren?
http://docwiki.embarcadero.com/RADSt...erpr%C3%BCfung

Wenn ja, dann solltest du das dringend mal machen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Programm hängt sich beim Start auf

  Alt 2. Mai 2014, 21:12
Delphi-Quellcode:
    SetLength(TempLokArray, Index+1);
    //Daten werden ins Array geschrieben
    Array[Index].Var1:= Datensatz.Var1;
Du verwendest da zwei verschiedene Arrays. Willst du das wirklich?

Übrigens: Man verwendet nicht einfach den Variablennamen Array!
Oh, das ist natürlich ein Schreibfehler, den Code aus meinem Programm habe ich nachträglich noch verändert. Und dass man nicht Array als Variablenbezeichnung verwenden sollte, ist mir auch klar, sonst wäre mein Problem erst gar nicht aufgetreten und ich würde mich noch mit merkwürdigen Compilermeldungen rumärgern .
Wird natürlich sofort korrigiert.

Das mit dem Bereichscheck habe ich jetzt mal oberflächlich schnell probiert, bei dem Fall high(BufferArray)<0 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)<Index wie gewohnt keine Fehlermeldung, nur hüpfendes Icon. Wie gesagt, ich werde mich morgen damit noch mal in Ruhe auseinandersetzen.

[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.
Der Fehler sitzt immer vor dem Computer...

Geändert von TForm1 ( 2. Mai 2014 um 21:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.201 Beiträge
 
Delphi 12 Athens
 
#5

AW: Programm hängt sich beim Start auf

  Alt 3. Mai 2014, 04:35
den Code aus meinem Programm habe ich nachträglich noch verändert.
Wäre es da nicht einfacher/besser den "eigentlichen" Code zu posten?

Aber im anderen Fall ... keine Fehlermeldung
Es geht dabei nicht unbedingt auf Meldungen des Compilers, sondern darum, osb man bei TempLokArray[Index]. 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.

und will auf Bufferarray[1] zugreifen, geht nicht, da Bufferarray ja nur ein Objekt beinhaltet. Das nur so am Rande.
Jupp, genau dafür sind diese zusätzlichen Prüfungen, wo zur Laufzeit nun eine entsprechende Exception ausgelöst werden sollte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Programm hängt sich beim Start auf

  Alt 3. Mai 2014, 08:44
Wäre es da nicht einfacher/besser den "eigentlichen" Code zu posten?
Der veränderte Code unterscheidet sich nicht vom eigentlichen Code bis auf die Variablenbezeichnungen und die Zuweisungen aus den Records. Ich wollte Euch einfach nicht mit unnötigem Copypaste- Code zumüllen.
Es geht dabei nicht unbedingt auf Meldungen des Compilers, sondern darum, osb man bei TempLokArray[Index]. 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.
Mit Fehlermeldung meinte ich auch keine Compilermeldungen sondern Exceptions, aber wie gesagt, es passiert nichts.
Wenn ich mit dem Debugger Zeile für Zeile durchgehe tritt der Fehler genau bei if high(BufferArray)<Index then auf.
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.
Der Fehler sitzt immer vor dem Computer...
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz