Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Fr 10.02.06 20:50 
Hi,

Ich hab heute eine Procedure geschrieben, in der ich mit TIniFile arbeite. Ich weiß nicht wie man hier einen Quelltextausschnitt einfügt also schreib ich das so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Name;
begin
  With TIniFile.Create(Dateiname) do 
    try

      {Hier arbeite ich mit einigen lokalen einfachen Variablen, wie Byte, string, integer, ... keine Klassen}
      {Dann schreibe ich etwas in die INIDatei mit "WriteInteger"}

    finally
      Free;
    end;
end;


Ich rufe diese Procedure in einer anderen auf.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure button1Click(Sender: TObject);
begin
  Name;
  
  {AndereProceduren}
end;


Nun kommt in Procedure Button1Click nach der Procedure "Name" der LaufzeitFehler EAccessViolation... also Zugriffsverletzung und er bricht die Procedure Button1Click ab.
Ich habe mir also einen Haltepunkt in die Procedure Name gesetzt und einzelne anweisungen gemacht: es geht alles gut, bis auf den Befehl Free.
Ich habe die Methode Free weggelassen und nun kommt, wenn ich debugge der selbe Fehler beim "end;" des try-finally-end-Block, Nicht bei einer Procedure, sondern beim "end;". - Und wieder bricht er natürlich Button1Click ab.

Vielleicht kann mir ja jemand helfen - wäre dankbar.

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
starsurfer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 334

Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
BeitragVerfasst: Fr 10.02.06 20:53 
ich denke mal du erzeugst die ini datei nicht richtig
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
uses inifiles

var config:tinifile

...
config:=tinifile.Create(extractfilepath(application.exename)+'config.ini');

config.read...
config.write...

config.free;

_________________
GEIZ IST GEIL! - Ihr Sozialamt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 10.02.06 23:30 
AVs beim Verlassen von Prozeuren deuten meist auf 3 mögliche Fehler hin:

1. Falsche Aufrufkonvention
2. Buffer Overrun oder andere Stack-Beschädigungen
3. Falsches freigegebenes Objekt ;-)

Die oben zitierten Source-Abschnitte sind rein syntaktisch ersteinmal korrekt, d.h. Wenn Die Sources wirklich nur aus diesen Zeilen bestehen, sollte es normal laufen. Daher denke ich, wenn die 3 wahrscheinlichen Fehler auszuschließen sind, sollte der gepostete Source-Ausschnitt einmal etwas erweitert werden ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Sa 11.02.06 18:17 
Titel: Orginal Quellcode bei dem der Fehler auftritt
Ich bin wieder da. Im folgenden ist der Orginal Quellcode für meine Procedure,
bei dessen Ende die Zugriffsverletzung auftritt.



ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
procedure TReflektor.DateiBauplanGenerieren(DateiBauplan: string; var Fehler: Boolean);
var n: Byte;
    arr: array [0..255]of Byte;
    Rand: Byte;
    byt: Byte;
    l: integer;

function Finde(n: Byte): integer;
var i: byte;
begin
  result := -1;
  for i := 0 to l - 1 do
    if arr[i] = n then begin
      result := i;
      break;
    end;
end;

begin
//zufälligen Datei-Bauplan für Reflektor generieren
  With TINIFile.Create(DateiBauplan) do try
    Randomize;
    BauplanUndefinieren(Fehler);
    for n := 0 to 255 do Bauplan[E1,n] := n;
    for n := 0 to 255 do arr[n] := n;
    l := 256;
      try
        for n := 0 to 255 do
          if (Bauplan[E2,n] = -1) then begin
            rand := Random(l);
            byt := arr[rand];
            arr[rand] := arr[l - 1];
            l := l - 1;
            Bauplan[E2,n] := byt;
            Bauplan[E2,byt] := n;
            arr[Finde(n)] := arr[l - 1];
            l := l - 1;
          end;

        for n := 0 to 255 do WriteInteger('Bauplan',IntToStr(n),Bauplan[E2,n]);
      except
        spf.FehlerMeldung(fkFehlerBeimSpeichern,'Nach ''' + DateiBauplan + ''' kann nicht geschrieben werden.');
        Fehler := True;
      end;
  finally
    Free;
  end;
end;




Sie ist übrigens da um für meine nachgebaute Verschlüsselungsmaschine "Enigma"
den Bauplan des Reflektors zu errechnen und diesen in Eine Datei zu schreiben.

Vielleicht hast du noch eine Idee zum Fehler,
Danke
Jakob

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Sa 11.02.06 18:22 
Titel: noch was
Was ich vergessen habe:
Da sind noch proceduren, die ihr nicht kennen könnt, aber ich bin sicher, dass sie nichts mit dem Fehler zu tun haben können, weil sie in anderen Proceduren funktionieren und keine Objecte enthalten, die Fehler verursachen könnten.