Newsgroup: it.comp.lang.c
Titolo: [studente] I soliti puntatori

Ciao a tutti,
mi sono ritrovato a scrivere queste "eresie":
void caricadati(nodoabrstud *abrstud)
{	
	...codice...
	leggi il valore di "studente" da file...
	abrstud = inserisci(abrstud, studente);
	...codice...
	...codice...
 
	return;
}
int main(void)
{
	nodoabrstud *studenti;
	caricadati(&studenti);
	.
	.
	.
	return 0;
}
definizione del tipo "nodoabrstud":
typedef struct abrstud{
   tipodatostud val;
   struct abrstud *left;
   struct abrstud *right;
} nodoabrstud;
definizione del tipo "tipodatostud":
typedef struct studente{
	char *nome;
	char *matricola;
} tipodatostud;
Trascrivo anche la funzione "inserisci":
nodoabrstud *inserisci (nodoabrstud *rp, tipodatostud d1)
{
	nodoabrstud *p;
   	// Albero vuoto: trovata posizione
   	if (rp == NULL) {
     		p = nuovoabr();
     		p->val = d1;
	    	p->left = p->right = NULL;
		p->puntpres = NULL;
     		return p;
   	}
 
	if (datostud_uguali (d1, rp->val))
    	{
		// gia' presente: non replica
     		return rp;
	}
	if (datostud_precede (d1, rp->val))
	{
     		// Inserimento a sinistra
		rp->left = inserisci (rp->left, d1);
	}
   	else
	{
     		// Inserimento a destra
     		rp->right = inserisci (rp->right, d1);
	}
   return rp;
}
Secondo voi perché il compilatore dà il seguente errore?
error C2664: 'caricadati' : cannot convert parameter 2 from 'struct 
abrstud ** ' to 'struct abrstud *'
         Types pointed to are unrelated; conversion requires 
reinterpret_cast, C-style cast or function-style cast
Altri utili consigli?
Ringrazio infinitamente!
-- 
Davide

 abrstud ** ' to 'struct abrstud *'
L'operatore "&" trasforma un'espressione di tipo "T" in "puntatore a
Vattelapesca" (dove per "T" intendo un tipo qualsiasi).
Tu hai dichiarato la variabile "studenti" col tipo "puntatore a
nodoabrstud": se gli applichi l'operatore "&" l'espressione risultante
sarà dunque di tipo "puntatore a puntatore a nodoabrstud".
Ma il parametro "abrstud" della funzione "caricadati()" dev'essere di tipo
"puntatore a nodoabrstud", non "puntatore a puntatore a nodoabrstud".
Ergo, o togli "*" dalla dichiarazione di "studenti", o tolgli "&" dalla
chiamata a "caricadati()".
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Vattelapesca" (dove per "T" intendo un tipo qualsiasi).
Sייי, bonanotte... Correggo:
L'operatore "&" trasforma un'espressione di tipo "T" in "puntatore a T"
(dove per "T" intendo un tipo qualsiasi).
--


 chiamata a "caricadati()".
Ciao e grazie per la risposta!
Ho capito cosa intendi, ma togliendo "*" dalla dichiarazione di 
"studenti" mi dà un "access violation" in esecuzione:
int main(void)
{
     nodoabrstud studenti;
     caricadati(&studenti);
     .
     .
     .
     return 0;
}
mentre togliendo la "&" e quindi modificando caricadati() ho una serie 
di errori in compilazione dovuti al fatto che tutte le funzioni che 
gestiscono sto albero di tipo nodoabrstud lavorano appunto su puntatori 
a nodoabrstud:
nodoabrstud *crea_albero_vuoto (void);
nodoabrstud *inserisci (nodoabrstud *rp, tipodatostud d1);
nodoabrstud *cancella (nodoabrstud *rp, tipodatostud d1);
nodoabrstud *nuovoabr (void);
void stampa_albero (FILE *fp, nodoabrstud *rp);
nodoabrstud *cercaabrstud (nodoabrstud *rp, tipodatostud d1);
Il problema principale è riuscire a trasferire le modifiche effettuate 
da caricadati() nel main(). Non esistono altre strade?
-- 
Davide

 	abrstud = inserisci(abrstud, studente);
*abrstud = inserisci(*abrstud, studente);


 di errori in compilazione [...]
A parte gli errori in compilazione, che al momento non m'interessano,
questa non è proprio la strada giusta.
Se tu passi la struttura stessa, anziché un puntatore a struttura, il
compilatore passa alla funzione un COPIA della tua struttura, quindi le
modifiche fatte si perdono quando esci dalla funzione.


Cingar ha scritto:

Grazie mille per le dritte, ho risolto!!
-- 
Davide