Hallo.
Bevor ich loslege,
erstmal ein dickes Lob an die Entwickler.
Ich weiß weder ob es hier der richtige Ort ist, dies zu posten, noch ob es für alle Benutzer von
Andorra 2D interessant sein könnte oder nur für die Entwickler.
Ich versuche mich gerade in die Engine einzuarbeiten und scheiterte schon am ersten Beispiel.
Allerdings liegt das Problem nicht bei mir, wie ich nach etwas suchen festgestellt habe.
In den beiliegenden Beispiel-Projekten ist in den Projektoptionen (Compiler-Optionen) die
Überlaufsprüfung abgeschaltet.
Ist leider ein wenig unsicher wie ich festgestellt habe. Denn in der
Unit "AdContainers.pas" fliegt man beim compilieren mit einem
EIntOverflow-Error zurecht raus.
Delphi-Quellcode:
...
procedure TAdMap.Rehash(ACapacity: Cardinal);
...
//Copy elements into new array
PList1 := FData;
for i := 0 to FCapacity - 1 do // <--- Hier der Fehler, FCapacity ist bisher immer 0 gewesen
begin
with PList1^ do
begin
StartIteration;
while not ReachedEnd do
begin
PCurItem := GetCurrent;
//Insert element
PList2 := PTmp;
Pos := (PCurItem^.Key.Hash mod ACapacity);
Inc(PList2,Pos);
PList2^.Add(PCurItem);
end;
end;
Inc(PList1);
end;
...
FCapacity ist, bis jetzt, immer 0 gewesen, dadurch die
Exception.
In meinen (neuen) Projekten ist diese Bereichsprüfung standardmäßig eingeschaltet, dadurch flog ich raus und beim kompilieren der Demos funktionierte es.
Es gäbe zwei Möglichkeiten das Problem zu lösen.
Entweder man schaltet die Überlaufsprüfung aus, was ich persönlich nicht für günstig halte, da, wie man sieht, sich schnell Fehler einschleichen können, die das ganze Programm in den Abgrund ziehen.
Oder es wird die Prüfung vor der Schleife durchgeführt. Allerdings müsste man das im Quelltext ändern und das evtl. an mehreren Stellen.
Delphi-Quellcode:
...
procedure TAdMap.Rehash(ACapacity: Cardinal);
...
//Copy elements into new array
PList1 := FData;
if FCapacity > 0 then // <-- Hier prüfen...
begin
for i := 0 to FCapacity - 1 do // <-- ... damits hier nicht knallt
begin
with PList1^ do
begin
StartIteration;
while not ReachedEnd do
begin
PCurItem := GetCurrent;
//Insert element
PList2 := PTmp;
Pos := (PCurItem^.Key.Hash mod ACapacity);
Inc(PList2,Pos);
PList2^.Add(PCurItem);
end;
end;
Inc(PList1);
end;
end;
...
Falls mir hier dennoch irgendein Fehler unterlaufen sein sollte, Sorry...
Gruss
BlackDragon