Einzelnen Beitrag anzeigen

danieldelphi

Registriert seit: 12. Mär 2015
38 Beiträge
 
#8

AW: Memory leak durch funktion readln

  Alt 12. Mär 2015, 10:36
Delphi-Quellcode:
procedure sterb_schleife;
var
  quell_dat, grossdatei: text; // ??????? C++

    flush(quell_dat); // ??????

end;
hmm Welche Delphi Version soll das den sein?
Flush auf die Quelle?

Also ich denke nicht das ein ReadLn/Writeln ein MemoryLeak produziert.

Bist Du sicher, dass Du uns "genug" Sourcecode gepostet hast?

Mavarik
das ist delphi 6. ich bin eig sicher dass ich euch genug gepostet habe, ich kann aber gern noch mehr raus hauen, also hier das problem im großen
Delphi-Quellcode:
{$O-}
unit sterb;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, deklara, plausi, struktur, Zaehler;

procedure sterb_schleife;


implementation

procedure sterb_schleife;
var
  autodatei, quell_dat, plausidatei, mrdatei, toddatei, hilfdatei, grossdatei: text;
  kette, plausikette: string;
  fehler, i, j, zaehler, plausibele, unplausibel, position: integer;

begin
  meldung.add('Gesellschaftskennzeichen: ' + gesell);
  {autodatei = Steuerdatei für ausgewählte Gesellschaft,
    enthält Liste der gelieferten Dateien}

  assign(autodatei, pfad_ein + gesell + 'inp.txt');
  reset(autodatei);
  //##########################
  //VU Ordner selbst anlegen
  //#############################
  if not DirectoryExists(pfad_aus+gesell) then
   ForceDirectories(pfad_aus+gesell);
  //##########################
  //alle dateipfade geändert, +gesell+'\' + hinzugefügt
  //#############################

  {mrdatei = Datei für Münchener Rück. Wird aber scheinbar nicht mehr gebraucht}
  assign(mrdatei, pfad_aus +gesell+'\' + gesell + 'mr.txt');
  rewrite(mrdatei);
  {toddatei: Wenn satz.zustand[1] = 'T' dann Datensatz rausschreiben.}
  assign(toddatei, pfad_aus +gesell+'\' + gesell + 'tod.txt');
  rewrite(toddatei);
  {grossdatei: Immer Datensatz rausschreiben.}
  assign(grossdatei, pfad_aus +gesell+'\' + gesell + 'big.txt');
  rewrite(grossdatei);

  assign(hilfdatei, pfad_aus +gesell+'\' +gesell + 'hilf.txt');
  rewrite(hilfdatei);

  meldung.add('Initialisieren der Variablen');
  zaehler_gesamt := 0; zaehler_nicht_verarbeitet := 0;
  for i := 1 to mwcount do
    for j := 1 to nwcount do wcount[i, j] := 0;

  struktur_insp(false); //Strukturtabellen initialisieren

  meldung.add(' Lesen der Versicherungsdaten.');
  readln(autodatei, kette);


  while kette <> 'endedo
  begin
    quell_dat_name := kette;
    {quelldat= ausgewählte gelieferte Datei der ausgewählten Gesellschaft}
    meldung.add('***' + kette + '***');
    assign(quell_dat, pfad_ein + gesell + '\' + quell_dat_name);
    reset(quell_dat);

    position := length(kette);
    plausikette := kette;
    plausikette[position - 3] := kette[position - 2];
    plausikette[position - 2] := kette[position - 1];
    plausikette[position - 1] := kette[position];
    plausikette[position] := '.';
    assign(plausidatei, pfad_aus + gesell + '\plausi_' + plausikette + 'txt');
    rewrite(plausidatei);

    //Für Datei spezifiziertes Meldejahr in datmelde_jahr einlesen:
    readln(autodatei, kette);
    val(kette, datmelde_jahr, fehler);

    //Entscheiden, ob neues oder altes Datenformat verwendet wird
    // alt = Datenformat bis 2004 ohne neue Felder
    // uebergang = Datenformat bis 2004, neue Felder am Ende angehängt
    // neu = Ab 2005 vorgeschlagener einheitlicher Datensatz für alle Pools
    readln(autodatei, kette);
    if kette = 'neuthen datenformat := 2
    else if kette = 'uebergangthen datenformat := 1
    else if kette = 'altthen datenformat := 0
    else messagedlg('Keine gültige Spezifikation des Datenformats in der Steuerdatei!', mtinformation, [mbOk], 0);


    zaehler := 0;
    plausibele := 0;
    unplausibel := 0;


    //in Daten von Quelle-Versicherung erste Zeile =Überschrift überlesen
    if gesell = 'QUthen readln(quell_dat, zeile);

    {Datensätze in quell_dat einlesen und auswerten}
    while not eof(quell_dat) do
    begin

      umfehler := false;
      sterb_fehler := false;
      istrente := true;
      /////////////////////////

       readln(quell_dat, zeile);
      if ioresult <> 0 then begin
        messagedlg('Fehler beim Lesen der Datei!', mtError, [mbOk], 0);
        break;
      end;

      //BG2010: Wenn Zeile mit Hochkomma beginnt, dann Einlesevorgang abbrechen...
      if zeile[0] = '''then break;
       inc(zaehler);
      va2i := 1;

      if gesell = 'QUthen umwandel_quelle(datenformat)
        {else if gesell = 'MA' then umwandel_mannheimer}
        //else if gesell = 'MR' then umwandel_mr
      ////////////////////////////
      else umwandel(datenformat);
      ////////////////////////////
      //if satz.gesellschaft = 'EU' then writeln(mrdatei, zeile);
      if umfehler then begin
        writeln(plausidatei, zaehler, ';100;Umwandelfehler');
        inc(unplausibel);
      end;
      if (not umfehler) and istrente then begin
        if satz.vers_art[2] = 'Lthen va2i := 2;
        plausibel(plausidatei, zaehler);
        if sterb_fehler then inc(unplausibel);
        if not sterb_fehler then begin
          inc(plausibele);
          codieren(zaehler); //Werte in Strukturtabellenindizes übersetzen
          struktur_zaehlen(zaehler); //Strukturtabellen belegen
          //val(copy(satz.geb_datum, 1, 4), gebjahr, fehler);
          {if (code.geschlecht = 2) and ((gebjahr = 1936) or (gebjahr = 1937)) then}
          ////////////////////////////////
          sterb_zaehlen(hilfdatei, zaehler, steuerung_ausgabe); //Sterblichkeits-Zaehlertabelle belegen
          ////////////////////////////////
          schreibe_grossdatei(grossdatei);
          ////////////////////////////////
        end;
        if abbruch then exit;
        if umfehler or sterb_fehler then inc(zaehler_nicht_verarbeitet);
        inc(zaehler_gesamt); str(zaehler_gesamt, kette);
        if ((zaehler_gesamt mod 1000) = 0) then dsnr.strings[1] := kette;
      end;

    end;

    flush(quell_dat);
    close(quell_dat);
    writeln(plausidatei, zaehler, ';Datensätze');
    writeln(plausidatei, unplausibel, '; unplausible Datensätze');
    writeln(plausidatei, plausibele, '; plausible Datensätze');
    flush(plausidatei);
    close(plausidatei);

    //close(mrdatei);
    readln(autodatei, kette);
  end; {*kette='ende' in autodatei*}

  meldung.add('Speichern der Struktur-Tabellen');
  struktur_insp(true); //Strukturtabellen speichern
  flush(mrdatei);
  close(mrdatei);
  flush(toddatei);
  close(toddatei);
  flush(grossdatei);
  close(grossdatei);
  flush(hilfdatei);
  close(hilfdatei);
  meldung.add(' ');
  str(zaehler_gesamt, kette);
   meldung.add('Datensätze gesamt: ' + kette);
  str(zaehler_nicht_verarbeitet, kette);
  meldung.add(' davon nicht verarbeitet: ' + kette);
  str(plausibele, kette);
  meldung.add('Datensätze plausibel: ' + kette);
  meldung.add(' ');

  zaehler_ausgabe(wcount);

end;

end.
  Mit Zitat antworten Zitat