Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Acess Violation (https://www.delphipraxis.net/149637-acess-violation.html)

Morphy 25. Mär 2010 18:51


Acess Violation
 
Hi,

Ich habe ein problem, undzwar scheint mein Projekt, wenn ich es kompiliere, ohne einen wirklichen Grund eine Access-violation auszulösen. eigentlich habe ich nichts geändert, denn ich habe das was ich neu geschrieben hatte, auskommentiert, aber die access-violation tritt immernoch auf. ich weiss jetzt nicht welchen code ich hier posten soll, da der fehler auch sofort auftritt, ich kann das programm nicht in einzelnen schritten starten, daher weiss ich auch nicht, wo die kritische stelle ist.

hat jemand nen rat für mich?
braucht ihr noch infos, wenn ja welche?

Danke schonmal!

SirThornberry 25. Mär 2010 18:56

Re: Acess Violation
 
die genaue Meldung wäre interessant (also inklusive aller genannten Adressen)

zeras 25. Mär 2010 18:58

Re: Acess Violation
 
Am besten, man startet es in der IDE und setzte einzelne Breakpoints, um weiter an die Stelle zu kommenm, wo das Programm dann den Fehler bringt. Oder ist es nicht immer an der gleichen Stelle?

messie 25. Mär 2010 19:19

Re: Acess Violation
 
Ich hatte einen vergleichbaren Effekt als ich im letzten Jahr von Delphi 6 auf Delphi 2009 umgestellt habe.

Da waren im Projekt Verweise auf Komponenten und deren Source, die nicht zu Delphi 2009 passten. Die Exceptions traten schon vor der initialize-Klausel meiner Anwendung auf und wurden in den initialize-Abschnitten der Komponenten erzeugt.

Hast Du den Source selbst ganz neu erstellt oder etwas schon Vorhandenes genommen, was für Komponenten wurden verwendet etc.?

Vielleicht findest Du da etwas, was Du rauswerfen kannst, solange bis Dein vorheriges (oder leeres) Programm funktioniert.

Grüße, Messie

Edit: hier das Thema von damals

Morphy 25. Mär 2010 19:23

Re: Acess Violation
 
ok, ich hab das gemacht und jetzt hab ich die stelle gefunden wo der (ziemlich irrationale) fehler zu liegen scheint:

Delphi-Quellcode:
 
type TLabelfeld = array[0..13,0..23] of TImage;
  //TVorschaufeld = array[0..3,0..3] of TImage;


var
  Form1: TForm1;
  Labelfeld: TLabelfeld;
  //vorschau1,vorschau2,vorschau3,vorschau4 : TVorschaufeld;
  go: boolean;


implementation

{$R *.dfm}
{$R res.res}

procedure TForm1.FeldBauen;
var i,j:byte;
k,l:integer;
begin
 for i:=1 to 10 do begin
  for j:=1 to 20 do begin
   labelfeld[i,j]:=TImage.Create(GroupBox3);
   labelfeld[i,j].Parent:=GroupBox3;
   labelfeld[i,j].left:=i*15+3;
   labelfeld[i,j].top:=j*15+7;
   labelfeld[i,j].width:=14;
   labelfeld[i,j].height:=14;
  end;
 end;
 LastTetrisfeld:=TTetrisfeld.create;
 Tetrisfeld:=TTetrisfeld.create;
 stein:=Tetrisfeld.SteinRandomcreate;
 tetrisfeld.pause:=true;
 k:=1;
 l:=1;
 for k:=1 to 10 do begin
  for l:=1 to 20 do begin
   labelfeld[k,l].Picture.Bitmap.LoadFromResourceName(HInstance, 'bg');
  end;
 end;
end;
ich hab jetzt die variablen überwacht und habe rausbekommen, dass k und l beim start der schleifen den wert 10 und 20 bekommen, und dann anfangen runterzuzählen, bei k=20 und l=19 bricht er dann mit der fehlermeldung

'access violation at 0x00405b35: write of adress 0x00030cf4'

ab. verstehe nicht warum er plötzlich rutnerzählt o.O

k:=1 und l:=1 scheint der compiler nicht zu beachten, ich kann dort aufjedenfall keinen breakpoint setzen, das wird so komisch grün dann die zeile...

naja, diese stelle vom code hat übrigens immer funktioniert, hab da nix geändert und jetzt kommt plötzlich der fehler da...

kann mir noch wer helfen?

DANKE schonmal im Vorraus...

edit: nein, hab alles selbst geschrieben und benutze delphi 7

Luckie 25. Mär 2010 19:25

Aussagekräftiger Titel
 
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.

Morphy 25. Mär 2010 19:26

Re: Aussagekräftiger Titel
 
Zitat:

Zitat von Luckie
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.

ich weiss nicht genau wie mein problem heisst hast du nen vorschlag für nen aussagekräftigen titel?

SirThornberry 25. Mär 2010 21:05

Re: Acess Violation
 
Zitat:

ich hab jetzt die variablen überwacht und habe rausbekommen, dass k und l beim start der schleifen den wert 10 und 20 bekommen, und dann anfangen runterzuzählen, bei k=20 und l=19 bricht er dann mit der fehlermeldung
Irgendetwas stimmt an der Aussage nicht. Wenn k bei 10 startet und dann runtergezählt wird, wie kann k dann 20 sein?

Schalte zum Debuggen am besten mal die Optimierung aus.
Existiert Groupbox3 zu dem Zeitpunkt überhaupt schon (Groupbox3 ist nebenbei gesagt nicht der beste Name).

Blup 26. Mär 2010 07:21

Re: Acess Violation
 
Das der Optimierer for-Schleifen umstellt, so daß diese gegen 0 zählen ist normal und keine Fehlerursache.
Zitat:

Zitat von Morphy
k:=1 und l:=1 scheint der compiler nicht zu beachten, ich kann dort aufjedenfall keinen breakpoint setzen, das wird so komisch grün dann die zeile...

Die Zuweisung ist blödsinn, da die nachfolgenden Zuweisungen in den for-Schleifen den Wert wieder überschreiben.
Der Compiler warnt dich normalerweise und der Optimierer schmeist die Zeilen raus, die werden nicht übersetzt.

Wenn du etwas debuggen willst, schalt den Optimierer aus und erstelle das ganze Projekt erst enmal neu.
Du solltest auch alle Warnung anschalten.

Interssant wäre jetzt, wo wird FeldBauen überhaupt aufgerufen, existiert das Formular überhaupt schon?

p80286 26. Mär 2010 14:42

Re: Acess Violation
 
Zitat:

Zitat von Morphy
Delphi-Quellcode:
 

procedure TForm1.FeldBauen;
var i,j:byte;
k,l:integer;
begin
 for i:=1 to 10 do begin
  for j:=1 to 20 do begin
   labelfeld[i,j]:=TImage.Create(GroupBox3);
   labelfeld[i,j].Parent:=GroupBox3;
   labelfeld[i,j].left:=i*15+3;
   labelfeld[i,j].top:=j*15+7;
   labelfeld[i,j].width:=14;
   labelfeld[i,j].height:=14;
  end;
 end;
 LastTetrisfeld:=TTetrisfeld.create;
 Tetrisfeld:=TTetrisfeld.create;
 stein:=Tetrisfeld.SteinRandomcreate;
 tetrisfeld.pause:=true;
 k:=1;
 l:=1;
 for k:=1 to 10 do begin
  for l:=1 to 20 do begin
   labelfeld[k,l].Picture.Bitmap.LoadFromResourceName(HInstance, 'bg');
  end;
 end;
end;

var i,j:byte; das ist spätestens hier: labelfeld[i,j].top:=j*15+7; nicht mehr so gülden, da 15*20 ein wenig größer als 255 ist, oder spekulierst Du auf irgendwelche Nebeneffekte, die ich nicht sehe?
(Übrigens ist es zumindestens während der Entwicklung sinnvoll, die Bereichsprüfung [Projektoptionen] einzuschalten, dann kommen auch aussagekräftige Fehlermeldungen)

edit:
warum nutzt Du eigentlich einmal i und j und dann k und l um auf das Array zuzugreifen?

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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