Avatar billede hermandsen Juniormester
23. oktober 2002 - 13:08 Der er 7 kommentarer og
1 løsning

Pointer til post i dyn-array ændrer sig ved forøgelse af array

Hej Eksperter!

Jeg har et dynamisk array af klasser, for at holde styr på disse klasser smider jeg en pointer til de enkelte poster i arrayet ind i et TListView.Items.Item[Index].Data, altså en TListItem.Data (pointer).

Det fungerer kun ved den sidst indlæste af array'et. Hvis jeg forøger array'ets størrelse med en og smider endnu en post ind i det, så ændrer pointeren sig fra "array[ANDEN_SIDSTE]" til noget anden end det den var før...

Er der nogle problemer omkring et dynamisk array og pointere til de enkelte poster når jeg forøger størrelsen på dette array, eller er det bare mig der ikke kan kode? Jeg har debugget en del tid med det nu, men pointeren ser ud til at ændre sig som vinden blæser når det ikke er sidste post der peges på...

//hermandsen
Avatar billede pellelil Nybegynder
23. oktober 2002 - 13:14 #1
Det der sker (så vidt jeg husker) når man forøger størrelsen på et dynamisk array er at den allokere plads til hele det nye array, flytter data fra det gamle, for slutteligt at dispose det gamle. Det er derfor "en skidt ide" at bruge adressen på disse elementer. Brug i stedet elementets nummer.
Avatar billede hermandsen Juniormester
23. oktober 2002 - 13:42 #2
Hmm... Det var faktisk en god ide... Hvordan gør jeg så det nemmest? Det duer jo ikke rigtig med et nyt array of ^Integer...

Jeg tror jeg har kørt for længe på det her projekt til at komme med nye ideer... :/

Kan jeg evt. typecaste fra pointer til integer altså:

Integer(TListItem.Data) og omvendt, eller er der en bedre måde?
Avatar billede pellelil Nybegynder
23. oktober 2002 - 13:49 #3
Jeg har aldrig være tilhænger af DynArray og ville (hvis det var mig) havde brugt en TObjectList eller TStringList alt efter hvad jeg havde brug for med denne.
Avatar billede pellelil Nybegynder
23. oktober 2002 - 13:51 #4
De (TObjectList/TStringList) har forøvrigt samme "problem" med at du ikke kan have en pointer til deres elementer, men i stedet skal bruge elementets nummer. Denne fremgangsmåde virker kun hvis der ikke indsættes/slette elementer "midt i listen" og hvis listen ikke er sorteret (elementerne vil "skifte plads" når man indsætter nye).
Avatar billede hermandsen Juniormester
23. oktober 2002 - 13:53 #5
Hehe... Jaaah, det er netop der mit problem ligger... Jeg havde nemlig overvejet bare at bruge TListItem's Index-property som index i mit DynArray, men problemet kommer så når der sorteres i ListView'et eller slettes fra det... :)
Avatar billede hermandsen Juniormester
23. oktober 2002 - 15:46 #6
Har du et alternativ til Data-property'en under TListItem, så det i stedet er en Integer... Noget i retning af den Tag-property der findes til TComponent...
Avatar billede hermandsen Juniormester
24. oktober 2002 - 22:21 #7
Nå, det virker at bruge tal i stedet for pointere... Jeg har godt nok snydt lidt og typekonverterer fra Pointer til Integer, men det virker da... :)

Så vidt jeg husker er de også begge 4-bytes variabler, så problemet er vel ikke større end jeg gør det til...

Tak for hjælpen, pointene er dine! :)
Avatar billede pellelil Nybegynder
25. oktober 2002 - 08:38 #8
Du husker helt korrekt, du kan nemt "Type-konvertere mellem" Integer og Pointer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester