![]() |
GetMem, FreeMem
hoi,
was ist hieran falsch?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type TNamen = Record vName: string; nName: string; end; var Namen: ^TNamen; begin GetMem(Namen, SizeOf(TNamen)); Namen^.vName := 'Mario'; Namen^.nName := 'Kellner'; ShowMessage(Namen^.vName + ' ' + Namen^.nName); FreeMem(Namen, SizeOf(TNamen)); end; ich kann auf den elementen des arrays nichts zuweisen, immer zugriffsfehler |
Re: GetMem, FreeMem
Delphi-Quellcode:
Besser wäre New und Dispose.
type
TNamen = Record vName: string[255]; nName: string[255]; end; PNamen = ^TNamen; procedure TForm1.Button1Click(Sender: TObject); var Namen: PNamen; begin GetMem(Namen, SizeOf(TNamen)); try PNamen(Namen)^.vName := 'Mario'; PNamen(Namen)^.nName := 'Kellner'; ShowMessage(Namen^.vName + ' ' + Namen^.nName); finally FreeMem(Namen, SizeOf(TNamen)); end; end; |
Re: GetMem, FreeMem
Das Problem sind die Strings. Die sind ja dynamisch und nicht statisch und deshalb ist das so nicht möglich. Entweder mit PChars und damit wieder extra Speicher reservieren, oder eben String durch ShortString tauschen. So gehts auf jeden Fall :) :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type TNamen = Record vName: ShortString; nName: ShortString; end; ... |
Re: GetMem, FreeMem
Menno, leicht zu spät :stupid:
Zitat:
|
Re: GetMem, FreeMem
ah, danke schön, geht ^^
luckie, ist das "PNamen" nötig, oder nur als hilfe? giantics: New, Dispose wissen die grösse der zu reservierenden bytes anhand des typs, bei GetMen, Freemem musst du das selbst angeben, falls du erst zur laufzeit weisst wieviel das sein wird |
Re: GetMem, FreeMem
@Pseudo-Dingsbums. Ist so üblich. Aber ohne bekommst du den Cast
Delphi-Quellcode:
nicht hin.
PNamen(Namen)^.vName
@Giantics: Pseudo-Dingbums hat es genau getroffen. Und da sich eine Recordgröße nicht ändert, wäre New und Dispose besser. So geht es:
Delphi-Quellcode:
Man muss nicht explizit mit "^" dereferenzieren.
type
TNamen = Record vName: string[255]; nName: string[255]; end; PNamen = ^TNamen; procedure TForm1.Button1Click(Sender: TObject); var Namen: PNamen; begin GetMem(Namen, SizeOf(TNamen)); try PNamen(Namen)^.vName := 'Mario'; PNamen(Namen)^.nName := 'Kellner'; ShowMessage(Namen.vName + ' ' + Namen.nName); finally FreeMem(Namen, SizeOf(TNamen)); end; end; procedure TForm1.Button2Click(Sender: TObject); var Namen: ^TNamen; begin New(Namen); try Namen.vName := 'Mario'; Namen.nName := 'Keller'; ShowMessage(Namen.vName + Namen.nName); finally Dispose(Namen); end; end; |
Re: GetMem, FreeMem
Zitat:
hätte immer gedacht, dass die den Speicher irgendwie "anders" reservieren. |
Re: GetMem, FreeMem
hoi,
wieso kann man das "^" bei einer zuweisung weglassen? wenn ich einen string etc benutze muss ich den angeben |
Re: GetMem, FreeMem
Compiler-Magic. Delphi dereferenziert automatisch. Abetr was meinst du mit "Sting angeben"?
|
Re: GetMem, FreeMem
ah ok. meinte wenn ich ein string statt ein record benutze muss ich das dach "^" mit angeben oder?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 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