Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70 Fusion FIFA World Cup 26 Edition: un ottimo smartphone per i fan del calcio
Motorola edge 70 Fusion FIFA World Cup 26 Edition: un ottimo smartphone per i fan del calcio
Motorola edge 70 Fusion FIFA World Cup 26 Edition porta la maglia iridata su uno smartphone accessibile: display Extreme AMOLED da 6,78 pollici a 144Hz, fotocamera Sony LYTIA 710 con moto ai, Snapdragon 7s Gen 3 abbinato a 8GB di RAM, batteria da 5200 mAh con ricarica TurboPower a 68W e certificazione IP68/IP69, il tutto in una veste PANTONE Silhouette con logo dorato a 24 carati, moto buds bass incluse in confezione e contenuti software dedicati ai Mondiali 2026
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Dopo più di un anno dal primo test drive ci siamo rimessi al volante della Renault 5 E-Tech Electric, questa volta utilizzandola come prima auto per circa due settimane. Scoprite con noi se il progetto convince ancora
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-03-2005, 15:35   #1
Fiero
Senior Member
 
L'Avatar di Fiero
 
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!
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2005, 18:31   #2
cionci
Senior Member
 
L'Avatar di cionci
 
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2005, 18:32   #3
cionci
Senior Member
 
L'Avatar di cionci
 
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 ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2005, 18:34   #4
Fiero
Senior Member
 
L'Avatar di Fiero
 
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!
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2005, 18:37   #5
cionci
Senior Member
 
L'Avatar di cionci
 
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);

}
Non serve il dereference (&) nella scanf sulle stringhe...un'identificare di stringa è già un puntatore...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2005, 21:14   #6
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
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...
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);

}
Non serve il dereference (&) nella scanf sulle stringhe...un'identificare di stringa è già un puntatore...

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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2005, 22:54   #7
Fiero
Senior Member
 
L'Avatar di Fiero
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
Quote:
Originariamente inviato da AnonimoVeneziano
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
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!
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 : 26-03-2005 alle 23:11.
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2005, 08:58   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da AnonimoVeneziano
Ma perchè tutta sta fatica??
Per fare un esercizio sui puntatori
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 18:14   #9
Fiero
Senior Member
 
L'Avatar di Fiero
 
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!
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 19:30   #10
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 19:31   #11
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 20:08   #12
Fiero
Senior Member
 
L'Avatar di Fiero
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
Quote:
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
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 20:25   #13
Fiero
Senior Member
 
L'Avatar di Fiero
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
Quote:
Originariamente inviato da AnonimoVeneziano
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);

}
Eccolo! Questo funziona!

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 20:41.
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 21:00   #14
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da Fiero
Eccolo! Questo funziona!

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.

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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 21:12   #15
Fiero
Senior Member
 
L'Avatar di Fiero
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 534
Quote:
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...

Grazie mille!
Fiero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Motorola edge 70 Fusion FIFA World Cup 26 Edition: un ottimo smartphone per i fan del calcio Motorola edge 70 Fusion FIFA World Cup 26 Editio...
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati? Renault 5 elettrica al giudizio definitivo: solo...
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
La GPU più piccola al mondo &egra...
DoomPaint: sì, adesso si pu&ograv...
BIOS bloccato, Claude Code trova il punt...
Università di Modena e Reggio Emi...
Giulia Caffi, prima laureata in Health I...
NVIDIA GeForce Titan X compie 10 anni: q...
Un deposito anti-speculazione per i nuov...
Anche il cerotto diventa smart: accelera...
Mezzo milione di galassie in una sola im...
Lefant V1 a 99 euro: 40.000 Pa, LED touc...
Adesso il cibo si ordina a voce: Just Ea...
I brani creati dall'IA fuori dalle class...
Il gioco che tutti aspettano nel 2026 no...
Kindle Scribe 32 GB in offerta: schermo ...
MSI rompe gli schemi: il nuovo OLED 4K d...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v