Toon posts:

[delphi] TList.Sort doet raar

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi,

ik probeer in delphi een TList te sorteren met de Sort functie maar ik krijg steeds een access violation.
Ik heb voor te sorteren de volgende 2 functies:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
function TProductContainer.CompareNames(Item1, Item2: Pointer): Integer;
var p1, p2: TProduct;
begin
    p1 := TProduct(Item1);
    p2 := TProduct(Item2);
    Result := CompareText(p1.Name, p2.Name);
end;

procedure TProductContainer.Sort(field: string);
begin
    if field = 'name' then
        fProductss.Sort(@TProductContainer.CompareNames);
end


Volgens de help en alle voorbeelden die k op internet heb gevonden zou dit gewoon moeten werken. Hij blijft hangen bij die CompareText functie zodra hij hier de eerste keer komt. Als ik er doorheen step zegt hij bij p2.Name ook dat het een inaccessible value is.

Wat doe ik fout?

[ Voor 3% gewijzigd door Verwijderd op 22-09-2004 11:35 ]


Verwijderd

Comparetext return '0' als ze gelijk zijn, anders een negatieg of positief getal. Dus mischien kun je returnwaarde eerst opslaan in een integer ipv direct aan result door te geven?

lama, je werwacht als result natuurlijk een integer.

Bij je declaratie heb je h1 en h2 staan terwijl bij de implementatie p1 en p2 staan? Lijkt em een typfout, of je hbet toch niet per ongeluk globale variabelen genaamd p1 en p2? :)

[ Voor 48% gewijzigd door Verwijderd op 22-09-2004 11:23 ]


Verwijderd

Topicstarter
ow neej sorry, dat was mijn foutje maarreh dat staat int programma wel gewoon okee!
stukkie uit verkeerde code geknipt / geplakt.
maar hier ligt het niet aan anders zou hij ook wel zeggen dat hij de variabele niet kende.
nogmaals excuus voor deze fout. zal hem wel ff fiksen.

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 20:29

Reptile209

- gers -

Als je door je code heen stept met F8, krijgen p1 en p2 dan inderdaad de waarde die je verwacht? Maw: kloppen de pointers wel die je doorgeeft in de functieaanroep? Je zou een check in de compareNames() kunnen inbouwen die controleert op ongeldige of nulpointers.

[ Voor 31% gewijzigd door Reptile209 op 22-09-2004 11:38 . Reden: Lezen, Reptile209, lezen :) ]

Zo scherp als een voetbal!


Verwijderd

Topicstarter
hmjah het probleem is dat de TList.Sort die functie-aanroep doet en niet ik dus k kan daar ook weinig aan veranderen.
vind het gewoon wazig dat overal staat dat het zo zou moeten werken.

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Waarschijnlijk niet nodig, maar roep de Pack methode 'ns aan voor het sorteren.

Developer Accused Of Unreadable Code Refuses To Comment


Verwijderd

Topicstarter
helaas,
geeft nog steeds dezelfde fout. :(

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22-05 17:17

Knutselsmurf

LED's make things better

Volgens mij gaat het fout bij het casten naat TProduct. Je probeert namelijk een pointer te casten.
Die regels moeten dacht ik zo zijn:
Delphi:
1
p1 := TProduct(Item1^);

Zodat je niet de pointer cast, maar de data waar de pointer naar wijst

- This line is intentionally left blank -


Verwijderd

De proto van de sort-functie is
code:
1
TListSortCompare = function (Item1, Item2: TObject): Integer;

Hierin staat TObject ipv pointer. Erft je TProduct van TObject ?

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 19:25

Delphi32

Heading for the gates of Eden

Welke foutmelding krijg je precies? (ik gok op een AV, maar roept u maar wat het werkelijk is). Hoeveel elementen zitten er in de lijst?
Doe es in die sort-routine:
code:
1
2
3
if Assigned(Item1) and Assigned(Item2) then begin
//jouw implementatie
end;


BTW: een pointer kan prima gecast worden naar TObject (is zelf een pointer)..

[ Voor 14% gewijzigd door Delphi32 op 22-09-2004 12:32 ]


Verwijderd

Topicstarter
het probleem is ook dat die Item2 om een of andere reden niet meekomt. als k die p1 en p2 watch dan ziet hij p1 wel maar p2 zegtie inaccessible value.

heb net de code ff veranderd in:

code:
1
2
3
4
5
6
if Assigned(Item1) and Assigned(Item2) then
begin
   p1 := TProduct(Item1);
   p2 := TProduct(Item2);
   Result := CompareText(p1.Name, p2.Name);
end


maar helaas, nog steeds dezelfde fout. :(

edit:

btw: was een access violation jah
en der zitten 2143 elementen in die list

[ Voor 12% gewijzigd door Verwijderd op 22-09-2004 13:00 ]


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 20:29

Reptile209

- gers -

Het zou volgens mij niet uit mogen maken, maar in de voorbeelden die ik tegenkom, werkt het net even anders:
Delphi:
1
2
3
4
5
6
7
8
9
function CompareNames(item1, item2: pointer): integer;
begin
  // doe dat 
  Result := HetResultaat
end;
...
...
  fproductss.Sort(CompareNames);
...
Zie bijvoorbeeld Merlin's Delphi Forge
Twee verschillen dus:
1) de functie behoort niet tot de lijst-class maar is stand-alone
2) de Sort wordt aangeroepen met de functie en niet met de pointer-naar (@)

Helpt dat iets? Zo ja: waarom? :+

Zo scherp als een voetbal!


  • Icelus
  • Registratie: Januari 2004
  • Niet online
Delphi:
1
2
3
4
function TProductContainer.CompareNames(Item1, Item2: TObject): Integer;
begin
    Result := CompareText((p1 as TProduct).Name, (p2 as TProduct).Name);
end;


Heb je dit al geprobeerd?

Developer Accused Of Unreadable Code Refuses To Comment


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:06

Creepy

Tactical Espionage Splatterer

TProductContainer.CompareNames kan je alleen aanroepen als Comparenames een class method is. En in jou code is deze dat niet.

Standaard moet je het adres meegeven van een functie (en niet van een method). Misschien dat een classmethod gaat werken (ik had geen zin om voor jou te testen) maar een losse procedure er van maken i.p.v. een method (=procedure of functie in een class) gaat je probleem zeer waarschijnlijk oplossen ;)

Edit: en waarom gebruik je een TList i.p.v. bijv. een TObjectList?

[ Voor 64% gewijzigd door Creepy op 22-09-2004 13:24 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Reptile209 -> _/-\o_

als k hem als standalone functie neerzet doettie ut wel. Die @ moet dan idd weg jah, als de funtie in de class zelf staat doettie ut niet zonder @.

maarreh waarom dit nu wel werkt met een standalone functie en niet eentje die in dezelfde class zit?? 8)7

maja, het werkt en daar ben ik al heel blij om!

iig bedankt!

edit:

en dat weten we ook weer dankzij creepy!

[ Voor 9% gewijzigd door Verwijderd op 22-09-2004 13:24 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Omdat beide verschillend aangeroepen worden. Een method (functie uit een class) krijgt altijd Self meegestuurd en die losse niet. Vandaar dat je voor methods altijd 'of object' ziet staan. Die Sort verwacht dus niet een 'of object'.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1