Avatar billede stigc Nybegynder
29. oktober 2002 - 21:42 Der er 3 kommentarer og
2 løsninger

Builder, AddObject med pointer

Jeg har tidligere brugt AddObject til at gemme et ID for hver option i en comboboks.


Det kunne f.eks se sådan her ud:

ComboBox1->Items->AddObject("Første",(TObject*)1);

Senere har jeg fundet ud af, at det er fejlagtig kode, og at det burde løses sådan her:

ComboBox1->Items->AddObject("Første",(TObject*)new int(1));

Så er det jeg overhovedt ikke fatter, hvordan det har kunne virke med den gamle kode! AddObject forventer en TOBJECT pointer som anden argument. Jeg caster godt nok, men jeg caster jo ikke med adresser til en værdi.

Hvordan har det kunne kompile, og hvorfor har det kunne virke?
Avatar billede jpk Nybegynder
30. oktober 2002 - 08:34 #1
Det har kunne compile fordi der ikke er noget forkert ved at assigne en pointer værdien 1... (det er jo bare et tal der angiver en adresse, altså en adresse er ikke nogen specifik type...)

Det har virket hvis du har brugt værdien af pointeren og ikke "det den peger på" i dit program.
Avatar billede jpk Nybegynder
30. oktober 2002 - 08:35 #2
Om så den første løsning er forkert, kan vist diskuteres!
Det mener jeg ikke...
Avatar billede stigc Nybegynder
30. oktober 2002 - 09:11 #3
i mit program brugte jeg f.eks:
ComboBox1->Items->AddObject("Første",(TObject*)-1);

Adressen -1 ?

Jeg fatter så heller ikke at den har kunne retunere -1, når jeg hentede værdien igen!
Avatar billede jpk Nybegynder
30. oktober 2002 - 10:20 #4
Det er jo netop det, der er jo ikke en egentlig adresse-type.
Det er bare en 32bit værdi som du assigner tallet -1 til.
Hvorfor skulle den ikke stadig have værdien -1 når du læser den igen?

Når vi snakker om adresser er det selvfølgelig unaturligt at have negative tal, men selvom det måske er en unsigned int, kan den stadig have samme bitmønster.

Ex:

int nTal1 = -1;
unsigned int adr = nTal1; // bitmønstret kopieres = 4294967295 for en unsigned int

Prøv fx noget lign.:

int nTal1 = -1;
cout << nTal1 << endl;
unsigned int adr = nTal1;
cout << adr << endl;
int nTal2 = adr;
cout << nTal2 << endl;

Vil give et output:

-1
4294967295
-1
Avatar billede soepro Nybegynder
07. november 2002 - 13:53 #5
1) Det har kunnet kompilere fordi værdien 1 er ok for en pointer. (Til et TObject i dette tilfælde.)

2) Det har -formentlig- virket fint, fordi det et dig der anvender pointeren, og du ved jo, at du bare har puttet en int ned i pointeren. Du kan derfor -med held- caste *(int *)ComboBox1->Items->Object;

Mht. til at "pointe" til en rigtig struct (eller class), som mener jeg principielt at det kun er tilrådeligt hvis dit struct (eller class) array ligger til grund for det som er puttet i combo-boxen. Ved at lave new int(n); som ovenfor, oprette du bare en pointer til en nyt element - og mister kontrollen (samt pointeren) til det element i det øjeblik du f.eks. laver ComboBox1->Items->Clear(); Hvis du derfor ikke passer på, ender du med at lave memory leaks - vel at mærke den slags, som operativsystemet ikke kan rydde op i selv ! (Re-boot er eneste løsning under Windows !)
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