Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - dynamische Liste aus Records mit Strings


nickbierwisch - Fr 05.12.08 19:10
Titel: dynamische Liste aus Records mit Strings
Hi,

ich möchte dynamisch eine Liste von Records verwalten. Allerdings klappt es nur wenn mein Record keinen String enthält. Das Programm stürzt beim Setzen von 'Test' ab. Muss ich bei einem String den Speicherbereich noch irgendwie reservieren?

Vielen Dank im Vorraus
Nick

Der TestCode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
type
  TTestRecord = record
    e:extended;
    i:integer;
    s:string;
  end;

  PTestRecord = ^TTestRecord;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var p:PTestRecord;
begin
  p:=GlobalAllocPtr(GMEM_FIXED,sizeof(TTestRecord));
  p^.e:=1.3;
  p^.i:=1;
  p^.s:='Test';
end;



Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 05.12.2008 um 18:47


jaenicke - Fr 05.12.08 19:17

Versuchs doch mal so: ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  p: PTestRecord;
begin
  New(p);
  p.e := 1.3;
  p.i := 1;
  p.s := 'Test';
  ShowMessage(p.s);
  Dispose(p);
Die Dereferenzierung kannst du dir sparen, denn Delphi weiß ja, dass es ein Pointer auf den Record ist.


alzaimar - Fr 05.12.08 22:10

Der Grund, wieso die Alloziierung und anschließende Zuweisung nicht funktioniert ist der, das ein 'string' einfach ein Zeiger ist. Wenn Du Strings in einem statischen Record ablegen willst, empfiehlt sich die alte 'String[<Länge>]' schreibweise. So wird der String direkt im Speicherbereich des Records abgelegt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Type
  TRecord1 = Record
    mystring : String;
  end;

  TRecord2 = Record
    myString : String[80];
  end;

begin
  writeln(SizeOf(TRecord1));
  writeln(SizeOf(TRecord2));
end.


nickbierwisch - Mo 05.01.09 18:34

Danke für die schnellen Antworten. Leider bin ich erst jetzt dazu gekommen es auszuprobieren. Die Version von jaenicke funktioniert und die alzaimar habe ich deshalb nicht probiert.

Nochmals vielen Dank
Nick