PDA

Visualizza la versione completa : [C] Funzione che restituisce una struttura


toni00c
22-01-2011, 20:15
ciao ho un problema che devo risolvere ; sto studiando una funzione che restituisce una struttura ;

ho scritto il codice




#include <stdio.h>
#include <stdlib.h>



typedef struct {
int b ;
int d ;
} punto ;

struct punto ins ( int n , int m ) ;

int main ()

{
punto punto ;
int g = 10 ;
int e = 20 ;

ins (g , e ) ;
printf ( "%d%d" , ins (g , e ) ) ;

system ("PAUSE") ;
return 0 ;
}


struct punto ins ( int n , int m )
{
punto.b = n ;
punto.d = m ;
return punto ;
}





il codice mi da diversi errori , ma il principale che la funzione "ins" non restituisce nulla?
perch?

grazie

GliderKite
22-01-2011, 20:21
Quanti errori... vediamo se riusciamo a venirne fuori.
Nella funzione ins... cosa rappresenta punto.b o punto.d?

Celebron
22-01-2011, 20:26
ci vedo un p di errori




#include <stdio.h>
#include <stdlib.h>



typedef struct p {
int b ;
int d ;
} punto ;


corretto, l'uso typedf struct <nomestruct>{ <dati>} <nometipo>;



punto ins ( int n , int m ) ;

corretto, punto un tipo ora, non devi specificare struct prima (anche perch non ha senso)




int main ()

{
punto punto1 ; //<--- non puoi usare stesso nome per un tipo e una variabile
int g = 10 ;
int e = 20 ;

punto1 = ins (g , e ) ; //<--- mancava l'assegnazione ._.
// printf ( "%d%d" , ins (g , e ) ) ; //<-- questo non ha senso
printf("%d%d", punto1.b, punto1.d);

system ("PAUSE") ;
return 0 ;
}


punto ins ( int n , int m ) //<-- il tipo di ritorno punto, struct punto non ha senso
{

/* NO! cos' punto!? un tipo, quindi devi definire una variabile relativa a quel tipo
punto.b = n ;
punto.d = m ;
*/

punto punto1;
punto1.b = n ;
punto1.d = m ;
return punto1;
}




a mio parere stai facendo molta molta molta confusione tra struct, tipi, ritorni e uso della printf

YuYevon
22-01-2011, 20:26
Non fare confusione: il tuo tipo strutturato "punto", non "struct punto" o altro (questo perch hai utilizzato la typedef); tanto per cominciare quindi la tua funzione dovrebbe avere "punto" come tipo del valore di ritorno, e non "struct punto". Poi, in main() non puoi dichiarare una struttura con nome "punto" in quanto questa parola gi utilizzata per definire il tipo della struttura... sarebbe come definire una variabile di tipo int con nome proprio "int"... inoltre, all'interno della funzione devi dichiarare una struttura locale (ad esempio, "punto1") ed utilizzare quella per le assegnazioni, senza contare poi che non puoi utilizzare la printf() in quel modo dato che la funzione ins() ti restituisce una struttura "punto" e non due interi (non potrebbe nemmeno, pur volendo).

toni00c
22-01-2011, 21:13
Originariamente inviato da Celebron
ci vedo un p di errori




#include <stdio.h>
#include <stdlib.h>



typedef struct p {
int b ;
int d ;
} punto ;


corretto, l'uso typedf struct <nomestruct>{ <dati>} <nometipo>;



in un compito d'esame c'era la dichiarazione



typedef struct {
char nome [11] ;
int resi ;
} oggetto ;


dunque usare la typedef in questo modo sbagliato?








int main ()

{
punto punto1 ; //<--- non puoi usare stesso nome per un tipo e una variabile
int g = 10 ;
int e = 20 ;

punto1 = ins (g , e ) ; //<--- mancava l'assegnazione ._.
// printf ( "%d%d" , ins (g , e ) ) ; //<-- questo non ha senso
printf("%d%d", punto1.b, punto1.d);

system ("PAUSE") ;
return 0 ;
}


punto ins ( int n , int m ) //<-- il tipo di ritorno punto, struct punto non ha senso
{

/* NO! cos' punto!? un tipo, quindi devi definire una variabile relativa a quel tipo
punto.b = n ;
punto.d = m ;
*/

punto punto1;
punto1.b = n ;
punto1.d = m ;
return punto1;
}




a mio parere stai facendo molta molta molta confusione tra struct, tipi, ritorni e uso della printf


grazie in effetti un po si ;
adesso ho chiarito meglio questi concetti , grazie!

YuYevon
22-01-2011, 21:25
Originariamente inviato da toni00c
dunque usare la typedef in questo modo sbagliato?


No, ma se usi la typedef in quel modo la struct rimane anonima e l'unico tipo di dato quello che specifichi con la typedef. Per intenderci, se scrivi



typedef struct {
char nome [11] ;
int resi ;
} oggetto ;



l'unico modo che hai per riferirti a quel tipo struttura attaverso "oggetto", questo perch in pratica stai dichiarando un tipo strutturato anonimo (in quanto dopo la keyword "struct" non c' alcun nome ma direttamente la sua definizione) per poi ridefinirlo utilizzando la typedef. Se invece avessi scritto una cosa come



typedef struct _oggetto {
char nome [11];
int resi ;
} oggetto;


allora avresti potuto riferiti al tipo strutturato sia con "struct _oggetto" che con "oggetto", in quanto in questo caso si definisce non solo il tipo "oggetto" con la typedef ma anche il tipo "struct _oggetto", dato che stato assegnato un nome alla struct.

Loading