Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-03-2005, 16: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, 19: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, 19: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, 19: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, 19: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, 22: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, 23: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 : 27-03-2005 alle 00:11.
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2005, 09: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, 19: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, 20: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, 20: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, 21: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, 21: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 21:41.
Fiero è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2005, 22: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, 22: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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
2 schede video a prezzi da non perdere: ...
iPhone 17 Pro Max in super sconto su Ama...
Un 'fiore di compagnia', l'ultimo curios...
The Witcher 4: per sviluppo e marketing ...
Samsung smentisce l'ipotesi di un aument...
Under Armour: dati di 72 milioni di uten...
Scuderia Ferrari HP svela la SF-26: bell...
Beats Studio Pro in forte sconto su Amaz...
Il 'Windows open-source' compie 30 anni:...
Forza Horizon 6: ulteriori dettagli emer...
Nuovi limiti ai biocarburanti: quelli a ...
HONOR Magic8 Pro: lo smartphone che vede...
Batterie allo stato solido anche da Geel...
Fable torna ad essere protagonista: annu...
Google integra i dati di Gmail e Foto de...
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: 14:02.


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