PDA

View Full Version : [C]Collocazione variabile


Composition86
20-12-2008, 21:53
Salve a tutti, sto svolgendo il seguente 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");
}
}

Vorrei fare in modo di utilizzare d evitando di metterla come variabile globale o all'interno della funzione (come ho fatto io, ma questa cosa di solito da' problemi).
Dove la dovrei collocare per evitare malfunzionamenti? Grazie in anticipo.

Composition86
21-12-2008, 14:56
Un up, non credo sia difficile.

Alla fine la mia domanda è: "Come posso fare per inserire un numero in una funzione e renderlo disponibile per tutte le altre funzioni?"

marco.r
21-12-2008, 15:06
Lo dichiari nella funzione principale e lo passi come argomento alle due funzioni.

Composition86
21-12-2008, 15:14
Avevo già provato a fare così:
#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");
}
}
Purtroppo non funziona: il ciclo for mi sembra che venga completato ignorando la variabile d e scrivendo una serie di caratteri insensati, poi il programma si blocca. Dove sbaglio?

marco.r
21-12-2008, 15:21
init deve leggere "d" e ritornarne il valore. non puoi quindi passare il parametro per valore. Devi passare il puntatore.


void init (Persona *dati, int* d)


E piu' sotto passare direttamente d:

scanf ("%d", d);

Composition86
21-12-2008, 15:28
Ho cambiato e funziona, potresti dare una controllata? Quando devo usare i puntatori ho sempre il timore di sbagliare ed accorgermene nelle funzioni successive.
#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");
}
}
[EDIT] Non fa niente per il controllo, ho applicato la cosa a programmi più complessi e non ho avuto sorprese particolari, ti ringrazio comunque per il prezioso consiglio!