Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi array of record -> Zugriffsverletzung beim Lesen (https://www.delphipraxis.net/111203-array-record-zugriffsverletzung-beim-lesen.html)

Andy386 31. Mär 2008 15:17


array of record -> Zugriffsverletzung beim Lesen
 
Hallo,

ich habe folgendes Problem: Mein Programm ändert in einem Array von Record's ein paar Werte. Das funktioniert soweit, kann ich mir in der Mainunit mit dem ObjectInspector ansehen. Leider kann ich im Programm nicht auf die Werte zugreifen


in meiner eigenen Unit steht u.a.:
Delphi-Quellcode:
type
 dot = record
          x: double;
          y: double;
         { .... }
          end;
 layer = array [1..(size*size)] of dot;

-> die Verarbeitung der layers erfolgt über pointer, die von der mainunit aus zeigen
und in der mainunit:
Delphi-Quellcode:
var
{ .... }
 llayer: layer;
implementation

procedure TForm1.Button1Click(Sender: TObject);
var x,y:Integer;
   zahl: Int64;
begin
randomize;
myunit:=Tmyunit.create;
myunit.initlayer(@llayer);

zahl:=0;
while zahl<size*size do
    begin
    zahl:=zahl+1;
     if (llayer[zahl].x=5) then {...}
 [edit] fehler beim kopieren gemacht, sorry . vorher stand hier: if (layer[zahl].x=5) then [/edit]
der genaue Fehler lautet (beim durchlaufen der if-frage im main):
Project Project1.exe raised exception class EAccessViolation with message 'Access Violation at adress 004749D2 in module 'Project1.exe'.
Read of adress 00000010'. Process stopped. Use Step or Run to continue.


Alle Änderungen, die ich in meiner Unit machen, entsprechen dem, wie es sein soll. Ohne Fehler oder ähnliches. Eben nur, wenn ich in der Unit, in der ich mein Array definiert habe, funktioniert es nicht mehr.

Habe jetzt schon versucht, einen Zeiger auf das Auszulesende Objekt zu machen, kommt aber derselbe Fehler. (ich nutze Delphi7 Professional)

Jelly 31. Mär 2008 15:22

Re: array of record -> Zugriffsverletzung beim Lesen
 
Da sieht man mal wieder, wozu Konventionen gut sind:
In der letzten Zeile:
Delphi-Quellcode:
if (layer[zahl].x=5) then {...}
greifst du direkt auf deinen Datentyp zu, nicht aber auf die Variable... Ich denke mal, du wolltest llayer[zahl] meinen.

Und die Konvention lautet:
Datentype beginnen mit dem Buchstaben T... Ich würde also die Type dot und layer mal umtaufen in TDot und TLayer.

SirThornberry 31. Mär 2008 15:24

Re: array of record -> Zugriffsverletzung beim Lesen
 
du greifst auf ein Object zu welches nicht initialisiert wurde.

Andy386 31. Mär 2008 15:35

Re: array of record -> Zugriffsverletzung beim Lesen
 
:oops: da hab ich das falsche kopiert, sorry...
llayer steht in der Abfrage.
Und wie gesagt, ich kann ja die werte via ObjectInspector ansehen...

Fussball-Robby 31. Mär 2008 15:36

Re: array of record -> Zugriffsverletzung beim Lesen
 
Zitat:

Zitat von SirThornberry
du greifst auf ein Object zu welches nicht initialisiert wurde.


gammatester 31. Mär 2008 15:37

Re: array of record -> Zugriffsverletzung beim Lesen
 
Zitat:

Zitat von SirThornberry
du greifst auf ein Object zu welches nicht initialisiert wurde.

Also das ist doch nun wirklich kein Object, und wenn's eine globale Variable ist, ist sie automatisch initialisiert.


Zitat:

Zitat von Jelly
In der letzten Zeile ... greifst du direkt auf deinen Datentyp zu, nicht aber auf die Variable...

Das erscheint noch wilder, wie greift man auf einen Datentyp zu? Interessant ist, daß dieser Unsinn vom Compiler übersetzt wird.

Gruß Gammatester

Medium 31. Mär 2008 15:43

Re: array of record -> Zugriffsverletzung beim Lesen
 
Beides falsch.

Zitat:

Zitat von gammatester
Also das ist doch nun wirklich kein Object, und wenn's eine globale Variable ist, ist sie automatisch initialisiert.

Es ist ein Objekt, und wird aus diesem Grunde niemals automatisch initialisiert.

Zitat:

Zitat von gammatester
Das erscheint noch wilder, wie greift man auf einen Datentyp zu? Interessant ist, daß dieser Unsinn vom Compiler übersetzt wird.

Da ist nix wildes dran. Er greift nicht auf sein Objekt, sondern direkt auf die Klasse zu. Würde das nicht kompilieren, könnten kein Konstruktor, und keine class-Methoden aufgerufen werden, und das gesamte OOP-Konzept wäre unmöglich.

btw: SirThornberry ist der Schreibfehler nicht aufgefallen, weswegen er vom Objekt ausging. Das scheint aber laut TE halt nur ein C&P Fehler zu sein, und ist somit dennoch gültig.

Andy386 31. Mär 2008 15:49

Re: array of record -> Zugriffsverletzung beim Lesen
 
Also, meine prozedur myunit.initlayer beschreibt den layer mit Startwerten.

wie gesagt, werte sind alle drinnen und lassen sich im Debug anzeigen, jedoch weder rauskopieren oder auslesen noch überprüfen...

sorry nochmal wegen des Fehlers beim übertragen meines quellcodes, jellys antwort stimmte schon

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

Re: array of record -> Zugriffsverletzung beim Lesen
 
Kann es sein, dass es etwas mit dieser Zeile zu tun hat?:
Delphi-Quellcode:
myunit.initlayer(@llayer);
Ich weiß nicht, was das bewirkt, aber ich habe alles außer dieser Zeile und der Zeile davor bei mir ausprobiert, und es gibt keinen Fehler.

gammatester 31. Mär 2008 15:51

Re: array of record -> Zugriffsverletzung beim Lesen
 
Zitat:

Zitat von Medium
Beides falsch.

Zitat:

Zitat von gammatester
Also das ist doch nun wirklich kein Object, und wenn's eine globale Variable ist, ist sie automatisch initialisiert.

Es ist ein Objekt, und wird aus diesem Grunde niemals automatisch initialisiert.

Zitat:

Zitat von gammatester
Das erscheint noch wilder, wie greift man auf einen Datentyp zu? Interessant ist, daß dieser Unsinn vom Compiler übersetzt wird.

Da ist nix wildes dran. Er greift nicht auf sein Objekt, sondern direkt auf die Klasse zu. Würde das nicht kompilieren, könnten kein Konstruktor, und keine class-Methoden aufgerufen werden, und das gesamte OOP-Konzept wäre unmöglich.

Es wird immer wilder, jetzt ist ein array of record schon eine Klasse, vorher war's nur ein Objekt!

Aber es war ja ein Tippfehler, d.h. der Compiler würde es wohl nicht übersetzen. Und deshalb sollten wir uns nicht in immer wildere Erklärungsversuche flüchten.

Gruß Gammatester

Andy386 31. Mär 2008 15:53

Re: array of record -> Zugriffsverletzung beim Lesen
 
Also, fehler beim compilieren habe ich auch keine, nur während der laufzeit...

ok, hab nochmal während der der Laufzeit geguckt, den Mauszeiger über dei variable gehalten: der Wert der Variable ist doch tatsächlich lesbar (1,23)
dennoch stürzt es ab

gammatester 31. Mär 2008 15:57

Re: array of record -> Zugriffsverletzung beim Lesen
 
Zitat:

Zitat von Andy386
Also, fehler beim compilieren habe ich auch keine, nur während der laufzeit...

Du sagst also, daß mit
Delphi-Quellcode:
(layer[zahl].x=5)
statt
Delphi-Quellcode:
(llayer[zahl].x=5)
ohne Fehler compiliert wird?

Medium 31. Mär 2008 15:57

Re: array of record -> Zugriffsverletzung beim Lesen
 
:oops: Shame on me. Ich bin einfach davon ausgegangen, dass "dot" eine class ist und kein record, sowie ich bei layer von einer Liste ausging. Mag daran liegen, dass ich Arrays von Records wann immer möglich meide, und dafür Listen mit Objekten verwende.

Andy386 31. Mär 2008 16:06

Re: array of record -> Zugriffsverletzung beim Lesen
 
genau, gammatester.
wenn er dann in die Zeile mit dem if kommt, kommt der oben geschriebene Fehler mit Zugrissverletzung.
die kommt auch, wenn ich mit einem Pointer auf den betreffenden dot etwas auslesen will

ok, ich glaub, ich geh kaputt...
SO geht es :bounce2: :


Delphi-Quellcode:
  var helpdot: ^dot;
begin {...}
    helpdot:=@llayer[zahl];
    if helpdot.x=2 then
    if (llayer[zahl].x=2) then
SO nicht:
Delphi-Quellcode:
 if (llayer[zahl].x=2) then
So, @profis: jetzt gibts wirklich was zu spekulieren :-D

Muetze1 31. Mär 2008 17:45

Re: array of record -> Zugriffsverletzung beim Lesen
 
Ich empfehle dir erstmal grundsätzlich in den Projektoptionen die Bereichsprüfung und die Überlaufprüfung einzuschalten und das komplette Projekt neu zu erstellen (also nicht compilieren, sondern erstellen!) und dann nochmal zu starten. Dann schau nochmal nach dem Fehler.

Klaus01 31. Mär 2008 20:43

Re: array of record -> Zugriffsverletzung beim Lesen
 
Delphi-Quellcode:
var helpdot: ^dot;
begin {...}
    helpdot:=@llayer[zahl];
    if helpdot.x=2 then
      if (llayer[zahl].x=2) then
nur mal so geraten, aber kann es sein, dass im obigen Konstrukt
nicht in den if (llayer..) zweig hineingesprungen wird.

Grüße
Klaus

Andy386 1. Apr 2008 12:14

Re: array of record -> Zugriffsverletzung beim Lesen
 
@Klaus: nein, er springt rein und macht alles, was er soll (also, was im Zweig drinnen steht (die jeweiligen Punkte malen)

@muetze: ok, hab ich jetzt an, wird aber nicht als Fehler gemeldet & stürzt (ohne mein Konstrukt) ab.

Muetze1 1. Apr 2008 13:55

Re: array of record -> Zugriffsverletzung beim Lesen
 
Zitat:

Zitat von Andy386
@muetze: ok, hab ich jetzt an, wird aber nicht als Fehler gemeldet & stürzt (ohne mein Konstrukt) ab.

Dann ist der Speichermanager irgendwie vermurkst. Schonmal mit FreeMem und alles Checks versucht Stellen aufzuspüren wo auf freigegebene Objekte oder Zeiger zugegriffen wird?

Andy386 2. Apr 2008 10:14

Re: array of record -> Zugriffsverletzung beim Lesen
 
Nein. Hab keine Ahnung wie das geht.
Gibt's da auch ein Tutorial zu ?

Muetze1 2. Apr 2008 11:55

Re: array of record -> Zugriffsverletzung beim Lesen
 
Schau z.B. mal hier.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz