|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
|
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. Ringrazio in anticipo chiunque voglia darmi una mano! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Direi che sia un thread da mettere in programmazione...
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Comunque se non allochi le celle puntate da a e b non risolvi niente...
L'avete fatta l'allocazione dinamica con malloc ? |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
|
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. Grazie, comunque! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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...
Codice:
#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);
}
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Ma perchè tutta sta fatica?? Non basta dichiarare la struttura e riferirla con l'operatore "." ? 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 Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
|
Quote:
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! 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 Vabbè, ringrazio ancora cionci e AnonimoVeneziano. Buona Pasqua! Ultima modifica di Fiero : 27-03-2005 alle 00:11. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
|
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! |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
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$
__________________
GPU Compiler Engineer |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Mmm, mi viene un dubbio, a compilare il codice così :
Codice:
#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);
}
__________________
GPU Compiler Engineer |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
|
Quote:
Ho riprovato col mio e non mi funziona |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
|
Quote:
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. Ultima modifica di Fiero : 28-03-2005 alle 21:41. |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
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
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
|
Quote:
Che sciocca dimenticanza... Grazie mille! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:02.


















