Avatar billede rrm Nybegynder
03. december 2005 - 20:17 Der er 23 kommentarer og
2 løsninger

Pointer til vilkårlig data

Hejsa.
Jeg er ved at lave en klasse der skal kunne pege på vilkårlig data, derfor forsøger jeg at bruge pointer typen void* og forsøgt mig med:

struct dlListElem {
  void* elem;
};

bool DLList::addElem(void* elem, dlListPosition insertPos) {

  dlListElem* tmp = new dlListElem();
  tmp->elem = elem;
  tmp->next = NULL;

  first = tmp; 
  last = tmp;

  return false;
}

bool DLList::nextElem(void* elem) {

    dlListElem* cur = first;
 
  if(cur != NULL)
    {
        elem = cur->elem;
        return true;
    }
    else
        return false;
}

og tester den med:

int main() {

    DLList test;
    int t = 8;
    int *r = new int();

    *r = t;
   
    test.addElem(r);

    t = 9;
    *r = t;

    test.addElem(r);

    r = new int(4);
   
    test.nextElem((int*) r);

    cout << "r: " << *r << endl;

    return 0;
}

Udskriften i cout bliver "r: 4", hvilket jeg ikke forstår, er der nogen der se hvad jeg laver galt?
Avatar billede arne_v Ekspert
03. december 2005 - 20:22 #1
int *r

r = new int(4);

cout << "r: " << *r << endl;

skal vel udskrive 4 ??
Avatar billede rrm Nybegynder
03. december 2005 - 20:24 #2
men burde nextElem funktionen ikke overskrive den???
Avatar billede arne_v Ekspert
03. december 2005 - 20:32 #3
nej - du sender en pointer over by value
Avatar billede rrm Nybegynder
03. december 2005 - 20:34 #4
hvordan skal det så laves så jeg kan opdatere pointeren (har forresten også prøvet med  test.nextElem(r);)
Avatar billede arne_v Ekspert
03. december 2005 - 20:37 #5
jeg tror ikke at jeg forstår din kode

men prøv

bool DLList::nextElem(void* &elem) {
Avatar billede rrm Nybegynder
03. december 2005 - 20:47 #6
betyder det så at man giver en funktionen en addresse til en pointer???

men det ser ud til at virke, nu modtager jeg værdien 9 i stedet for 4.
Avatar billede arne_v Ekspert
03. december 2005 - 21:02 #7
du sender en pointer over by reference

du kunne også have brugt ** og så kaldt med &
Avatar billede rrm Nybegynder
03. december 2005 - 21:15 #8
ok tak... Men hvad synes du om opbygningen, vil du foreslå en anden måde??? Jeg skal bruge klassen til et double-linked-list, der skal kunne indeholde vilkårlige data.
Avatar billede arne_v Ekspert
03. december 2005 - 21:20 #9
struct med void* og to pointere til sin egen type er naturligvis løsningen

jeg antager at det er for at lære noget - ellers har STL jo det du skal bruge
Avatar billede rrm Nybegynder
03. december 2005 - 21:43 #10
tja, det skal bruges til et større program, så kan jo genoverveje om der skal bruges STL istedet.
Avatar billede driis Nybegynder
03. december 2005 - 21:58 #11
I stedet for at have en void pointer, kunne du lave en template-klasse i stedet. Så slipper du for at skulle caste pointeren når du henter data ud af listen.
Avatar billede arne_v Ekspert
03. december 2005 - 22:01 #12
forudsat at det altid er samme type
Avatar billede rrm Nybegynder
03. december 2005 - 22:17 #13
det er det desværre ikke. Vi skal mange forskellige lister i programmet, der skal indeholde forskellige data.
Avatar billede driis Nybegynder
03. december 2005 - 22:25 #14
Men er det samme datatype, der skal i én instans af klassen ? I så fald kan du lave det templatiseret. Men ellers er void* fremgangsmåden også udmærket.
Avatar billede rrm Nybegynder
04. december 2005 - 17:41 #15
ok, takker for hjælpen. Et en lille spm. Hvordan sletter man bedst det en void pointer peger på, hvis den skal kunne pege på vilkårlig data??? (void* fisk; delete fisk eller delete[] fisk)
Avatar billede arne_v Ekspert
04. december 2005 - 17:47 #16
ved delete mener jeg at du er nødt til at vide hvilken type det er
Avatar billede driis Nybegynder
04. december 2005 - 18:02 #17
Hmm, jeg mener nu at det udelukkende er adressen, heapen bruger til at holde styr på hvor meget der er allokeret - så delete skulle virke, blot du bruger den rigtige pointer.

Det er muligt det er forkert, det er også muligt at det er systemspecifikt. Men i hvert fald virker følgende:

int main()
{
    void * vp = (void*)new char[100];
    printf("VP is: %08X",(unsigned long)vp);
    delete vp;
}
Avatar billede arne_v Ekspert
04. december 2005 - 18:08 #18
den skal vel ikke kun deallokere memory men også kalde en destructor
Avatar billede rrm Nybegynder
04. december 2005 - 18:13 #19
grunden til at jeg skal bruge det hvis jeg vil opdatere et element i listen, men kan jeg godt ændre funktionen så funktionen returnere en pointer til data og så må kalderen sørge for at slette strukturen
Avatar billede driis Nybegynder
04. december 2005 - 18:18 #20
arne > Du har ret, destructoren bliver ikke kaldt hvis man kalder delete på en void pointer; det havde jeg ikke lige tænkt over.
Avatar billede driis Nybegynder
04. december 2005 - 18:19 #21
rrm > Så svaret må være at du er nødt til at kende typen i listen, hvis typen har en destructor.
Avatar billede rrm Nybegynder
05. december 2005 - 21:33 #22
ok. Tak for svarene begge to. Vi valgte at bruge STL-list som løsning, men læg et svar så i kan noget for arbejdet... :)
Avatar billede arne_v Ekspert
05. december 2005 - 21:45 #23
svar
Avatar billede driis Nybegynder
05. december 2005 - 22:00 #24
svar
Avatar billede rrm Nybegynder
05. december 2005 - 23:30 #25
tak for hjælpen
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