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 2 von 2     12   
tkone

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

Re: invalid poiter und access violation

  Alt 15. Okt 2009, 07:47
so hab ich mir das auch gedacht, kann aber keinen fehler finden.

also am besten mal ein bsp.:

alle meine muster haben die breite 801 und unterscheiden sich in der höhe.

scenario 1:
ich lade ein muster ein, dass 801x600 groß ist. lade ich nun sofort ein muster dass eine andere höhe hat, funktioniert alles einwandfrei.
der array wird auf die entsprechende größe verändert und mit den neuen werten gefüllt.

scenario 2:
ich lade ein muster von 801x600 ein. dannach führe ich eine bearbeitung aus. diese bearbeitung betrifft lediglich die 1., 3. und 4. spalte des Arrays. nach der bearbeitung tretten die beiden fehlermeldungen auf, selbst wenn die bearbeitung nix am array verändert, also alle checkboxen not enabled sind.

ich setz mal die bearbeitungroutine hier rein, vielleicht fällt euch was auf.
den debugger hab ich auch schon schritt für schritt bemüht. in scenario 2 ist der array sollange 801x600(mit richtigen bytewerten gefüllt) bis der setlength befehl die größe auf das neue muster verändern möchte. sobald der befehl auf muster zugreift tritt die EAccessViolation auf.
danach hat der array dann die größe des neuen musters und auch deren richtige werte.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject); //Bereiche einfügen
var
  i: integer;
  AuswahlSG: Byte;
  SD, KS, DZ_B1, DZ_B2: Byte;
  Byte1, Byte3, Byte4: Byte;

begin
Byte1:=0;
Byte3:=0;
Byte4:=0;

case combobox1.ItemIndex of
0: AuswahlSG:=1;
1: AuswahlSG:=2;
2: AuswahlSG:=4;
3: AuswahlSG:=8;
4: AuswahlSG:=16;
5: AuswahlSG:=32;
6: AuswahlSG:=64;
7: AuswahlSG:=128;
end;

SD:=combobox2.ItemIndex;
KS:=8*combobox3.ItemIndex;

case combobox4.ItemIndex of
0..3: DZ_B1:=64*combobox4.ItemIndex;
4..7: DZ_B1:=64*(combobox4.itemindex-4);
end;

case combobox4.ItemIndex of
0..3: DZ_B2:=0;
4..7: DZ_B2:=1;
end;

If strtoint(edit2.text)>schuss_max then
  begin
  showmessage('zu hoher Wert');
  exit;
  end
else
  If strtoint(edit2.text)=schuss_max then
    button2.Visible:=true;

If Checkbox1.checked then
  Byte1:=AuswahlSG;

If Checkbox2.Checked then
  Byte3:=Byte3+SD;

If Checkbox3.Checked then
  Byte3:=Byte3+KS;

If Checkbox4.Checked then
  begin
    Byte3:=Byte3+DZ_B1;
    Byte4:=DZ_B2;
  End;

for i:=lokal_max to strtoint(edit2.Text) do
  begin
    if Checkbox1.Checked then Muster[0,i]:=Byte1;
    Muster[2,i]:=Byte3;
    Muster[3,i]:=Byte4;
  end;

lokal_max:=strtoint(edit2.Text);
edit1.text:=inttostr(lokal_max);

if lokal_max>=schuss_max then
begin
  edit2.Enabled:=false;
  Button1.Visible:=false;
end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

Re: invalid poiter und access violation

  Alt 15. Okt 2009, 14:48
hallo tkone,

zunächst, in der Routine ist mir nichts aufgefallen, was "böse" wäre. aber schau Dir das alles noch einmal genau an:
Delphi-Quellcode:
lokal_max:=strtoint(edit2.Text);
edit1.text:=inttostr(lokal_max);
Da empfehle ich:
Delphi-Quellcode:
lokal_max:=strtoint(edit2.Text);
edit1.Text:=edit2.Text;
....
oder so
...
edit1.Text:=edit2.Text;
lokal_max:=strtoint(edit2.Text);
if lokal_max>=schuss_max then
begin .........
dann spart man sich ein paar prozessorhundertstel.

Was ist mit dem Debugger?
Hast Du dir einmal im Verlauf der Verarbeitung MUSTER (sollte ein Pointer sein) und die Inhalte/Adressen von MUSTER angeschaut?
Schau mal ob sich length(MUSTER) verändert ("Funktionsaufrufe" gestatten nicht vergessen!)

Da Du den Code geerbt hast kann ich verstehen, daß er noch so aussieht. Aber wenn Du jetzt nach Fehlern suchst, und die gibt es ja , renovier ihn - etwas leserlicher und aussagekräftige Variablennamen - das zahlt sich auf jeden Fall aus.

Was mir noch aufgefallen ist:
Delphi-Quellcode:
// Mustergrössen bestimmmen
M_size:=F_size-headerL;
schuss_Byte:=(M_Size)/(plat_Byte); //<<<<<< Fehler!!!!
schuss:= schuss_byte;
schuss_max:= schuss_byte;
Das Ergebnis von M_Size/Plat_Byte ist KEIN Integer!
(schuss_Byte:=M_Size div plat_Byte; ist besser)
Da sollte der Compiler aber sehr meckern! hast du vielleicht alle Prüfungen abgeschaltet die es gibt?

Gruß
K-H
  Mit Zitat antworten Zitat
tkone

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

Re: invalid poiter und access violation

  Alt 15. Okt 2009, 15:11
Zitat von p80286:
Was ist mit dem Debugger?
Hast Du dir einmal im Verlauf der Verarbeitung MUSTER (sollte ein Pointer sein) und die Inhalte/Adressen von MUSTER angeschaut?
Schau mal ob sich length(MUSTER) verändert ("Funktionsaufrufe" gestatten nicht vergessen!)

Das Ergebnis von M_Size/Plat_Byte ist KEIN Integer!
(schuss_Byte:=M_Size div plat_Byte; ist besser)
Da sollte der Compiler aber sehr meckern! hast du vielleicht alle Prüfungen abgeschaltet die es gibt?
^^ nee, da kommen keine warnungen(hab auch nix abgestellt), da das ergebis immer eine ganzzahl ausspukt.
die relationen von M_Size, Plat_byte und schuss_byte gehen immer auf.

zum debugger:
MUSTER wird geladen, und gefüllt. (setlength und anschließend über eine schleife mit read(f) aus der geladenen datei die werte ausgelesen)
MUSTER wird von mir bearbeitet (s.o.)
MUSTER wird in neuer Datei gespeichert.
neue datei wird geladen.
1 Zeile vor dem neuen setlength von MUSTER ist MUSTER noch identisch mit dem bearbeiteten inhalt und der größe der vorherigen datei.
beim aufruf von setlength mit den neuen abmaßen kommt der EAccessViolation.
danach ist MUSTER mit den neuen Abmaßen(alter inhalt) und wird mit den akuellen werten überschrieben.

habs bereits probiert MUSTER im letzten schritt zu leeren (zb. setlength 0 oder :=nil) funktioniert zwar, aber die fehlermeldung kommt trotzdem beim aufruf des befehls zum leeren.


EDIT:
hab die ersten 4 Spalten von MUSTER auf ein hilfsarray gespeichert(mglw. darf man MUSTER nicht verändern)
dieses hilfsarray wird nun bearbeitet und beim speichern zuerst die spalten 1-4 des hilfsarrays und erst danach die urinfos aus MUSTER ab der spalte 5 geschrieben.
scheint daran gelegen zu haben, denn ich konnte bisher die fehlermeldungen nicht reproduzieren.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

Re: invalid poiter und access violation

  Alt 15. Okt 2009, 17:02
hallo tkone,

schön wenn's klappt aber glücklich bin ich damit nicht, da der eigentliche Fehler wohl nur umgangen, aber nicht behoben wird.

zum Teilen:

Delphi-Quellcode:
var
  wert1 : integer;
  wert2 : integer;
  wert3 : integer;
begin
  wert1:=4;
  wert2:=2;
  wert3:=wert1/wert2; ///// [Fehler] Unit1.pas(34): Inkompatible Typen: 'Integer' und 'Extended'
end;
auch wenn nur ganzzalige Ergebnisse kommen sollten, der Compiler mag das nicht. wenn er das nicht anmeckert, stimmt da etwas ganz und gar nicht.

Gruß
K-H
  Mit Zitat antworten Zitat
tkone

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

Re: invalid poiter und access violation

  Alt 16. Okt 2009, 07:05
ha ich hab das mit dem dividieren auch anders ^^
KA warum das noch so ober drin steht im quelltext.
hatte den befehl ROUND(wert1 / wert2) drin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 21:51 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