Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 'Zugriffsverletzung bei Adresse...' => Fehlermeldung (https://www.delphipraxis.net/111219-zugriffsverletzung-bei-adresse-%3D-fehlermeldung.html)

Bx3 31. Mär 2008 18:04


'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
habe diese Fehlermeldung bekommen und weiss nicht was sie von mir will und wie ich den Fehler wieder beheben kann. kann mir bitte jmd helfen??

hier die meldung:


"Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung:'Zugriffsverletzung bei Adresse 004253A0 in Modul 'Project1.exe'. Lesen von Adresse 00000038'. Prozeß wurde angehalten. ..."

DeddyH 31. Mär 2008 18:06

Re: Fehlermeldung?? häh??
 
Meine Glaskugel sagt mir, dass Du auf ungültigen Speicher zugreifst (Objekte nicht instantiiert o.ä.). Ohne Code kann ich aber auch nur sagen: Häh??

mkinzler 31. Mär 2008 18:06

Re: Fehlermeldung?? häh??
 
Ohne nähere Hinweise deinerseits (Code) kann man dir wohl nicht helfen.
Hast du mal den Debugger angeworfen, um den Fehler einzugrenzen?

Bx3 31. Mär 2008 18:17

Re: Fehlermeldung?? häh??
 
also hier der quelltext, wenn da [...] steht is es eigtl unwichtig weil
ich an den stellen nur nen feld gefüllt habe:

Delphi-Quellcode:
type
  Spieler = record
    Name     : String[20];
    SImage   : byte;
    Guthaben : real;
    Stand    : byte;
    gefae    : byte;
    StrWel   : array [0..28] of byte;
    StrHaeuser: array [0..28, 0..4] of byte;
    StrMiete : array [0..28, 0..5] of integer;
   end;

[...]

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1  : TForm1;
  Zaehler: array [0..28] of real;
  Spiela : array [0..4] of Spieler;
  k     :byte;

implementation

{$R *.DFM}

[...]

procedure TForm1.FormCreate(Sender: TObject);
 var y,x:byte;
begin
 randomize;
 k:=random(4);
 y:=55;
 For x:=1 to 28 do
  Zaehler[x]:=1;
 For x:=1 to 4 do
  begin
   Spiela[x].stand:=2;
   Spiela[x].Simage:=y;
   inc(y);
  end;
 For x:=43 to 54 do
  (Findcomponent('Image'+intToStr(x))as TImage).visible:=false;
end;

[...]

procedure TForm1.BitBtn1Click(Sender: TObject);
 var i,x,y:byte;
begin
 If k = 5 then
  k:=1;
 For x:=43 to 54 do
  (Findcomponent('Image'+intToStr(x))as TImage).visible:=false;
 randomize;
 For i:=1 to 10 do
  begin
   x:=random(6)+43;
   y:=random(6)+49;
   (Findcomponent('Image'+intToStr(x))as TImage).visible:=true;
   (Findcomponent('Image'+intToStr(y))as TImage).visible:=true;
   sleep(100);
   Application.ProcessMessages;
   If i <> 10 then
    begin
     (Findcomponent('Image'+intToStr(x))as TImage).visible:=false;
     (Findcomponent('Image'+intToStr(y))as TImage).visible:=false;
    end;
  end;
                       
                          HIER KOMMT DER FEHLER IRGENDWO  (also hier unten)
           
  If Spiela[k].stand = 99 then
   inc(Spiela[k].gefae);
  If (((Spiela[k].stand = 99) and ((x-42) = (y-48)))) or (Spiela[k].stand <> 99) or (Spiela[k].gefae = 4)then
   begin
    If Spiela[k].stand = 99 then
     begin
      Spiela[k].gefae:=0;
      Spiela[k].stand:=12;
     end;
    Spiela[k].stand:=(Spiela[k].stand+(x-42)+(y-48));
    If Spiela[k].stand = 42 then
     Spiela[k].stand:=2;
    If Spiela[k].stand > 41 then
     Spiela[k].stand:=(Spiela[k].stand-40);
    (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).top:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).top;
    (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).left:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).left;
    If Spiela[k].stand = 32 then
     begin
      Spiela[k].stand:=99;
      (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).top:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).top;
      (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).left:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).left;
     end;
   end;
 inc(k);
end;

end.

mkinzler 31. Mär 2008 18:20

Re: Fehlermeldung?? häh??
 
Kannst du eingrenzen, wo der Fehler genau auftritt?

DeddyH 31. Mär 2008 18:20

Re: Fehlermeldung?? häh??
 
Und wo kommt der Fehler? Geiz doch nicht so mit Infos :?

Bx3 31. Mär 2008 18:23

Re: Fehlermeldung?? häh??
 
hab ne info in den quelltext gehauen wo ich den fehler vermute

mkinzler 31. Mär 2008 18:27

Re: Fehlermeldung?? häh??
 
Dann wirf doch mal den Debugger an.
Welchen Wert hat dann k?

besser
Delphi-Quellcode:
If k > 4 then
  k:=1;

Die Muhkuh 31. Mär 2008 18:27

Re: Fehlermeldung?? häh??
 
Vermutet oder sagt Dir das auch der Debugger? Hast schon mal durchgesteppt?

SirThornberry 31. Mär 2008 18:29

Re: Fehlermeldung?? häh??
 
hallo Bx3 :-) könntest du deinem Beitrag bitte einen aussagekräftigen Titel geben?

Der Fehler kommt wohl bei "TIrgendwas(FindComponent(...)).irgendwas". Weise lieber das Ergebnis von FindComponent erst auf eine Variable zu und prüfe ob diese ungleich nil ist, das Object also auch gefunden wurde. Andere Stellen habe ich im Moment nicht gefunden wo auf ein eventuell nicht instanziertes Object zugegriffen wird.

Popov 31. Mär 2008 18:30

Re: Fehlermeldung?? häh??
 
Ein Tipp, wenn du so eine Meldung bekommst, dann entweder auf F1 klicken oder auf den Hilf-Button. Zuerst kriegst du eine allgemeine Erklärung was eine Fehlermeldung ist. Wenn du dir das durchgelesen hast, dann klickst du oben im Hilfe-Fenster auf Hilfethemen und gibst dort "EAccessViolation" ein. Du bekommst eine Seite mit der Erklärung des Fehlers.

Bx3 31. Mär 2008 18:32

Re: Fehlermeldung?? häh??
 
danke Popov werd ich gleichma machen

- k is nen zufallswert zw 1-4

Popov 31. Mär 2008 18:33

Re: Fehlermeldung?? häh??
 
Also wenn man sich den Code ansieht, dann liegt der Fehler wahrscheinlich an dem Werk k. Wahrscheinlich ist k größer als in Array definiert.

mkinzler 31. Mär 2008 18:33

Re: Fehlermeldung?? häh??
 
Ich meinte beim Auftreten des Fehlers!

SirThornberry 31. Mär 2008 18:39

Re: Fehlermeldung?? häh??
 
was mir so auffällt ist, dass du im FormCreate bereits mit FindComponent deine Images durchläufst. Warum weißt du sie dann nicht direkt einem Array zu. Wie der Name "FINDcomponent" bereits aussagt werden die Componenten anhand des Namens GESUCHT. Wenn du also überall immer wieder suchst anstelle dir das gefundene zu merken ist das nicht wirklich sehr sinnvoll und performant programmiert. Und wenn du das nur an einer Stelle machen würdest könntest du auch gleich an dieser einen Stelle prüfen ob das Ergebnis von FindComponent <> nil ist und somit wüsstest du schon im Create das dort dein Fehler ist. :-)

Im übrigen fordere ich immer noch einen aussagekräftigen Titel ;-)

Bx3 31. Mär 2008 18:41

Re: Fehlermeldung?? häh??
 
also,
hab das jetze so geändert:

Delphi-Quellcode:
 If k > 4 then
  k:=1;
bis jetze gehts dann auch, allerdings is der fehler nich immer, sondern
nur bei ca jeden 4. teststart gekommen, hoffe es lag daran


=> wenn die componenten da sind kann das gefundene (bzw ja nich gefundene)
nil sein oda??

Popov 31. Mär 2008 18:41

Re: Fehlermeldung?? häh??
 
@Bx3

Nur so nebenbei, hat jetzt nichts mit der Frage zu tun, aber random(4) ergibt kein Wert zwischen 0 und 4, sondern zwischen 0 un 3. Du wirst also nie die 4 haben. Dafür mußt du random(4 + 1) eingeben. Damit bekommst du Werte zwischen 0 und 4. Willst du Werte zwischen 1 und 4, dann random(4) + 1 wählen.

Fussball-Robby 31. Mär 2008 18:42

Re: Fehlermeldung?? häh??
 
Debug doch lieber erst mal (F7). In einem 100-zeiligen Quellcode ist es für uns sonst fast unmöglich, sicher zu sagen, wo der Fehler liegt. Außerdem kannst du dir dann die Werte der Variablen angucken und die Zugriffsverletzung evtl. sofort sehen.

Mfg

Bx3 31. Mär 2008 18:44

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
ähm das weiss ich ja eigtl auch^^
nur habe ich an na andern stelle random(5)+1; und dabei wirklich nie ne
6 erhalten und war mir dann nich mehr dessen sicher

Die Muhkuh 31. Mär 2008 18:44

Re: Fehlermeldung?? häh??
 
Zitat:

Zitat von Popov
mußt du random(4 + 1) eingeben.

Warum nicht gleich random(5)? :tongue:

Eventuell könnte man auch ein Array of TImage anlegen und dann durch dieses Array iterieren und nicht auf der Form rumsuchen.

Bx3 31. Mär 2008 18:48

Re: Fehlermeldung?? häh??
 
Zitat:

Zitat von Die Muhkuh
Zitat:

Zitat von Popov
mußt du random(4 + 1) eingeben.

Warum nicht gleich random(5)? :tongue:

weil dann ne 0 kommen könnte^^

Fussball-Robby 31. Mär 2008 18:49

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
random(4 + 1) = random(5) :mrgreen:
Du meinst wohl Random(4) + 1 :wink:

Popov 31. Mär 2008 18:50

Re: Fehlermeldung?? häh??
 
Zitat:

Zitat von Die Muhkuh
Warum nicht gleich random(5)? :tongue:

Kann man machen und ist eigentlich nicht so wichtig, aber wenn man nach Jahren den Code studiert, dann fragt man sich plötzlich wie die 5 zustande kommt. Bei 4 + 1 weiß man, daß es um die 4 geht und die 1 der Ausgleich ist. Zwar weiß man es auch bei der 5, aber dafür braucht man 100 ms länger.

Es geht also nur um die flüssigere Lesbarkeit.

Bx3 31. Mär 2008 18:50

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
spass beiseite,
jetze gehts es ja erstma mit der änderung bei 'k'
(wenn ihr noch wisst wo^^)

wenns wiedermal nich funzen sollte dann melde ich mich wieder,

trotzdem nen ganz dickes danke an alle beteiligten
und auch für die extrem schnellen antworten ein dickes lob

lg Bx3 :sharkylinchen:

DeddyH 31. Mär 2008 18:52

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
Das hat nix mit Lesbarkeit zu tun, sondern mit dem Rückgabewert.

Popov 31. Mär 2008 18:54

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
Eventuell hier:

Delphi-Quellcode:
inc(k);
end;

end.
Ansonsten gibt es in dem gezeigten Code keine Stelle wo k über die 4 kommen könnte.

Bx3 31. Mär 2008 18:56

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
ja schon,
aber es gibt doch keinen grund das da nen fehler kommen
könnte, is doch egal obs 4 oda 5 is bzw wirds doch dann eh wieder
zurückgesetzt bevor es weiterverwendet wird

Die Muhkuh 31. Mär 2008 18:57

Re: Fehlermeldung?? häh??
 
Zitat:

Zitat von Popov
Zitat:

Zitat von Die Muhkuh
Warum nicht gleich random(5)? :tongue:

Kann man machen und ist eigentlich nicht so wichtig, aber wenn man nach Jahren den Code studiert, dann fragt man sich plötzlich wie die 5 zustande kommt. Bei 4 + 1 weiß man, daß es um die 4 geht und die 1 der Ausgleich ist. Zwar weiß man es auch bei der 5, aber dafür braucht man 100 ms länger.

Sorry Popov, aber das nehme ich Dir nicht ab. Wenn Du weißt, wie Random funktioniert, siehst Du auf Anhieb, wie die Zahl zustande kommt.

Falls man nicht weiß, wie Random nun funktioniert, bringt einem auch das 4 + 1 nichts...

Bx3 31. Mär 2008 18:57

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
...

Popov 31. Mär 2008 19:03

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
Zitat:

Zitat von Bx3
ja schon,
aber es gibt doch keinen grund das da nen fehler kommen
könnte, is doch egal obs 4 oda 5 is bzw wirds doch dann eh wieder
zurückgesetzt bevor es weiterverwendet wird

Ich meine nicht, daß da der Fehler kommt, sondern daß dort der Wert über 4 gesetzt wird und der fehler seinen Lauf nimmt. Der Fehler selbst kommt sonst wo vor. Ist aber unwichtig, denn den Fehler mußt du bereits bei Inc(k) abfangen. Setz dahinter if k > 4 then k := 1; und der Fehler sollte nicht mehr vorkommen.

Popov 31. Mär 2008 19:09

Re: Fehlermeldung?? häh??
 
Zitat:

Zitat von Die Muhkuh
Sorry Popov, aber das nehme ich Dir nicht ab. Wenn Du weißt, wie Random funktioniert, siehst Du auf Anhieb, wie die Zahl zustande kommt.

Jedem das seine, mußt es nicht machen. Bei random(4 + 1) sieht das eventuell sonderbar aus, nicht aber bei random(x + 1). Die Frage ist aber wieso ich bei einer Funktion zwei Schreibweisen nutzen soll, einmal random mit integrierter 1 und einmal mit separater 1. Wenn ich also random(4 + 1) mache, dann sehe ich hier nicht die 4, sondern den x-Wert, zu dem ich dann noch die 1 dazuadiere.

Aber wie gesagt, dau kannst es machen wie du es willst. Ist auch nicht falsch.

Die Muhkuh 31. Mär 2008 19:13

Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
 
Hi,

das sollte jetzt auch keine Unterstellung sein, dass es falsch ist. Aber selbst bei random(1242532) ist es besser zum Lesen, als random(1242531 + 1).

Aber ist, wie Du schon sagtest, Ansichtssache ;)


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