Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.
Seite 1 von 2  1 2      

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