AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Access Violation beim Kopieren aus Record
Thema durchsuchen
Ansicht
Themen-Optionen

Access Violation beim Kopieren aus Record

Ein Thema von T-MagX · begonnen am 2. Nov 2007 · letzter Beitrag vom 2. Nov 2007
Antwort Antwort
T-MagX

Registriert seit: 19. Nov 2006
6 Beiträge
 
#1

Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 21:33
Hallo erstmal
Ich hab mal wieder ein Problem und hoffe, dass ihr mir helfen könnt.
Situation:
Ich hab einen Record von dieser Art:
Delphi-Quellcode:
type
  Prec = ^Trec;
  Trec = record
    consock: TSocket;
  end;
In meiner erstern Prozedur reservier ich einen Speicherbereich mit diesem Record:
Delphi-Quellcode:
var
  recObj: Prec;

GetMem(recObj, sizeof(Trec));
sendObj.consock := tmpSock[der tut nix zur Sache, kommt aus einem WinSock accept Vorgang];
Als nächstes ruf ich einen Prozedur auf mit dem record arbeiten sollen:
Delphi-Quellcode:
procedure bla(recObj: Prec);
var p: pointer;
begin
  GetMem(p, sizeof(TSocket));
  CopyMemory(p, pointer(recObj.consock), sizeof(TSocket));
end;
Bei dem CopyMemory bekomm ich dann aber eine Access Violation, warum versteh ich leider momentan nicht.
Ich hoffe jemand kann mir sagen wo das Problem liegt und villeicht auch den Hintergund ein wenig erläutern.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 21:36
Wahrscheinlich meinst duCopyMemory(p^, recObj.consock, sizeof(TSocket)); Aber sage - was bringt es? sizeof(Pointer) = sizeof(TSocket), also musst du schon einen sehr guten Grund für einfeldrecordrumgepointere bringen..

edits: gnah, typo..
  Mit Zitat antworten Zitat
T-MagX

Registriert seit: 19. Nov 2006
6 Beiträge
 
#3

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 21:41
Zitat von Dax:
Wahrscheinlich meinst duCopyMemory(p^, recObj.consock, sizeof(TSocket)); Aber sage - was bringt es? sizeof(Pointer) = sizeof(TSocket), also musst du schon einen sehr guten Grund für einfeldrecordrumgepointere bringen..

edits: gnah, typo..
Ist nicht ein Feld. Ist blos ein Beispiel Code aus dem Original aufs nötigste beschränkt.
Übrigens danke für die Hilfe.
edit: Funktioniert so noch weniger. p ist kein untyped Pointer und recObj.consock kein Pointer.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 21:48
Was sagt denn "move"?

Edit: Aber ein TSocket ist ein Handle. Du wirst mit dem Pointer nicht auf den TCB kommen, falls du das vor hast.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 21:49
Hmm.. Oke, ich sollte Spekulationen über die Syntax unterlassen, hab schon lange kein Delphi mehr benutzt *g*

Aber zum Thema: ^record kann sehr oft (gewinnbringend) durch class ersetzt werden, hast du darüber schon einmal nachgedacht? Deine GetMem-Aufrufe vereinfachen sich zu einem .Create und das CopyMemory-Beispiel ließe sich über einen Kopierkonstruktor oder eine .Clone-Methode sehr elegant lösen. Wenn du zusätzlich noch ein Interface implementierst, von TInterfacedObject ableitest und fortan nur noch mit dem Interface arbeitest, musst du dich nicht mal um die Speicherfreigabe kümmern.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 21:52
Pointer(recObj.consock) - Böse Sache. Damit verwandelst du recObj.consock in einen Pointer und kopierst den Wert, der an der Stelle mit dem Index von recObj.consock steht, wiederum einem Pointer zu. Wirklich äußerst unschöne Sache, denn recObj.consock ist wahrscheinlich ein Handle, d.h. sobald du versuchen willst, auf den Speicher an dieser Stelle zuzugreifen, stellst du eine üble Sauerei im Speicher an, die natürlich als Zugriffsverletzung abgefangen wird.

So ist es richtig:
Delphi-Quellcode:
procedure bla(recObj: Prec);
var p: pointer;
begin
  GetMem(p, sizeof(TSocket));
  CopyMemory(p, @recObj.consock, sizeof(TSocket));
end;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
T-MagX

Registriert seit: 19. Nov 2006
6 Beiträge
 
#7

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 21:53
Zitat von sirius:
Was sagt denn "move"?

Edit: Aber ein TSocket ist ein Handle. Du wirst mit dem Pointer nicht auf den TCB kommen, falls du das vor hast.
Ich gedenke die Nummer des Handles herumzukopieren. TSocket is ja nur die Bezeichnung eines Integers.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 22:12
Dann könntest du es auch einfach so machen:

p^:=recObj.consock;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
T-MagX

Registriert seit: 19. Nov 2006
6 Beiträge
 
#9

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 23:11
Zitat von 3_of_8:
Dann könntest du es auch einfach so machen:

p^:=recObj.consock;
Ja geht nicht nur um eine Variable.
Jetz kommts ja, ich versuche einen Pointer zu einer Art Buffer zu erstellen.
Dabei kopier ich mehrere Arten von Daten an den Speicherort. Um das zu tun müsste ich jetz noch gerausfinden wie ich inc() einsetze um meine Pointer Addresse zu erhöhen.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Access Violation beim Kopieren aus Record

  Alt 2. Nov 2007, 23:19
Wie gesagt, mein Tipp oben (in meinem ersten Beitrag) wird funktionieren. Und um einen Pointer zu erhöhen, reicht ein einfacher Typecast.

So zum Beispiel:
Integer(p):=Integer(p)+1;

Oder auch:
inc(Integer(p));
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.
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