PDA

View Full Version : Dubbio di C...


marcus81
08-02-2002, 23:02
Dunque ho trovato in un esercizio una funzione dichiarata in questo modo:
int leggifile(char *nomefile, Tree **root)...
non riesco a capire come mai mette i due asterischi...non dovrebbe usarne solo uno?ha qualke particolare funzionalità??

Poi volevo chiedervi:
ma nel return come espressione si può utilizzare anke una funzione?? x esempio return leggi(......)???e in questo caso a che servirebbe??

Grazie mille!;)

cionci
09-02-2002, 00:11
Sì...quello che segue il return è una normale espressione e può contenere qualsisi chiamata a funzione...

Per il doppio * sincramente non capisco...
Con doppio asterisco puoi passare un vettore di puntatori, ma non mi sembra questo il caso...

/\/\@®¢Ø
09-02-2002, 01:16
Probabilmente il doppio puntatore server per poter usare l'argomento per ritornare un puntatore alla radice dell'albero creato.
Forse se mostro come viene usato si vede meglio:

Tree* root; // qui root contiene pattume
int err = leggifile( "file.dat" , &root );
// ora root contiene un puntatore all'albero

Avendo passato un puntatore a root questo puo' essere modificato dalla funzione con un "valore di ritorno".
Il fatto che si usi in questo modo invece che con una dichiarazione del tipo
int leggifile( char* , Tree* )
( e quindi venga usata dopo cosi':
Tree root;
int err = leggifile( "file.dat" , &root );
)
sta nel fatto che per strutture pesanti di solito di manipolano tramite puntatori.

cionci
09-02-2002, 01:19
Giusto...non ci avevo pensato perchè io lo passerei per riferimento quel parametro...

marcus81
09-02-2002, 08:52
Ragazzi: scusatemi ma ci ho capito poco....nello stesso esercizio la chiamata di funzione è:

x=leggifile(nomefile, &root)

...quindi è una chiamata normale...intanto il programma funziona perfettamente...

poi ce n'è un'altra pure:

int insert(TREE **, int) e la chiamata è

x=insert(&root, dato).... non riesco a capire....:confused:

cionci
09-02-2002, 11:03
Ti faccio un esempio...

Tree *root;
...
...
...
spostaSx(&root);
...
...
...


int spostaSx(Tree **t)
{
//questo è solo un codice di esempio
if((*t)->sx)
{
(*t) = (*t)->sx;
return 1;
}
return 0;
}

Dentro la funzione t è un puntatore ad un puntatore ad una istanza di tipo Tree...

Quindi all'interno della funzione *t è il puntatore ad una istanza di tipo Tree...

(*t)->dato, (*t)->sx, (*t)->dx sono i membri del Tree puntato

oppure

(*(*t)).dato, (*(*t)).sx, (*(*t)).dx

Viene passato in questo modo per ritornare al chiamante l'eventuale cambiamento della posizione puntata da root...

-=Krynn=-
11-02-2002, 21:12
il mio prof all'uni c'ha insegnato a programmare coi doppi puntatori, quindi io lo trovo del tutto normale.
In quel modo è anche + pericoloso, perchè col doppio puntatore ti puoi modificare la variabile senza che te ne avevi voglia...

/\/\@®¢Ø
11-02-2002, 22:10
Originariamente inviato da cionci
[B]Giusto...non ci avevo pensato perchè io lo passerei per riferimento quel parametro...
Penso pero' che i riferimenti siano prerogativa del C++, non del C ( non ne sono pero' sicuro ! ).

cionci
12-02-2002, 07:42
Originariamente inviato da /\/\@®¢Ø
[B]
Penso pero' che i riferimenti siano prerogativa del C++, non del C ( non ne sono pero' sicuro ! ).
Mh, non lo so nemmeno io...