View Full Version : Linguaggio C: uso struct e puntatori. Dove sbaglio?
Ciao! :)
Sto preparando l'esame di Fondamenti di informatica.
In particolare le strutture. Finchè non uso puntatori va tutto bene. I problemi nascono quando uso i puntatori.
Il programmino che voglio fare come prova è molto semplice: nella struttuta voglio inserire i nomi di due giocatori (max 29 caratteri) e, successivamente volgio stamparli a video.
Copio incollo ciò che ho scritto:
#include <stdio.h>
struct punteggio
{
char nome[30];
};
struct punteggio *a,*b;
main()
{
printf("\nInserisci il nome del primo giocatore");
scanf("%s", &a->nome);
printf("\nInserisci il nome del secondo giocatore");
scanf("%s", &b->nome);
printf("\nIl primo giocatore è: %s", (*a).nome);
printf("\nIl secondo giocatore è: %s", (*b).nome);
}
A questo punto mi stampa a video:
Il primo giocatore è: (null)
Il secondo giocatore è: (null)
Il fatto è che il debugger non mi segnala nulla ed io le ho provate tutte ma non riesco a capire perchè non riesca a scrivere i due nomi nella struttura. :confused:
Ringrazio in anticipo chiunque voglia darmi una mano! :)
Direi che sia un thread da mettere in programmazione...
Comunque se non allochi le celle puntate da a e b non risolvi niente...
L'avete fatta l'allocazione dinamica con malloc ?
Quindi dici che dovrei usare un malloc?
Ci ho pensato ma ne l'eserciziario ne gli appunti in rete della mia prof citano nulla a tal proposito.
La malloc con le struct viene poi fuori con le liste.
Boh, non so. :confused:
Grazie, comunque! :)
Ci sono due modi per fare quell'esercizio o allochi due strutture staticametne e le fai puntare da a e b o allochi le due strutturre diamicamente con malloc...
#include <stdio.h>
struct punteggio
{
char nome[30];
};
struct punteggio *a,*b, c, d;
main()
{
a = &c;
b = &d;
printf("\nInserisci il nome del primo giocatore");
scanf("%s", a->nome);
printf("\nInserisci il nome del secondo giocatore");
scanf("%s", b->nome);
printf("\nIl primo giocatore è: %s", a->nome);
printf("\nIl secondo giocatore è: %s", b->nome);
}
Non serve il dereference (&) nella scanf sulle stringhe...un'identificare di stringa è già un puntatore...
AnonimoVeneziano
26-03-2005, 22:14
Originariamente inviato da cionci
Ci sono due modi per fare quell'esercizio o allochi due strutture staticametne e le fai puntare da a e b o allochi le due strutturre diamicamente con malloc...
#include <stdio.h>
struct punteggio
{
char nome[30];
};
struct punteggio *a,*b, c, d;
main()
{
a = &c;
b = &d;
printf("\nInserisci il nome del primo giocatore");
scanf("%s", a->nome);
printf("\nInserisci il nome del secondo giocatore");
scanf("%s", b->nome);
printf("\nIl primo giocatore è: %s", a->nome);
printf("\nIl secondo giocatore è: %s", b->nome);
}
Non serve il dereference (&) nella scanf sulle stringhe...un'identificare di stringa è già un puntatore...
Ma perchè tutta sta fatica?? :D
Non basta dichiarare la struttura e riferirla con l'operatore "." ? :D
Perchè tutto sto casino con i puntatori che in questo caso sono inutili?
Usare i puntatori a struttura senza conoscere malloc() IMHO non ha senso :D
Ciao
Originariamente inviato da AnonimoVeneziano
Ma perchè tutta sta fatica?? :D
Non basta dichiarare la struttura e riferirla con l'operatore "." ? :D
Perchè tutto sto casino con i puntatori che in questo caso sono inutili?
Usare i puntatori a struttura senza conoscere malloc() IMHO non ha senso :D
Ciao
Hai perfettamente ragione, il fatto è che volevo cominciare ad impratichirmi con le struct ed i puntatori. Esercizi senza puntatori ne ho già fatti e li ho capiti.
Alla malloc ho pensato anch'io più volte ma poichè non è mai citata dalla prof in questa parte di programma volevo semplicemente capire la sintassi di strutture con soli puntatori ;)
Grazie mille a tutti, ora funziona! :D
Avevo già provato a creare altre variabili e farle puntare da a e b ma non girava comunque. Probabilmente sbagliavo qualcosa nella sintassi.
Il prossimo passo sarà provare a passare strutture a funzioni per ricevere in ritorno prima interi e poi altre strutture. E poi comincerò a fare esercizi sulle liste... (Ed anche qui prevedo mi servirà il vostro aiuto :D :p).
Vabbè, ringrazio ancora cionci e AnonimoVeneziano.
Buona Pasqua! :D
Originariamente inviato da AnonimoVeneziano
Ma perchè tutta sta fatica?? :D
Per fare un esercizio sui puntatori :)
CVD ho dei problemi quando dopo aver passato delle strutture voglio che la funzione mi restituisca un'altra struttura :(.
Se chiedo di restituire un intero non ho problemi, ma se chiedo una struttura mi crasha.
L'esercizietto di prova è molto semplice: una volta inseriti nelle due strutture di tipo 'punteggio' il nome ed un numero le passo alla funzione.
Nella funzione viene creata una struttura di tipo 'ritorno_funzione' di nome h che contiene semplicemente un intero.
Una volta ritornato h ad m eseguo un semplice controllo su numero2.
Riporto il codice che ho scritto:
#include <stdio.h>
struct punteggio
{
char nome[30];
int numero;
};
struct ritorno_funzione
{int numero2;
} ;
struct ritorno_funzione m;
struct punteggio c, d;
main()
{
printf("\nInserisci il nome del primo giocatore");
scanf("%s", c.nome);
printf("\nInserisci il nome del secondo giocatore");
scanf("%s", d.nome);
printf("\nInserisci il numero del primo giocatore");
scanf("%d", &c.numero);
printf("\nInserisci il numero del secondo giocatore");
scanf("%d", &d.numero);
m=risultato(c,d);
printf("\nIl numero di controllo vale: %d ", m.numero2);
}
struct ritorno_funzione risultato(struct punteggio e, struct punteggio f)
{
struct ritorno_funzione h;
if (e.numero>f.numero)
{h.numero2=1;
}
else
{h.numero2=0;
};
return(h);
}
L'errore me lo dà all'altezza della chiamata della funzione:
[b]m=risultato(c,d);[\b]
Dicendomi:operands of = have illegal types 'struct ritorno_funzione' and 'int'.
In pratica mi riconosce correttamente che m è una struttura del tipo 'ritorno_funzione' ma non so perchè assegna alla funzione 'risultato' un'uscita di tipo int.
Ho provato un bel po' di combinazioni ma non c'è nulla da fare. Evidentemente c'è qualcosa che mi sfugge.
Ringrazio ancora chiunque volesse aiutarmi! :)
AnonimoVeneziano
28-03-2005, 20:30
A me funziona :
melchior@melchior:~/Cprograms$ ./prog
Inserisci il nome del primo giocatore Io
Inserisci il nome del secondo giocatore Tu
Inserisci il numero del primo giocatore 2
Inserisci il numero del secondo giocatore 3
Il numero di controllo vale: 0
melchior@melchior:~/Cprograms$
Inserisci il nome del primo giocatore Io
Inserisci il nome del secondo giocatore Tu
Inserisci il numero del primo giocatore 3
Inserisci il numero del secondo giocatore 2
Il numero di controllo vale: 1
melchior@melchior:~/Cprograms$
AnonimoVeneziano
28-03-2005, 20:31
Mmm, mi viene un dubbio, a compilare il codice così :
#include <stdio.h>
struct punteggio
{
char nome[30];
int numero;
};
struct ritorno_funzione
{int numero2;
} ;
struct ritorno_funzione m;
struct punteggio c, d;
struct ritorno_funzione risultato(struct punteggio e, struct punteggio f)
{
struct ritorno_funzione h;
if (e.numero>f.numero)
{h.numero2=1;
}
else
{h.numero2=0;
};
return(h);
}
main()
{
printf("\nInserisci il nome del primo giocatore");
scanf("%s", c.nome);
printf("\nInserisci il nome del secondo giocatore");
scanf("%s", d.nome);
printf("\nInserisci il numero del primo giocatore");
scanf("%d", &c.numero);
printf("\nInserisci il numero del secondo giocatore");
scanf("%d", &d.numero);
m=risultato(c,d);
printf("\nIl numero di controllo vale: %d ", m.numero2);
}
Originariamente inviato da AnonimoVeneziano
A me funziona :
melchior@melchior:~/Cprograms$ ./prog
Inserisci il nome del primo giocatore Io
Inserisci il nome del secondo giocatore Tu
Inserisci il numero del primo giocatore 2
Inserisci il numero del secondo giocatore 3
Il numero di controllo vale: 0
melchior@melchior:~/Cprograms$
Inserisci il nome del primo giocatore Io
Inserisci il nome del secondo giocatore Tu
Inserisci il numero del primo giocatore 3
Inserisci il numero del secondo giocatore 2
Il numero di controllo vale: 1
melchior@melchior:~/Cprograms$
Ma porca miseria :(
Ho riprovato col mio e non mi funziona :(
Originariamente inviato da AnonimoVeneziano
Mmm, mi viene un dubbio, a compilare il codice così :
#include <stdio.h>
struct punteggio
{
char nome[30];
int numero;
};
struct ritorno_funzione
{int numero2;
} ;
struct ritorno_funzione m;
struct punteggio c, d;
struct ritorno_funzione risultato(struct punteggio e, struct punteggio f)
{
struct ritorno_funzione h;
if (e.numero>f.numero)
{h.numero2=1;
}
else
{h.numero2=0;
};
return(h);
}
main()
{
printf("\nInserisci il nome del primo giocatore");
scanf("%s", c.nome);
printf("\nInserisci il nome del secondo giocatore");
scanf("%s", d.nome);
printf("\nInserisci il numero del primo giocatore");
scanf("%d", &c.numero);
printf("\nInserisci il numero del secondo giocatore");
scanf("%d", &d.numero);
m=risultato(c,d);
printf("\nIl numero di controllo vale: %d ", m.numero2);
}
Eccolo! Questo funziona! :D
Ma quindi se voglio in uscita una struct le funzioni devono essere messe prima del main()?
Penso di no perchè in teoria le funzioni si possono inserire in qualunque punto del programma... Boh, non capisco. :confused:
AnonimoVeneziano
28-03-2005, 22:00
Originariamente inviato da Fiero
Eccolo! Questo funziona! :D
Ma quindi se voglio in uscita una struct le funzioni devono essere messe prima del main()?
Penso di no perchè in teoria le funzioni si possono inserire in qualunque punto del programma... Boh, non capisco. :confused:
La dichiarazione della funzione deve essere fatta prima di usarla .
Se la metti dopo all' inizio del listato di codice ci devi mettere almeno il prototipo della funzione
Ciao
Originariamente inviato da AnonimoVeneziano
La dichiarazione della funzione deve essere fatta prima di usarla .
Se la metti dopo all' inizio del listato di codice ci devi mettere almeno il prototipo della funzione
Ciao
Aaah, ok!
Che sciocca dimenticanza... :mc:
Grazie mille! ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.