Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Units...Access Violation...Sonderbar (https://www.delphipraxis.net/58263-units-access-violation-sonderbar.html)

Flippo 4. Dez 2005 13:08


Units...Access Violation...Sonderbar
 
Hallo,
falls der Titel etwas merkwürdig und nichtssagend wirkt, dass liegt daran das mein Problem mir nichts sagt und ich keine Ahnung hab woran es liegen könnte.
Ich habe eine extra unit Shake, in der ich die Function Full aufrufe, mit den Werten x=320,y=371,co=0.
Delphi-Quellcode:
function Full(x:integer;y:integer;co:integer):integer;
begin
   while ((Shake.P[co].x=1025) and (co<31)) do co:=co+1; // <<Problem
   if (co>30) then Full:=co else begin
   Shake.P[co].x:=x;
   Shake.P[co].y:=y;
   Shake.P[co+1].x:=0;
   Full:=co;
   end;
end;
Die Werte werden auch richtig von der Funktion übernommen, aber in der zeile die ich als Problem markiert habe wird der Wert von co, aus 0 zu 267313069 und ich bekomme meine Standard-Fehlermeldung:
EAccesViolation...Zugriffsverletzung bei Adresse 0044136F in Modul 'Project1.exe'. Lesen von Adresse 0000C0C3.
was kann das nur sein warum verändert der einfach ungefrag meinen Wert, das geht doch nicht, was mach ich nur falsch? Ich bin echt verzweifelt :wall: :gruebel: :x :( :kotz: :wiejetzt: :?:
danke schonmal im voraus
MFG
Flippo

tigerman33 4. Dez 2005 13:15

Re: Units...Access Violation...Sonderbar
 
Wenn es sich bei P um ein Objekt handelt, ist dieses möglicherweise nicht erzeugt worden?

Flippo 4. Dez 2005 13:25

Re: Units...Access Violation...Sonderbar
 
Delphi-Quellcode:
unit Shake;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type

tMaus=class
public
x:integer;
y:integer;
end;

procedure Clear;
function Full(x:integer;y:integer;co:integer):integer;

var
P: array [1..30] of tMaus;
i:integer;

implementation

procedure Clear;
begin
   for i:= 1 to 30 do begin
   P[i]:=tMaus.create;
   P[i].x:=1025;
   end;
end;

function Full(x:integer;y:integer;co:integer):integer;
begin
   while ((Shake.P[co+1].x=1025) and (co<31)) do co:=co+1;//Geändert damit ich nicht auf 0 usw.
   if (co>30) then Full:=co else begin
   Shake.P[co].x:=x;
   Shake.P[co].y:=y;
   Shake.P[co+1].x:=0;
   Full:=co;
   end;
end;
end.
also clear wird im Programm vorher aufgerufen also sollte p doch eigentlich erzeugt sein oder, bin mir jetzz wo du das so sagst nichtmehr ganz sicher?

Khabarakh 4. Dez 2005 13:28

Re: Units...Access Violation...Sonderbar
 
Überleg doch mal: die Indizes deines Arrays gehen von 1 bis 30, du willst auf 0 zugreifen...

Oxmyx 4. Dez 2005 13:39

Re: Units...Access Violation...Sonderbar
 
Aus dem Grund sollte ein Array immer mit dem Index 0 beginnen.

Flippo 4. Dez 2005 13:41

Re: Units...Access Violation...Sonderbar
 
Zitat:

Überleg doch mal: die Indizes deines Arrays gehen von 1 bis 30, du willst auf 0 zugreifen...
Nein will ich nicht, denn 0+1 (co wird hochgezählt) ist 1. Das kann es nicht sein hab zur Sicherheit auch schonmal ausprobiert, dass ist es leider definitiv nicht. :(
bzw. dieser Fehler ist es nicht

tigerman33 4. Dez 2005 13:44

Re: Units...Access Violation...Sonderbar
 
Doch, in der ersten Schleifenprüfung ist co doch noch nicht inkrementiert, und damit hat Khabarakh recht.

Flippo 4. Dez 2005 13:47

Re: Units...Access Violation...Sonderbar
 
ja schon hab ich ja auch geändert, aber was ich damit sagen wollte ist, dass das leider nicht den Fehler produziert den ich meinte. (ist mir halt zwischengerutscht weil ich dauernd was verändert hab) :oops:

tigerman33 4. Dez 2005 13:54

Re: Units...Access Violation...Sonderbar
 
Dafür wird er dir jetzt im 30. Schleifendurchlauf abschmieren--aus dem gleichen Grund (Indizierung außerhalb der zulässigen Reichweite).

Flippo 4. Dez 2005 13:54

Re: Units...Access Violation...Sonderbar
 
Ok jetz habbichs auch endlich kapiert, warn gleich zwei Denkfehler, die 31 war auchnoch zu groß nu kommt nixmehr.
Dankeschön


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