Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi GetMem, FreeMem (https://www.delphipraxis.net/15994-getmem-freemem.html)

Pseudemys Nelsoni 8. Feb 2004 16:17


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

Luckie 8. Feb 2004 16:27

Re: GetMem, FreeMem
 
Delphi-Quellcode:
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;
Besser wäre New und Dispose.

Giantics 8. Feb 2004 16:33

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;
...

Giantics 8. Feb 2004 16:35

Re: GetMem, FreeMem
 
Menno, leicht zu spät :stupid:
Zitat:

Zitat von Luckie
Besser wäre New und Dispose.

Was ist eigentlich der Unterschied zwischen GetMem/FreeMem und New/Dispose. Werde aus der Hilfe nicht schlau und meist funktioniert sowieso beides. :gruebel:

Pseudemys Nelsoni 8. Feb 2004 16:37

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

Luckie 8. Feb 2004 16:43

Re: GetMem, FreeMem
 
@Pseudo-Dingsbums. Ist so üblich. Aber ohne bekommst du den Cast
Delphi-Quellcode:
PNamen(Namen)^.vName
nicht hin.

@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:
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;
Man muss nicht explizit mit "^" dereferenzieren.

Giantics 8. Feb 2004 16:55

Re: GetMem, FreeMem
 
Zitat:

Zitat von Pseudemys Nelsoni
...
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

Achso. Danke.
hätte immer gedacht, dass die den Speicher irgendwie "anders" reservieren.

Pseudemys Nelsoni 8. Feb 2004 17:42

Re: GetMem, FreeMem
 
hoi,

wieso kann man das "^" bei einer zuweisung weglassen? wenn ich einen string etc benutze muss ich den angeben

Luckie 8. Feb 2004 19:35

Re: GetMem, FreeMem
 
Compiler-Magic. Delphi dereferenziert automatisch. Abetr was meinst du mit "Sting angeben"?

Pseudemys Nelsoni 8. Feb 2004 19:53

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