Hi,
ich nutze einige Objekte zur Datenverwaltung und lasse die in ggf. Listen sortieren.
Gestern bekam ich ein Problem, das ich mir nicht erklären kann. Eine Sortierfunktion knallt mir gelegentlich um die Ohren.
Nach einiger Suche fand ich heraus, dass die Pointer i.d.R. so um die $0800.0000 liegen. Gelegentlich ist dann einer über $1000.0000 dabei, was zu einer Zugriffsverletzung führt.
Also habe ich vor der Sortierung die Liste untersucht. Da ist aber noch alles i.O.!?
Natürlich kann ich nochmal alles neu aufbauen und z.B. eine generische Liste nutzen, aber irgendwie muss sich das Problem doch finden lassen.
Hat da jemand eine Idee?
Delphi-Quellcode:
function ListSortCompetitors(Item1, Item2: Pointer): Integer;
var
C1, C2: TodCompetitor;
begin
if Integer(Item1) >= $10000000 then
begin
Exit(0); // Zugriffsfehler vermeiden
end;
if Integer(Item2) >= $10000000 then
begin
Exit(0); // Zugriffsfehler vermeiden
end;
if TComponent(Item1).ClassName <> 'TodCompetitor' then
begin
beep;
end;
if TComponent(Item2).ClassName <> 'TodCompetitor' then
begin
beep;
end;
C1 := TodCompetitor(Item1);
C2 := TodCompetitor(Item2);
if C1.Tag <> C1.GameParty.Tag then
begin
beep;
end;
if C2.Tag <> C2.GameParty.Tag then
begin
beep;
end;
Result := CompareValue(C2.GameParty.PlayerList.Count, C1.GameParty.PlayerList.Count);
if Result = 0 then
Result := Random(3) - 1;
end;
//
...
// CL ist ein Container, der intern eine einfache Liste verwaltet
for I := 0 to CL.Count - 1 do // Liste vor Sort prüfen
begin
// CodeSite.Send(inttostr(CL.Competitor(I).GameParty.PlayerList.Count));
if Integer(Pointer(CL.Competitor(I))) > $10000000 then
begin
beep; // kommt nicht vor
end;
if not odExist(CL.Competitor(I)) then
begin
beep; // kommt nicht vor
end;
if CL.Competitor(I).Tag <> Succ(I) then
begin
beep; // kommt nicht vor
end;
if not odExist(CL.Competitor(I).GameParty) then
begin
beep; // kommt nicht vor
end;
if CL.Competitor(I).GameParty.Tag <> Succ(I) then
begin
beep; // kommt nicht vor
end;
end;
if CL.Count > 1 then
CL.Items.Sort(ListSortCompetitors); // Liste Sortieren - gelegentlich Zugriffsfehler
...