blob: 4c6c3238fe0a5edd7beafefe255bf2b453ee4d48 (
plain)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
{ %fail }
program project1;
{$mode objfpc}{$H+}
uses
sysutils, Classes;
type
generic TBroken<_T> = class
private type
T_TArray = array of _T;
private var
FArray: T_TArray;
private
function FGetTopEntry(): _T;
procedure FSetTopEntry(Value: _T);
public
constructor Create(Len: integer);
property TopEntry: _T read FGetTopEntry write FSetTopEntry;
end;
TRecord = record
x, y, z: integer;
end;
TMaybeBroken = class
private
FArray: array of TRecord;
function FGetTopEntry(): TRecord;
procedure FSetTopEntry(Value: TRecord);
public
constructor Create(Len: integer);
property TopEntry: TRecord read FGetTopEntry write FSetTopEntry;
end;
TBrokenRecord = specialize TBroken<TRecord>; // pun intended
var
a: TBrokenRecord;
b: TMaybeBroken;
i: integer;
constructor TBroken.Create(Len: integer);
var
i: integer;
begin
SetLength(FArray, Len);
FillChar(FArray[0], SizeOf(_T) * Len, 0);
end;
function TBroken.FGetTopEntry(): _T;
begin
Result := FArray[High(FArray)];
end;
procedure TBroken.FSetTopEntry(Value: _T);
begin
FArray[High(FArray)] := Value;
end;
constructor TMaybeBroken.Create(Len: integer);
var
i: integer;
begin
SetLength(FArray, Len);
FillChar(FArray[0], SizeOf(TRecord) * Len, 0);
end;
function TMaybeBroken.FGetTopEntry(): TRecord;
begin
Result := FArray[High(FArray)];
end;
procedure TMaybeBroken.FSetTopEntry(Value: TRecord);
begin
FArray[High(FArray)] := Value;
end;
begin
a := TBrokenRecord.Create(10);
Inc(a.TopEntry.x);
for i := 0 to 9 do writeln(inttostr(a.FArray[i].x));
a.Free();
writeln('---');
b := TMaybeBroken.Create(10);
Inc(b.TopEntry.x);
for i := 0 to 9 do writeln(inttostr(b.FArray[i].x));
b.Free();
end.
|