AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetMem, FreeMem

Ein Thema von Pseudemys Nelsoni · begonnen am 8. Feb 2004 · letzter Beitrag vom 8. Feb 2004
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

GetMem, FreeMem

  Alt 8. Feb 2004, 17:17
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
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 17:27
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Giantics

Registriert seit: 17. Nov 2003
Ort: Langenbrettach
99 Beiträge
 
#3

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 17:33
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;
...
T. Dieffenbach
"Delphi"-Version: Lazarus 0.9.22

Was ist der Unterschied zwischen Bill Gates und Gott?
-->Gott hält sich nicht für Bill Gates!
  Mit Zitat antworten Zitat
Giantics

Registriert seit: 17. Nov 2003
Ort: Langenbrettach
99 Beiträge
 
#4

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 17:35
Menno, leicht zu spät
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.
T. Dieffenbach
"Delphi"-Version: Lazarus 0.9.22

Was ist der Unterschied zwischen Bill Gates und Gott?
-->Gott hält sich nicht für Bill Gates!
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 17:37
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
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 17:43
@Pseudo-Dingsbums. Ist so üblich. Aber ohne bekommst du den Cast
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Giantics

Registriert seit: 17. Nov 2003
Ort: Langenbrettach
99 Beiträge
 
#7

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 17:55
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.
T. Dieffenbach
"Delphi"-Version: Lazarus 0.9.22

Was ist der Unterschied zwischen Bill Gates und Gott?
-->Gott hält sich nicht für Bill Gates!
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#8

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 18:42
hoi,

wieso kann man das "^" bei einer zuweisung weglassen? wenn ich einen string etc benutze muss ich den angeben
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 20:35
Compiler-Magic. Delphi dereferenziert automatisch. Abetr was meinst du mit "Sting angeben"?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#10

Re: GetMem, FreeMem

  Alt 8. Feb 2004, 20:53
ah ok. meinte wenn ich ein string statt ein record benutze muss ich das dach "^" mit angeben oder?
Mario
  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 07:28 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