AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

invalid poiter und access violation

Ein Thema von tkone · begonnen am 12. Okt 2009 · letzter Beitrag vom 16. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#1

invalid poiter und access violation

  Alt 12. Okt 2009, 15:03
hi hab ne fehlermeldung beim laden einer datei.
also was macht mein programm:
ich weis dem programm eine datei zu und diese soll in die einzelbestandteile aufgeteilt werden.
Die datei hat einen header und einen rumpf.
der header wird in zwie abschnitte aufgeteilt, wobei ein kleiner teil dazwischen herausgelassen wird(siehe labl weiter_st).
bis dahin funktionierts auch.
nun soll mir das delphi programm den rumpf des programmes byteweise in ein 2D array speichern.
und genau hier bringt mir das programm den fehler "Access violation".
beim beenden des programmes kommt dann die meldung "invalid pointer".

ich glaub ich bin schon betriebsblind, da ich den fehler absolut nicht finde


Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject); //JC5 laden
Label weiter_st, fertig_st;
var
  f: File of Byte;
  F_size, M_size, akt_pos: Integer;
  headerL, header_pos: Integer;
  plat_byte, schuss_byte, plat, schuss: Integer;
  wert: byte;

begin
lokal_max:=0;
edit1.Text:=inttostr(lokal_max);
edit2.Enabled:=true;

openDialog1.Execute;
AFilename:=OpenDialog1.Filename;
Assignfile(f,AFilename);
Reset(f);
F_size:=Filesize(f);
headerL:=134+length(extractfilename(AFilename));
plat_Byte:=801; //x größe des Musers für den array

// Mustergrössen bestimmmen
M_size:=F_size-headerL;
schuss_Byte:=(M_Size)/(plat_Byte);
schuss:= schuss_byte;
schuss_max:= schuss_byte;

// Dynamische Arrays dimensionieren
SetLength(Header_P1, 15);
SetLength(Header_P2, 134-15-1); //-1, da 1Byte vor Filename noch veränderlich
SetLength(Muster, plat_Byte, schuss_Byte);

Label6.Caption:='max.'+inttostr(schuss_max);
label7.Visible:=true;
label8.Visible:=false;

akt_pos:=0;
plat:=1;
header_pos:=0;

while not eof(f) Do
Begin
  read(f,wert);
  inc(akt_pos);
  // Zwecks Header Informationen
  if akt_pos<headerL+1 Then goto weiter_st;

  Muster[plat,schuss-1]:=wert;
  inc(plat);
  If plat=plat_byte then
    begin
    plat:=0;
    dec(schuss);
    end;

  If schuss=0 Then goto fertig_st;

  weiter_st:
  Begin
    If akt_pos<16 then
      header_P1[akt_pos-1]:=wert;
    If akt_pos>16+(headerL-134) then
      begin
        header_P2[header_pos]:=wert;
        inc(header_pos);
      end;

  End;

End;
fertig_st:
closefile(f);

button2.Visible:=false;
button1.visible:=true;
edit2.Text:='';

end;
  Mit Zitat antworten Zitat
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#2

Re: invalid poiter und access violation

  Alt 12. Okt 2009, 15:31
ok ich habs durch den debugger und jede menge einzelschritte doch hinbekommen

das programm startet nachdem es den ersten wert des rumpfes verarbeitet hat tatsächlich wieder den programmteil ab label weiter_st.
klar, liegt ja auch in der reihe ^^
habe jetzt ein weiteres label an den anfang gesetzt und mit dem goto befehl gleich hinter die abbruchbedingung schuss=0 gesetzt
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#3

Re: invalid poiter und access violation

  Alt 12. Okt 2009, 15:38
Label? Goto?

Es ist das Jahr 2009, man glaubt es kaum, aber es gibt Klassen und Prozeduren, in die man das Ganze packen kann. Es soll natürlich immer Leute geben, die gerne eine "Welt"-Prozedur schreiben, in der alles passiert.

procedure ErschaffeWelt(Zeit := 7Tage); Ich würde dir vorschlagen, daß du deine Prodezdur mal auseinandernimmst udn daraus viele einzelne Prozeduren machst. Du wirst dann erkennen, daß du keine Labels, Goto mehr brauchst und dein Code so simpel aussieht, daß sogar jemand der seit einer Woche programiert erkennen kann, was passieren soll.

Ist ehrlich ein gutgemeinter Rat.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Chris.R

Registriert seit: 8. Sep 2009
Ort: Nürnberg
68 Beiträge
 
Delphi 2010 Professional
 
#4

Re: invalid poiter und access violation

  Alt 12. Okt 2009, 15:42
Hallo,

die Benutzung von label und goto ist eher unschön, besser wäre es so in der Art:

Delphi-Quellcode:
while not eof(f) Do
Begin
  
  //if akt_pos<headerL+1 Then goto weiter_st;
  if akt_pos >= headerL + 1 then
  begin
    ...

    //If schuss=0 Then goto fertig_st;
    if schluss = 0 then Break;
  end;

  weiter_st:
  Begin
    

  End;

End;
fertig_st:
Ciao Chris
  Mit Zitat antworten Zitat
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#5

Re: invalid poiter und access violation

  Alt 12. Okt 2009, 15:51
danke
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

Re: invalid poiter und access violation

  Alt 12. Okt 2009, 16:13
Hallo tkone,

Dein Sourcecode sieht irgendwie nach einer Basic-Übersetzung aus?

Wo ist denn die Definition von "MUSTER" ? Wenn das ein dynamisches array ist und die entsprechende Längenzuweisung fehlt, dann kommen solche Fehler zustande, wie Du sie beschreibst.

zu den gotos schweigt des Dichters Höflichkeit.

Gruß
K-H
  Mit Zitat antworten Zitat
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#7

Re: invalid poiter und access violation

  Alt 12. Okt 2009, 16:39
Zitat von p80286:
Dein Sourcecode sieht irgendwie nach einer Basic-Übersetzung aus?
zu den gotos schweigt des Dichters Höflichkeit.
Ja so in der Art. Das eigentliche Programm ist von 2000 bis 2005 von 2 ehem. Mitarbeitern geschrieben und ständig modifiziert bzw. erweitert wurden.
Das ganze Projekt ist 106MB groß und verwurstet so gut wie alle Delphistrukturen ^^
Meine Aufgabe besteht darin mich in dieses Programm einzuarbeiten und für eine neue Anwendung zu erweitern bzw. umzuarbeiten.
Aufgrund der Größe und Komplexität habe ich die alten Programmstrukturen tw. übernommen.
Daher auch die Verwendungen von zb. label und goto.

Zitat von p80286:
Wo ist denn die Definition von "MUSTER" ? Wenn das ein dynamisches array ist und die entsprechende Längenzuweisung fehlt, dann kommen solche Fehler zustande, wie Du sie beschreibst.
Also Muster ist vom Typ MusterT. Den hab ich als Typ Array of Array of Byte erstellt.
Da Muster in mehreren Programmstrulturen verwendet wird ist es global deklariert.
Lediglich die Größe von Muster wird hier gesetzt.
Der eigentliche Fehler lag an einem Array in Kombination mit den Labels.
Der Array Header_P2 wird beschrieben, wenn die aktuelle Position in der Datei > 16+HeaderL-134.
Hatte aber vergessen dass dieser Array nur beschrieben werden soll, bis headerL erreicht ist, denn dann beginnt ja mein Muster.
Delphi hat also weiterhin versucht Header_P2 zu beschreiben, wobei der Arrayberreich zu Ende war.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

Re: invalid poiter und access violation

  Alt 12. Okt 2009, 16:55
Mein ehrlich gemeintes Beileid!

Auch wenn es schrecklich klingt, schreib es soweit es geht neu! Du könntest Dir ekelhafte Seiteneffekte einhandeln.

Gruß
K-H
  Mit Zitat antworten Zitat
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#9

Re: invalid poiter und access violation

  Alt 14. Okt 2009, 07:42
also mein programm funktioniert wie es soll. es lädt die daten ein, teil sie richtig, dannach kann ich einzelne daten verändern und dann die daten in einer neuen datei speichern.

lediglich zwei kleine unschöne effekte tretten auf, wenn die ersten daten im array MUSTER bearbeitet wurden.

1.) nachdem die erste datei geladen und bearbeitet wurde, erhalte ich einen EAccessViolation error, wenn ich in irgendeiner weise das dyn. array MUSTER bearbeiten möchte(SetLength, Finalize, :=nil, ...). besonders SetLength ist aber notwendig, wenn ich eine weitere datei bearbeiten möchte ohne das programm vorher zu beenden.

2.) beim beenden des programms erhalte ich einen Runtime error 216
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

Re: invalid poiter und access violation

  Alt 14. Okt 2009, 15:16
Hallo tkone,

so ganz fehlerfrei scheint das aber nicht zu sein:

Zitat von tkone:
...
1.) nachdem die erste datei geladen und bearbeitet wurde, erhalte ich einen EAccessViolation error, wenn ich in irgendeiner weise das dyn. array MUSTER bearbeiten möchte(SetLength, Finalize, :=nil, ...). besonders SetLength ist aber notwendig, wenn ich eine weitere datei bearbeiten möchte ohne das programm vorher zu beenden.

2.) beim beenden des programms erhalte ich einen Runtime error 216
in beiden Fällen handelt es sich um den Griff in die "Speicher-Schüssel". Wahrscheinlich beförderst Du irgendwo MUSTER in den Orkus (setlength 0 ?) und greifst dann nocheinmal darauf zu.

Hast Du schon den Debugger bemüht?

Gruß
K-H
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:58 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