Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - EAccessViolation-Fehler bei end;-Zeile???


*Knust* - Do 31.07.08 23:02
Titel: EAccessViolation-Fehler bei end;-Zeile???
Hi!
Ich habe ein Programm, das in einigen Prozessen Diesen Fehler rausgibt, wenn der Prozess zuende ist(also beim letzten end;).
Ich würde gerne wissen, was genau diesen Fehler aufruft?
Der Code für den einen Prozess ist dieser:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure tform2.btnclick(x,y:integer);
begin
 if buttons[x][y].caption='' then
  begin
   buttons[x][y].Caption:='X';
   ary3belegt[x][y][wtag]:=1;
   inc(ary2belegtpausen[wtag][y]);
   inc(ary1belegtlehrer[x]);
  end
  else
   begin
    buttons[x][y].Caption:='';
    ary3belegt[x][y][wtag]:=0;
    dec(ary2belegtpausen[wtag][y]);
    dec(ary1belegtlehrer[x]);
   end;
end;


wenn ich schrittweise den prozess durchgehe, zeigt er den fehler nach dem letzten end;.

Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00403330 in Modul 'Project1.exe'. Lesen von Adresse FFFFFFDD'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------

Was ist das Problem?

mfg

Knust

PS: Vielleicht sollte ich dazu sagen, wass die Sachen aus dem Prozess sind:
buttons is n array of array of tbutton
ary3belegt n array of array of array of integer
ary2belegtpausen mit 2 dimensionen und ary1belegt lehrer halt 1.


Moderiert von user profile iconNarses: Topic aus Windows API verschoben am Do 31.07.2008 um 23:08


Yogu - Do 31.07.08 23:09

user profile icon*Knust* hat folgendes geschrieben:
Ich habe ein Programm, das in einigen Prozessen Diesen Fehler rausgibt, wenn der Prozess zuende ist(also beim letzten end;).

Das heißt wahrscheinlich nicht, dass der Fehler dort auftritt, sondern dass einfach die letzte Zeile der aktuellen Methode markiert wird. Das ist bei mir auch so.

Zugriffsverletzungen (EAccessViolation) treten gerne mal auf, wenn man vergisst, einen Zeiger (zum Beispiel der auf einen Button) zuzuweisen. Schaue einfach mal im Debugger nach, ob einer der Array-Werte nil ist.


Narses - Do 31.07.08 23:10

Moin!

Eine weitere, häufige Ursache für solche Probleme im Zusammenhang mit Arrays ist eine Indexüberschreitung. :idea:

cu
Narses


*Knust* - Do 31.07.08 23:17

wenn der zeiger nil wäre, dann dürfte der button ja nicht existieren und er versucht trotzdem drauf zuzugraifen, verstehe ich das richtig???
Wenn das so wäre, dann wäre das nicht der fehler, weil man diese prozedur erst dadurch aufruft, dass man auf den button aus buttons[x][y] clickt...
Eine Indexüberschreitung dürfte auch nicht das problem sein:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm2.Button1Click(Sender: TObject);
var x,y:integer;
begin
for x:=0 to length(buttons)-1 do
 begin
  for y:=0 to length(buttons[0])-1 do
   begin
    if sender=buttons[x][y] then
     begin
      btnclick(x,y);
      exit;
     end;
   end;
 end;
end;


(das ist der prozess, der den button rausfindet, der geklickt wurde)

er sucht ja raus, wie lang die arrays sind... deswegen wird er keine grenze überschreiten...


Marc. - Do 31.07.08 23:20

Anstelle von length solltest Du high() verwenden. ;)


*Knust* - Do 31.07.08 23:24

:( ändert nix das problem is das gleiche


Narses - Do 31.07.08 23:57

Moin!

Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien [http://www.entwickler-ecke.de/richtlinien.html]:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

cu
Narses

Ach ja:
user profile icon*Knust* hat folgendes geschrieben:
:( ändert nix das problem is das gleiche
Und woher kommt dann wtag? :nixweiss:


*Knust* - Fr 01.08.08 00:01

wtag is n integerwert der 0-4 sein kann...


Narses - Fr 01.08.08 00:04

Moin!

Kommentier mal testweise die Inc+Dec-Anweisungen aus und klicke dann mal, dann Programm beenden, immer noch AV? :idea:

cu
Narses


*Knust* - Fr 01.08.08 00:30

hilft auch nich...


Narses - Fr 01.08.08 00:35

Moin!

Das wird so nix, pack mal das Projekt ohne die EXE als ZIP hier in den Anhang. :nixweiss:

cu
Narses


*Knust* - Fr 01.08.08 00:41

Jo hier


Narses - Fr 01.08.08 01:06

Moin!

Ich kriege keine AV, keine Ahnung, was du da machst. :nixweiss:

Allerdings hast du ein paar fette Schnitzer in deiner Speicherverwaltung: du erzeugst im Form2Create zwei Stringlisten, aber gibst diese nicht wieder frei :shock: und hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function tform2.lueckenfuellen(wochentag,pause:integer):integer;
begin
result:=0;
//lstlehrer:=tstringlist.Create; // Falsch, weil von Funktion geliefert!
lstlehrer:=findalllehrerzupause(point(wochentag,pause));
 for x:=0 to lstlehrer.count-1 do
rufst du eine Funktion auf, die eine Stringliste liefert, aber erzeugst vorher selbst noch eine. :hair:

Und insgesamt könnte dein Code mal eine Portion Suche bei Google STYLEGUIDE vertragen, das kann man ja kaum lesen... :|

cu
Narses


*Knust* - Fr 01.08.08 01:12

Ja das seltsame ist ja, dass er nicht immer die felher gibt... gib mal 14 pausen und 4 lehrer ein und klicke auf die erste oben links.... dann bekommst du den fehler
Wennn du 13 und 4 hast und auf die klickst nich....macht iwie keinen sinn...

danke schonmal

Knust


Narses - Fr 01.08.08 01:18

Moin!

user profile icon*Knust* hat folgendes geschrieben:
Ja das seltsame ist ja, dass er nicht immer die felher gibt...
:|

user profile icon*Knust* hat folgendes geschrieben:
gib mal 14 pausen und 4 lehrer ein und klicke auf die erste oben links.... dann bekommst du den fehler
Hab ich gemacht, 4 Lehrer, 14 Pausen, li/oben klick, "X" erscheint, Fenster zu, kein Problem. :nixweiss:

Ähm, warum nimmst du eigentlich keine Grid-Kompo (z.B. ein String-Grid)? Ist doch irgendwie einfacher, als die dynamischen Kompos, oder? :?

Abgesehen davon habe ich auch noch nicht wirklich kapiert, was da eigentlich passiert? :gruebel:

cu
Narses


*Knust* - Fr 01.08.08 01:23

xD
Ja es ist noch nich ganz fertig....
Es soll im endstadium pausenaufsichtspläne bauen aus möglichkeiten die vorgegeben sind also derhrer xy kann am montag an pause zw aufsicht machen und dann bastelt er sich was zusammen.
ja ich häte auch n grid nehmne können.... egal^^
warum sollte bei mir n fehler angezeigt werden und bei dir nicht???
ich hab es nochmal neu geladen aber immernoch kommt der fehler...


Tilman - Fr 01.08.08 01:24

Ähm meinst du vielleicht genau umegkehrt, 14 Lehrer und 4 Pausen, da gibts bei mir nen Fehler ^^


*Knust* - Fr 01.08.08 01:27

xD oder so ja^^


Tilman - Fr 01.08.08 01:32

- Der Fehler tritt bei mir sofort auf, ohne dass ich oben links auf den ersten Button klicke
- Im Einzelschritt lies sich feststellen dass er in den zeilen 145-156 auftritt
- ich bin Müde und geh ins Bett :) gute nacht ^^


*Knust* - Fr 01.08.08 01:37

xD gut.... ähnliches denke ich auch gerade...
Es ist zum verzweifeln


Aber danke für eure mühe!

Gute nacht!

Knust


Narses - Fr 01.08.08 01:42

Moin!

user profile iconTilman hat folgendes geschrieben:
Ähm meinst du vielleicht genau umegkehrt, 14 Lehrer und 4 Pausen, da gibts bei mir nen Fehler ^^
Jup, da gibt´s ohne Aktion beim Schließen schon die AV. ;)

Verdacht: liegt an den dyn. Kompos, also so vorgegangen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
for x:=0 to pausen-1 do
 begin
  editsp[x]:=tedit.Create(form2);
  //...
  editsp[x].Visible:=true;
  elinks:=elinks+btnbrt;
 end;
etop:=100;
for x:=0 to lehrer-1 do
 begin
  editsl[x]:=tedit.Create(form2);
  //...
  editsl[x].Visible:=true;
  etop:=etop+btnhhe;
 end;
Copy&Paste lässt grüßen... :roll:

cu
Narses


*Knust* - Fr 01.08.08 12:58

xD Son scheiß...
Danke!!!!

aber wie kann das an den edits liegen, wenn ich auf die buttons klicke????
Da wird doch granichts mit den edits gemacht....?

DANKE DANKE!!!


mfg

Knust