![]() |
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:
und in der mainunit:
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
Delphi-Quellcode:
der genaue Fehler lautet (beim durchlaufen der if-frage im main):
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] 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) |
Re: array of record -> Zugriffsverletzung beim Lesen
Da sieht man mal wieder, wozu Konventionen gut sind:
In der letzten Zeile:
Delphi-Quellcode:
greifst du direkt auf deinen Datentyp zu, nicht aber auf die Variable... Ich denke mal, du wolltest llayer[zahl] meinen.
if (layer[zahl].x=5) then {...}
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. |
Re: array of record -> Zugriffsverletzung beim Lesen
du greifst auf ein Object zu welches nicht initialisiert wurde.
|
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... |
Re: array of record -> Zugriffsverletzung beim Lesen
Zitat:
|
Re: array of record -> Zugriffsverletzung beim Lesen
Zitat:
Zitat:
Gruß Gammatester |
Re: array of record -> Zugriffsverletzung beim Lesen
Beides falsch.
Zitat:
Zitat:
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. |
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 |
Re: array of record -> Zugriffsverletzung beim Lesen
Kann es sein, dass es etwas mit dieser Zeile zu tun hat?:
Delphi-Quellcode:
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.
myunit.initlayer(@llayer);
|
Re: array of record -> Zugriffsverletzung beim Lesen
Zitat:
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 |
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 |
Re: array of record -> Zugriffsverletzung beim Lesen
Zitat:
Delphi-Quellcode:
statt
(layer[zahl].x=5)
Delphi-Quellcode:
ohne Fehler compiliert wird?
(llayer[zahl].x=5)
|
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.
|
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:
SO nicht:
var helpdot: ^dot;
begin {...} helpdot:=@llayer[zahl]; if helpdot.x=2 then if (llayer[zahl].x=2) then
Delphi-Quellcode:
So, @profis: jetzt gibts wirklich was zu spekulieren :-D
if (llayer[zahl].x=2) then
|
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.
|
Re: array of record -> Zugriffsverletzung beim Lesen
Delphi-Quellcode:
nur mal so geraten, aber kann es sein, dass im obigen Konstrukt
var helpdot: ^dot;
begin {...} helpdot:=@llayer[zahl]; if helpdot.x=2 then if (llayer[zahl].x=2) then nicht in den if (llayer..) zweig hineingesprungen wird. Grüße Klaus |
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. |
Re: array of record -> Zugriffsverletzung beim Lesen
Zitat:
|
Re: array of record -> Zugriffsverletzung beim Lesen
Nein. Hab keine Ahnung wie das geht.
Gibt's da auch ein Tutorial zu ? |
Re: array of record -> Zugriffsverletzung beim Lesen
Schau z.B. mal
![]() |
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