Seltsamer Textfehler

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Leifa
Beiträge: 7
Registriert: Mi 8. Apr 2009, 21:21

Seltsamer Textfehler

Beitrag von Leifa »

Hallo!

Ich habe vor kurzem angefangen, ein Programm mit Lazarus zu schreiben. Dabei ist mir ein sehr seltsamer Fehler untergekommen, den ich mir absolut nicht erklären kann.
Ich habe als Datenmaterial eine Textdatei mit folgendem Aufbau:

Code: Alles auswählen

1|09.07.07|17:15|Kleiner Kanal -> RS Titanic |GCWHBG|team B-A-M-M|Traditional|Micro|1|1
2|09.07.07|18:15|Kleiner Kanal -> kleines Wehr|GCV49Y|team B-A-M-M|Traditional|Micro|1,5|2
3|10.07.07|14:50|Schiffsheber|GCD177|Sanne&Kiki|Traditional|Micro|2|1
4|10.07.07|18:15|Kleiner Kanal -> lost Bridge|GCWHB0|team B-A-M-M|Traditional|Micro|1|1,5
[...]
203|03.04.09|15:55|Denkstein|GCRXCP|Mystphi|Traditional|Micro|2|1
[...]


Dann rufe ich folgende Prozedur auf. Sie soll die Daten in verschiedenen Arrays speichern, doch dabei passiert der Fehler.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,summe:integer;
  datei:textfile;
  zeile,wort:string;
  ersterdatensatz,added: boolean;
  ganzertext: TStrings;
  dasdatum:TDate;
begin
 
  // Daten aus Textdatei in den array "Daten" einlesen, dabei Owners, Groessen, und Typen zählen
 
  ganzertext := TStringlist.Create;
  ganzertext.Clear;
  ganzertext.LoadFromFile('C:\Daten\Geocaching\founds.txt');
 
  ganzertext.SaveToFile('C:\Daten\Geocaching\founds2.txt'); // In der gespeicherten Datei ist der Text völlig korrekt!
 
  for i := 0 to ganzertext.Count-1 do
  begin
    zeile := AnsiToUTF8(ganzertext[i]);
    setlength(Daten,length(Daten)+1);
    label1.caption := 'Datensatz Nr. '+inttostr(high(Daten));
    form1.Repaint;
    showmessage(zeile); //In dieser Message wird der Fehler sichtbar!!!!!!!!!!!
 
    // Jetzt kommen einige Operationen, welche die Informationen aus der Zeile in die Arrays schreiben. Diese können aber nicht Auslöser für den Fehler sein, da die showmessage bereits einen falschen Text angezeigt hat.
    [...]
  end;
  [...]
end;


Die showmessage(zeile); zeigt ganz oft immer genau den Zeileninhalt an, die erste showmessage(zeile); zeigt also

Code: Alles auswählen

1|09.07.07|17:15|Kleiner Kanal -> RS Titanic |GCWHBG|team B-A-M-M|Traditional|Micro|1|1
an und so weiter. Irgendwann erhalte ich jedoch eine showmessage wie auf dem angehängten Bild.Bild
Falls ich die Zeile aus der Textdatei lösche, so passiert der Fehler mit irgendeiner anderen Zeile.

Ich habe schon Stunden mit diesem Problem verbracht und weiß einfach nicht mehr weiter. Fällt Euch dazu vielleicht etwas ein?
Vielen Dank schonmal im Vorraus!

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Seltsamer Textfehler

Beitrag von Euklid »

Hallo Leifa,

Wenn bis zur 203. Zeile alles korrekt angezeigt wird, und dann plötzlich der Fehler auftritt, fallen mir zwei mögliche Ursachen ein:
a) Irgendwo im Programm befindet sich eine Speicher-Zugriffsverletzung, die durch das Einspannen der Heaptrc ausfindig gemacht werden kann. Die Heaptrc kannst du unter Lazarus einfach in den Compilereinstellungen unter "Linken" aktivieren. Anschließend das Programm von der Konsole aus ausführen und die Konsolenausgaben beachten. Weitere Informationen gibt es unter anderem hier http://www.freepascal.org/docs-html/rtl ... index.html
b) Es handelt sich möglicherweise um einen Lazarus/FPC-Bug. In diesem Fall wäre es gut, wenn du den Fehler isolieren kannst, damit er von jedem reproduziert und ein Bugreport erstellt werden kann. Der Bug wird dann von den Lazarus/FPC-Entwicklern behoben.

Viele Grüße, Euklid

Leifa
Beiträge: 7
Registriert: Mi 8. Apr 2009, 21:21

Re: Seltsamer Textfehler

Beitrag von Leifa »

Hallo!

Ich habe die heaptrc aktiviert und erhalte beim ausführen der procedure folgende drei fehlermeldungen.

Code: Alles auswählen

---------------------------
Error
---------------------------
Marked memory at $000B8CB8 invalid
 
Wrong signature $F7CDB6A9 instead of BB3491B8
 
  $0040C49B
 
  $004096E7
 
  $0041F6F4  TFORM1__BUTTON1CLICK,  line 142 of unit1.pas
 
  $004855D4  TCONTROL__CLICK,  line 2095 of ./include/control.inc
 
  $00494FDF  TBUTTONCONTROL__CLICK,  line 57 of ./include/buttoncontrol.inc
 
  $00495595  TCUSTOMBUTTON__CLICK,  line 185 of ./include/buttons.inc
 
  $00495A31  TBUTTON__CLICK,  line 329 of ./include/buttons.inc
 
  $0049574A  TCUSTOMBUTTON__WMDEFAULTCLICKED,  line 240 of ./include/buttons.inc
 
  $00409E29
 
  $0047C674  TWINCONTROL__WNDPROC,  line 4749 of ./include/wincontrol.inc
 
  $00510A03  DELIVERMESSAGE,  line 103 of lclmessageglue.pas
 
  $004E535D  WINDOWPROC,  line 2400 of win32callback.inc
 
  $77D18709
 
  $77D187EB
 
  $77D1B743
 
  $77D1B7AB
 
  $77D4FC9D
 
  $77D46530
 
  $77D28386
 
  $77D2758C
 
  $77D18709
 
  $77D187EB
 
  $77D1C00E
 
  $77D1E366
 
  $004E2EDF  CALLDEFAULTWINDOWPROC,  line 126 of win32callback.inc
 
  $004E4EB7  WINDOWPROC,  line 2243 of win32callback.inc
 
  $7
---------------------------
OK   
---------------------------

Code: Alles auswählen

---------------------------
Error
---------------------------
  $77D187EB
 
  $77D189A5
 
  $77D1BCCC
 
  $004E8446  TWIN32WIDGETSET__APPPROCESSMESSAGES,  line 311 of win32object.inc
 
  $0041CEB9  TAPPLICATION__HANDLEMESSAGE,  line 984 of ./include/application.inc
 
  $0041D14F  TAPPLICATION__RUNLOOP,  line 1095 of ./include/application.inc
 
  $00420FB3  TWIDGETSET__APPRUN,  line 49 of ./include/interfacebase.inc
 
  $0041D10A  TAPPLICATION__RUN,  line 1082 of ./include/application.inc
 
  $004027B9  main,  line 16 of project1.lpr
 
  $0040F7F0
 
Marked memory at $000B8CB8 invalid
 
Wrong signature $F7CDB6A9 instead of BB3491B8
 
  $00411155
 
  $004092A5
 
  $00409370
 
  $0040B0F6
 
  $00420DE2  UNIT1_finalize_implicit,  line 5077 of unit1.pas
 
  $0040B914
 
  $0040C49B
 
  $004096E7
 
  $0041F6F4  TFORM1__BUTTON1CLICK,  line 142 of unit1.pas
 
  $004855D4  TCONTROL__CLICK,  line 2095 of ./include/control.inc
 
  $00494FDF  TBUTTONCONTROL__CLICK,  line 57 of ./include/buttoncontrol.inc
 
  $00495595  TCUSTOMBUTTON__CLICK,  line 185 of ./include/buttons.inc
 
  $00495A31  TBUTTON__CLICK, 
---------------------------
OK   
---------------------------

Code: Alles auswählen

---------------------------
Error
---------------------------
  $0049574A  TCUSTOMBUTTON__WMDEFAULTCLICKED,  line 240 of ./include/buttons.inc
 
  $00409E29
 
  $0047C674  TWINCONTROL__WNDPROC,  line 4749 of ./include/wincontrol.inc
 
  $00510A03  DELIVERMESSAGE,  line 103 of lclmessageglue.pas
 
  $004E535D  WINDOWPROC,  line 2400 of win32callback.inc
 
  $77D18709
 
  $77D187EB
 
  $77D1B743
 
  $77D1B7AB
 
  $77D4FC9D
 
  $77D46530
 
  $77D28386
 
  $77D2758C
 
  $77D18709
 
  $77D187EB
 
  $77D1C00E
 
  $77D1E366
 
  $004E2EDF  CALLDEFAULTWINDOWPROC,  line 126 of win32callback.inc
 
  $004E4EB7  WINDOWPROC,  line 2243 of win32callback.inc
 
  $77D18709
 
  $77D187EB
 
  $77D189A5
 
  $77D1BCCC
 
  $004E8446  TWIN32WIDGETSET__APPPROCESSMESSAGES,  line 311 of win32object.inc
 
  $0041CEB9  TAPPLICATION__HANDLEMESSAGE,  line 984 of ./include/application.inc
 
  $0041D14F  TAPPLICATION__RUNLOOP,  line 1095 of ./include/application.inc
 
  $00420FB3  TWIDGETSET__APPRUN,  line 49 of ./include/interfacebase.inc
 
  $0041D10A  TAPPLICATION__RUN,  line 1082 of ./include/application.inc
 
  $004027B9  m
---------------------------
OK   
---------------------------


danach endet das programm. deutet dies bereits auf a) oder b) hin, oder muss ich noch etwas anderes machen? ich weiß nämlich leider nicht, was mit konsole gemeint ist.

gruß
leif

Leifa
Beiträge: 7
Registriert: Mi 8. Apr 2009, 21:21

Re: Seltsamer Textfehler

Beitrag von Leifa »

Ich habe nun versucht, den Fehler zu isolieren. Es ist folgender Code dabei herausgekommen:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Grids, ExtCtrls, ComCtrls;
 
type
  TCache = record
    A: integer;
    B: TDate;
    C: TTime;
    D,E: string;
    F,G,H,I,J: integer;
    K: boolean;
  end;
  TTageZaehler = record
    A: integer;
    B: TDate;
  end;
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  Daten: array of TCache;
  Tage: array of TTageZaehler;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  zeile:string;
  ganzertext: TStringlist;
begin
  ganzertext := TStringlist.Create;
  ganzertext.LoadFromFile('C:\Daten\Geocaching\founds.txt');
  for i := 0 to 1 do
  begin
    zeile := AnsiToUTF8(ganzertext[i]);
    setlength(Daten,length(Daten)+1);
    showmessage(zeile);
    delete(zeile,1,pos('|',zeile));
    Daten[high(Tage)].B := strtodate(copy(zeile,1,pos('|',zeile)-1));
  end;
end;
 
initialization
  {$I unit1.lrs}
 
end.


Die Textdatei hat nun lediglich folgenden Inhalt:

Code: Alles auswählen

|01.01.01|
203|03.04.09|15:55|Denkstein|GCRXCP|Mystphi|Traditio


Wenn ich eine Zeile entferne, oder die Deklarationen von TCache ändere, oder ein Zeichen in der Textdatei entferne, dann tritt der Fehler nicht mehr auf. Das wirkt auf mich alles sehr mysteriös... :?:
Ich hoffe, ihr könnt mir weiterhelfen.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Seltsamer Textfehler

Beitrag von Euklid »

Hallo,

bei mir zeigt er in der Zeile

Code: Alles auswählen

Daten[high(Tage)].B := strtodate(copy(zeile,1,pos('|',zeile)-1));


den Fehler "falsches Datumsformat" an. D.h. der Fehler liegt darin, dass strtodate einen string geliefert bekommt, den er nicht als Datum erkennt und daher auch nicht umwandeln kann. Hier liegt ein Problem begraben.

Dann scheint es üblich zu sein, die einzelnen Zeilen der TStringlist mit ganzertext.strings[i]; abzurufen.

Das Problem mit den Speicherfehlern tritt auf, weil du das Objekt ganzertext zwar createst, es aber nicht wieder freigibst. Schreibe dazu einfach in die letzte Zeile von Button1Click:

Code: Alles auswählen

ganzertext.free;


... und die Speicherfehler sollten nicht mehr auftreten.

Viele Grüße, Euklid

Leifa
Beiträge: 7
Registriert: Mi 8. Apr 2009, 21:21

Re: Seltsamer Textfehler

Beitrag von Leifa »

Ich habe noch einige Sachen in meinem Programm geändert und der Fehler tritt nun nicht mehr auf. Ich weiß nicht mehr genau, was ich direkt davor geändert habe, aber das Datum war es nicht... Das wird bei mir korrekt erkannt. Ich habe das "ganzertext.free;" nun auch noch eingefügt.

Vielen Dank für die Hilfe!

Antworten