[C]Problema con variabile interna ad una procedura
Salve a tutti, sto svolgendo un semplice esercizio:
Questo programma memorizza dei nomi e li scrive.
Tuttavia vorrei cambiare la posizione della variabile "d": il programma funziona perfettamente, ma non riesco a spiegarmi il perchè, se "d" viene immessa e letta nella prima procedura, non dovrebbe esserci alcun motivo per cui la seconda procedura possa usufruirne.
In un altro programma che ho fatto, simile, ho proprio seguito questo procedimento, ma in questo caso non funzionava. Vorrei proprio evitare questo inconveniente, come posso fare?
Voglio evitare di metterla come variabile globale.
Ho quindi provato anche ad inserirla come argomento delle due procedure: in questo caso il programma stampa i dati che ho immesso più una serie di caratteri insensati.
Che mi consigliate di fare? Grazie.
#include <conio.h> #include <stdio.h> #include <ctype.h> #define DIMSTRINGA 25 #define DIM 50 typedef char Stringa[DIMSTRINGA]; typedef struct{ Stringa nome; Stringa cognome; int eta; } Persona; void init (Persona *); void stampaDati (Persona *); main() { Persona Dati[DIM]; int D; char scelta; do { init (Dati); stampaDati (Dati); printf ("\nVuoi ripetere il programma? (Digita 'n' per terminare) "); scelta=getche(); } while (tolower(scelta) != 'n'); } void init (Persona *dati) { int i, d; printf ("Inserire il numero di persone che si vuole immagazzinare (inferiore a 50): "); scanf ("%d", &d); printf ("Digitare i nomi delle %d persone:\n", d); for (i=0; i<= d-1; i++) { printf ("Inserire nome: "); scanf ("%s", dati[i].nome); printf ("Inserire cognome: "); scanf ("%s", dati[i].cognome); printf ("Inserire eta': "); scanf ("%d", &dati[i].eta); printf ("********************\n"); } } void stampaDati (Persona *dati) { int i, d; printf ("Ecco l'archivio con i dati delle %d persone memorizzate:\n", d); for (i=0; i<= d-1; i++) { printf ("Nome: %s\n", dati[i].nome); printf ("Cognome: %s\n", dati[i].cognome); printf ("Eta': %d\n", dati[i].eta); printf ("********************\n"); } }
Questo programma memorizza dei nomi e li scrive.
Tuttavia vorrei cambiare la posizione della variabile "d": il programma funziona perfettamente, ma non riesco a spiegarmi il perchè, se "d" viene immessa e letta nella prima procedura, non dovrebbe esserci alcun motivo per cui la seconda procedura possa usufruirne.
In un altro programma che ho fatto, simile, ho proprio seguito questo procedimento, ma in questo caso non funzionava. Vorrei proprio evitare questo inconveniente, come posso fare?
Voglio evitare di metterla come variabile globale.
Ho quindi provato anche ad inserirla come argomento delle due procedure: in questo caso il programma stampa i dati che ho immesso più una serie di caratteri insensati.
Che mi consigliate di fare? Grazie.
Risposte
vorrei provareil tuo programma .
ma ho problemi con la libreria conio.h
io uso linux .
come faccio ha installarla ?
ma ho problemi con la libreria conio.h
io uso linux .
come faccio ha installarla ?
non è standard C(è specifica di un compilatore) e in linux non è contemplata.
Prova ad usare invece le ncurses( http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ )
Prova ad usare invece le ncurses( http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ )
la libreria conio.h si puomontare manualmnte ?
e questa qui ?
ncurses non basta bisogna installare anche conio.h
http://sunsite.unc.edu/pub/Linux/libs/u ... o-1.02.tgz
ciao.
e questa qui ?
ncurses non basta bisogna installare anche conio.h
http://sunsite.unc.edu/pub/Linux/libs/u ... o-1.02.tgz
ciao.
Ciao, purtroppo non so come funziona questa faccenda delle librerie, ne so abbastanza poco di programmazione.
Comunque ecco un programma alternativo (con la variabile "d" messa come argomento della funzione) che per qualche motivo non funziona:
Comunque ecco un programma alternativo (con la variabile "d" messa come argomento della funzione) che per qualche motivo non funziona:
#include <conio.h> #include <stdio.h> #include <ctype.h> #define DIMSTRINGA 25 #define DIM 50 typedef char Stringa[DIMSTRINGA]; typedef struct{ Stringa nome; Stringa cognome; int eta; } Persona; void init (Persona *, int d); void stampaDati (Persona *, int d); main() { Persona Dati[DIM]; int D; char scelta; do { init (Dati , D); stampaDati (Dati, D); printf ("\nVuoi ripetere il programma? (Digita 'n' per terminare) "); scelta=getche(); } while (tolower(scelta) != 'n'); } void init (Persona *dati, int d) { int i; printf ("Inserire il numero di persone che si vuole immagazzinare (inferiore a 50): "); scanf ("%d", &d); printf ("Digitare i nomi delle %d persone:\n", d); for (i=0; i<= d-1; i++) { printf ("Inserire nome: "); scanf ("%s", dati[i].nome); printf ("Inserire cognome: "); scanf ("%s", dati[i].cognome); printf ("Inserire eta': "); scanf ("%d", &dati[i].eta); printf ("********************\n"); } } void stampaDati (Persona *dati, int d) { int i; printf ("Ecco l'archivio con i dati delle %d persone memorizzate:\n", d); for (i=0; i<= d-1; i++) { printf ("Nome: %s\n", dati[i].nome); printf ("Cognome: %s\n", dati[i].cognome); printf ("Eta': %d\n", dati[i].eta); printf ("********************\n"); } }
praticamente se non dico stupidate :
conio.h e una libreria che viene usata in windows
e in particolare dai programmi di comilazione di windows
non e una libreria standard di linux . non viene usata in linux
io uso per compilare il gcc ... http://gcc.gnu.org/
io non conosco che programma usi tu . per farela compilazione in windows .
sarebbe bello . che mi dicessi ,che programma usi tu in windows ,
sperando che sia gratuito . cosi lo butto su anche io e ci gioco un po .
in alternativa devo installare la libreria http://sunsite.unc.edu/pub/Linux/libs/u ... o-1.02.tgz manualmente .
che non e difficile da fare ma non ha mai fatto .
(REDME makefile) sapete come si fa ? tochera leggere !
scusa per le ritondanze
ciao
conio.h e una libreria che viene usata in windows
e in particolare dai programmi di comilazione di windows
non e una libreria standard di linux . non viene usata in linux
io uso per compilare il gcc ... http://gcc.gnu.org/
io non conosco che programma usi tu . per farela compilazione in windows .
sarebbe bello . che mi dicessi ,che programma usi tu in windows ,
sperando che sia gratuito . cosi lo butto su anche io e ci gioco un po .
in alternativa devo installare la libreria http://sunsite.unc.edu/pub/Linux/libs/u ... o-1.02.tgz manualmente .
che non e difficile da fare ma non ha mai fatto .
(REDME makefile) sapete come si fa ? tochera leggere !
scusa per le ritondanze
ciao
Nel frattempo ho risolto, grazie lo stesso:
#include <conio.h> #include <stdio.h> #include <ctype.h> #define DIMSTRINGA 25 #define DIM 50 typedef char Stringa[DIMSTRINGA]; typedef struct{ Stringa nome; Stringa cognome; int eta; } Persona; void init (Persona *, int *); void stampaDati (Persona *, int *); main() { Persona Dati[DIM]; int D; char scelta; do { init (Dati, &D); stampaDati (Dati, &D); printf ("\nVuoi ripetere il programma? (Digita 'n' per terminare) "); scelta=getche(); } while (tolower(scelta) != 'n'); } void init (Persona *dati, int *d) { int i; printf ("Inserire il numero di persone che si vuole immagazzinare (inferiore a 50): "); scanf ("%d", d); printf ("Digitare i nomi delle %d persone:\n", *d); for (i=0; i<= *d-1; i++) { printf ("Inserire nome: "); scanf ("%s", dati[i].nome); printf ("Inserire cognome: "); scanf ("%s", dati[i].cognome); printf ("Inserire eta': "); scanf ("%d", &dati[i].eta); printf ("********************\n"); } } void stampaDati (Persona *dati, int *d) { int i; printf ("Ecco l'archivio con i dati delle %d persone memorizzate:\n", *d); for (i=0; i<= *d-1; i++) { printf ("Nome: %s\n", dati[i].nome); printf ("Cognome: %s\n", dati[i].cognome); printf ("Eta': %d\n", dati[i].eta); printf ("********************\n"); } }
"goron":
Salve a tutti, sto svolgendo un semplice esercizio:
#include <conio.h> #include <stdio.h> #include <ctype.h> #define DIMSTRINGA 25 #define DIM 50 typedef char Stringa[DIMSTRINGA]; typedef struct{ Stringa nome; Stringa cognome; int eta; } Persona; void init (Persona *); void stampaDati (Persona *); main() { Persona Dati[DIM]; int D; char scelta; do { init (Dati); stampaDati (Dati); printf ("\nVuoi ripetere il programma? (Digita 'n' per terminare) "); scelta=getche(); } while (tolower(scelta) != 'n'); } void init (Persona *dati) { int i, d; printf ("Inserire il numero di persone che si vuole immagazzinare (inferiore a 50): "); scanf ("%d", &d); printf ("Digitare i nomi delle %d persone:\n", d); for (i=0; i<= d-1; i++) { printf ("Inserire nome: "); scanf ("%s", dati[i].nome); printf ("Inserire cognome: "); scanf ("%s", dati[i].cognome); printf ("Inserire eta': "); scanf ("%d", &dati[i].eta); printf ("********************\n"); } } void stampaDati (Persona *dati) { int i, d; printf ("Ecco l'archivio con i dati delle %d persone memorizzate:\n", d); for (i=0; i<= d-1; i++) { printf ("Nome: %s\n", dati[i].nome); printf ("Cognome: %s\n", dati[i].cognome); printf ("Eta': %d\n", dati[i].eta); printf ("********************\n"); } }
Questo programma memorizza dei nomi e li scrive.
Tuttavia vorrei cambiare la posizione della variabile "d": il programma funziona perfettamente, ma non riesco a spiegarmi il perchè, se "d" viene immessa e letta nella prima procedura, non dovrebbe esserci alcun motivo per cui la seconda procedura possa usufruirne.
In un altro programma che ho fatto, simile, ho proprio seguito questo procedimento, ma in questo caso non funzionava. Vorrei proprio evitare questo inconveniente, come posso fare?
Voglio evitare di metterla come variabile globale.
Ho quindi provato anche ad inserirla come argomento delle due procedure: in questo caso il programma stampa i dati che ho immesso più una serie di caratteri insensati.
Che mi consigliate di fare? Grazie.
Prova a fare così:
int init (Persona *dati)
{
..............
return d;
}
void stampaDati (Persona *dati, int d)
{
int i
.........
}
e nel main:
d = init(Dati);
stampaDati(Dati, d);
cioè ti fai tornare la variabile d dalla funzione init e poi la passi alla funzione stampaDati.
Dovrebbe funzionare, ma non ho provato.
Ciao