Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - errore ricorsione puntatori??
Forum - C/C++ - errore ricorsione puntatori??

Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 19:05
Venerdì, 18/09/2009
ciao a tutti!
ho un problema con un programma, ho una alcune strutture di dati e devo richiamarle ricorsivamente:

Codice sorgente - presumibilmente C#

  1. struct JOINT
  2. {
  3.         float lenght;
  4.         float in,rot;
  5.         float in_iniz,rot_iniz;
  6.         float in_tot,rot_tot;
  7.         float x,y,z;
  8.         char name[20];
  9.         JOINT *prev;   //questo è il puntatore che punta al joint di provenienza quando faccio la ricorsione
  10.         JOINT *dip[5]; //queste sono le 5 possibili dipendenze, le sfoglio con la ricorsione..
  11. };



questa è la funzione che uso per richiamarle:

Codice sorgente - presumibilmente C++

  1. int print(JOINT node) {
  2.     JOINT temp; //temporary joint
  3.  
  4. //PENSO IL PROBLEMA SIA QUI!!
  5.         if (node.prev!=NULL) {
  6.                 temp=*node.prev;       
  7.         } else {
  8.         temp=empty;
  9.     }
  10.    
  11. //parte di elaborazione, non centra con problema che ho...
  12.     node.in_tot  =  temp.in_tot + node.in_iniz + node.in;
  13.     node.rot_tot =  temp.rot_tot + node.rot_iniz + node.rot;
  14.     node.x = temp.x+node.lenght*cos(node.in_tot*gr)*cos(node.rot_tot*gr);
  15.     node.y = temp.y+node.lenght*sin(node.in_tot*gr);
  16.     node.z = temp.z+node.lenght*cos(node.in_tot*gr)*sin(node.rot_tot*gr);
  17. //--------------
  18.  
  19.          char str[20];
  20.          sprintf(str,"\t(%f,%f,%f)=>(%f,%f,%f)\n",node.x,node.y,node.z,temp.x,temp.y,temp.z);
  21.          fputs(str,debug);
  22.  
  23.  
  24.         for (int i=0;i<5;i++)
  25.         {if (node.dip[i]!=NULL)
  26.                 {
  27.                         print(*node.dip[i]);}
  28.         else
  29.                 {return TRUE;}
  30.         }
  31.                
  32. }



che in pratica richiamo così: print(root), root è la struttura JOINT dalla quale voglio partire a stampare i dati...
il JOINT empty lo tengo vuoto perchè mi serve come base..
detto questo, io ho una serie di joint legati tra loro tramite i puntatori *dip[5] e *prev inseriti nella struttura joint, ad esempio se ho JOINT root che ha come prima dipendenza JOINT children1, viene elaborato prima root e poi la funzione viene richiamata con argomento children1.
il problema è che quando elaboro children1, non riesco ad accedere ai campi di root(che è legato a children1 perchè children1.prev=&root; )...

mi dareste una mano a capire dove sbaglio??
grazie mille!!

Ultima modifica effettuata da John il 18/09/2009 alle 19:06


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 19:36
Venerdì, 18/09/2009
Ma perche' non lavori con i puntatori?


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 21:29
Venerdì, 18/09/2009
mi sembrava fossero puntatori... e quella funzione, richiamando uno ad uno i figli di uno snodo, era l'ideale per il lavoro che voglio fare.... suggerimenti in alternativa?


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 16:13
Sabato, 19/09/2009
gente in teoria questa è una lista, no? e allora perchè non riesco ad accedere ai suoi campi
?? perchè faccio elemento.campo al posto di elemento->campo??


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 21:01
Sabato, 19/09/2009
Testo quotato

questa è la funzione che uso per richiamarle:


Se hai studiato i puntatori, i parametri che devi passare, non le devi passare per valore ma per riferimento. Ecco perchè non riesci a usare ciò che hai scritto nel post precedente.


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 19:56
Lunedì, 21/09/2009
già già... ho avuto l'illuminazione sabato sera fuori con gli amici!! :D adesso l'ho modificata in questo modo:

Codice sorgente - presumibilmente C++

  1. int print(JOINT node,JOINT temp) {
  2.    
  3.     node.in_tot  =  temp.in_tot + node.in_iniz + node.in;
  4.     node.rot_tot =  temp.rot_tot + node.rot_iniz + node.rot;
  5.     node.x = temp.x+node.lenght*cos(node.in_tot*gr)*cos(node.rot_tot*gr);
  6.     node.y = temp.y+node.lenght*sin(node.in_tot*gr);
  7.     node.z = temp.z+node.lenght*cos(node.in_tot*gr)*sin(node.rot_tot*gr);
  8.  
  9.      char str[20];
  10.      sprintf(str,"\t(%f,%f,%f)=>(%f,%f,%f)\n",node.x,node.y,node.z,temp.x,temp.y,temp.z);
  11.      fputs(str,debug);
  12.  
  13.     for (int i=0;i<5;i++)
  14.     {if (node.dip[i]!=NULL)
  15.         {
  16.             print(*node.dip[i],node);}
  17.     else
  18.         {return true;}
  19.     }
  20. }



That's all Folks!  
Grazie a tutti delle risposte!! ;)


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
PM Quote