Einzelnen Beitrag anzeigen

_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#646

Re: Andorra 2D [Ver. 0.35, 04.03.08]

  Alt 19. Jun 2008, 12:26
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
  Mit Zitat antworten Zitat