ich bin über ein Problem gestolpert, das ich einfach umgehen kann. Mir ist jedoch nicht klar, ob es sich dabei um ein Bug oder Feature des Compilers handelt:
Code: Alles auswählen
type
TListRec = Record
ID: Integer;
Zahl: Integer;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
List: Array of TListRec;
function GetListPos(aID: Integer): Int32;
procedure IncZahl(aID: Integer);
public
end;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
IncZahl(Random(100));
end;
function TForm1.GetListPos(aID: Integer): Int32;
var
i: Int32;
begin
i:=0;
while (i < Length(List)) and (List[i].ID <> aID) do
inc(i);
if i < Length(List) then begin
Result:=i;
Exit;
end;
SetLength(List, Length(List) + 1);
Result:=High(List);
List[Result].Zahl:=0;
List[Result].ID:=aID;
end;
procedure TForm1.IncZahl(aID: Integer);
var
aPos: Integer;
begin
// aPos:=GetListPos(aID); //Das ist kein Problem
// Inc(List[aPos].Zahl);
Inc(List[GetListPos(aID)].Zahl); //hier kommt es zu einer Zugriffsverletzung
end;