Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Seltsame AV bei Pointerzweisung (https://www.delphipraxis.net/113422-seltsame-av-bei-pointerzweisung.html)

Neutral General 7. Mai 2008 17:06


Seltsame AV bei Pointerzweisung
 
Hi,

Habe folgenden Quelltext:

Delphi-Quellcode:
TKlasse = class(...)
private
  FMemory: Pointer;
  FSize: Int64;
public
  constructor Create(P: Pointer; DataSize: Int64);
  property Memory: Pointer read FMemory;
end;

implementation

var x: Pointer;

constructor TKlasse.Create(P: Pointer; DataSize: Int64);
var y: Pointer;
begin
  inherited Create;
  FMemory := P; // AV
  x := P;      // keine AV
  y := P;      // keine AV
  FSize := DataSize;
end;
Der Quelltext sagt schon eigentlich alles.. Ich bekomme wenn ich P FMemory zuweise eine AV. Bei allen anderen Pointervariablen (lokal, global) funktioniert es :gruebel:

Gruß
Neutral General

SirThornberry 7. Mai 2008 17:10

Re: Seltsame AV bei Pointerzweisung
 
Wie lauten die Details der AV (vollständige Fehlermeldung!)?

Neutral General 7. Mai 2008 17:16

Re: Seltsame AV bei Pointerzweisung
 
Hi,

ne ganz "normale" AV:

Zitat:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00455813 in module 'Project1.exe'. Write of address 00000004'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Das seltsame ist, dass ich für @FMemory während dem debuggen: "Inaccessible value" angezeigt bekomme... Verstehe das alles nicht... :?

PS: x ist <> Pointer($00455813) und <> Pointer($4)!

grenzgaenger 7. Mai 2008 17:17

Re: Seltsame AV bei Pointerzweisung
 
also bei mir läuft das problemlos...
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type
 tC = class
  strict private
   fMem: Pointer;
  public
   Constructor Create(p: Pointer);
   procedure run;
   property Memory: Pointer read fMem;
 end;

{ tC }
constructor tC.Create(p: Pointer);
begin
 Inherited Create;
 fMem := p;
end;
procedure tC.run;
begin
 writeln('irgendwas ...');
 readln;
end;

var
 x: TC;
begin
 x := tc.Create(pointer($abcd));
 try
  x.run;
 finally
  x.free;
 end;
end.
muss also an einer anderen stelle liegen... was rufst du zuvor auf? vielleicht ist die meldung nur verzögert...

BTW: ist deine klasse bereits erstellt?

sirius 7. Mai 2008 17:18

Re: Seltsame AV bei Pointerzweisung
 
Eigentlich ist es nicht von dir zu erwarten, aber du rufst nicht doch zufällig Create direkt als Methode auf (Klasse.create) anstatt als Klasse:=TKlasse.create;
So sieht es zumindest aus.

SirThornberry 7. Mai 2008 17:19

Re: Seltsame AV bei Pointerzweisung
 
Zitat:

ne ganz "normale" AV:
So wie ein Fehler ein ganz normaler Fehler ist ;-)

Durch die vollständige Fehlermeldung kann ich dir deinen Fehler schon recht sicher sagen:
Delphi-Quellcode:
var
  instanz: TKlasse;
begin
  instanz.Create(irgendwas, irgendwas);
  //anstelle von:
  instanz := TKlasse.Create(irgendwas, irgendwas);
[Edit]4 ist das Offset von fMemory zur Instanz

Neutral General 7. Mai 2008 17:25

Re: Seltsame AV bei Pointerzweisung
 
Tatsächlich :oops:

Passiert mir eigentlich nie, und wenn dann bemerke ichs eigentlich noch rechtzeitig :?


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