Autor Beitrag
nickbierwisch
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 05.12.08 19:10 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19317
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 05.12.08 19:17 
Versuchs doch mal so: ;-)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden 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.

_________________
Na denn, dann. Bis dann, denn.
nickbierwisch Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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