AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer-Problem

Ein Thema von stahli · begonnen am 26. Jan 2012 · letzter Beitrag vom 26. Jan 2012
 
Benutzerbild von stahli
stahli

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

Pointer-Problem

  Alt 26. Jan 2012, 11: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 11:23 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz