Thema: Delphi Pointer-Problem

Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

Pointer-Problem

  Alt 26. Jan 2012, 12:21
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 <> 'TodCompetitorthen
  begin
    beep;
  end;
  if TComponent(Item2).ClassName <> 'TodCompetitorthen
  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
...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (26. Jan 2012 um 12:23 Uhr)
  Mit Zitat antworten Zitat