[ANSI C] Vettore di struttura, il loop for clona le componenti ?!?Come è possibi

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
geopardy
Prode Principiante
Messaggi: 116
Iscrizione: giovedì 12 gennaio 2006, 14:50
Contatti:

[ANSI C] Vettore di struttura, il loop for clona le componenti ?!?Come è possibi

Messaggio da geopardy »

Ciao, sempre alle prese con il gcc (questo mistero vivente).
Sto cercando di costruire una semplice rubrica basata su un vettore di tipo struttura.
Funziona tutto correttamente, tranne il fatto che gli inserimenti attraverso le scanf() all'interno di un loop for clonano tutto il vettore
con l'ultimo inserimento eseguito.... (provare per credere)
Perchè succede questo???
ecco il listato

Codice: Seleziona tutto

#include<stdio.h>

#include<stdlib.h>


#define MAXV 10

main()

{


	int i;
	char name[50];
	char phone[50];
	

	struct rubrica	/* definisco la struttura */

		{

			char *nome;

			char *telefono;

		};

	struct rubrica miarubrica[MAXV], *p_rubrica; /* istanzio un vettore tipo rubrica e un puntatore tipo rubrica */

	p_rubrica = miarubrica; /* assegno il puntatore alla prima componente */
	

	for (i = 0; i< MAXV; i++)	{	/* popola il vettore con tutti record uguali */

		(p_rubrica+i)->nome ="Pippo";

		(p_rubrica+i)->telefono = "0123456789";

	}

		

	(p_rubrica+4)->nome = "Pluto"; /* esegue una modifica alla componente di posizione 4 */

	(p_rubrica+4)->telefono ="00000";
	
	for (i = 0; i < MAXV; i++){	/* loop per la popolazione ciclica, partendo dalla componente 0 in avanti */
		printf("Rec %d\tNome:\tTelefono:",i);
		scanf("%s %s",name,phone);
		(p_rubrica+i)->nome = name;
		(p_rubrica+i)->telefono = phone;
	}/* perchè il vettore si popola con tutte copie dell'ultimo inserimento ?????? */
		

	for (i = 0; i< MAXV; i++) /* loop per l'output */

		printf("Siamo al n. %d: nome: %s telefono: %s\n", i, (p_rubrica+i)->nome, (p_rubrica+i)->telefono);

}
Chi mi potrà svelare l'arcano? >:(
Allegati
Immagine.png
strutt5.txt
(1.17 KiB) Scaricato 26 volte
Ultima modifica di geopardy il sabato 8 marzo 2008, 20:41, modificato 1 volta in totale.
Frag91
Prode Principiante
Messaggi: 3
Iscrizione: sabato 8 marzo 2008, 11:22

Re: [ANSI C] Problema con vettore di struttura, il loop for clona le componenti

Messaggio da Frag91 »

Allora, si vede che sei un pò alle prime armi, almeno come organizzazione del codice  (nono)

Ma non fa nulla, vediamo comunque passo passo:

main()

Perchè non la definisci di tipo intero?
Così puoi ritornare dei valori per la chiusura del programma, diciamo che è buona abitudine dichiararla come "int main()"; o ancora meglio "int main( int argc, char **argv");

Poi perchè tutti questi casini con puntatori, strutture definite all'interno della main ::)

Non è più semplice qualcosa del genere?
#include

#define MAXV 3

struct persona
{
char *nome;
char *telefono;
};

int main()
{
struct persona miapersona[MAXV];
int i;

for ( i = 0; i Telefono: %s\n", &miapersona.nome, &miapersona.telefono);
}

return 0;
}



Se hai problemi e nn capisci qualcosa chiedi  :P

P.S: hai imparato a programmare con il pascal vero?
No perchè in C, gli indici di array ed i puntatori iniziano da 0 non da 1, quindi fare come hai fatto tu :
(p_rubrica+4)->nome = "Pluto"; /* esegue una modifica alla componente di posizione 4 */


In realtà la esegue alla quinta. Buona fortuna
geopardy
Prode Principiante
Messaggi: 116
Iscrizione: giovedì 12 gennaio 2006, 14:50
Contatti:

Re: [ANSI C] Problema con vettore di struttura, il loop for clona le componenti

Messaggio da geopardy »

Ciao Frag91, grazie per avermi risposto! :)

E' vero sono molto alle prime armi ( e ci sto mettendo anche un sacco d'impegno). Non ho imparato a programmare con il Pascal (magari), le mie prime esperienze di programmazione risalgono al BASIC V2 del commodore 64 (quindi hai davanti uno smanettone preistorico :)
Il codice che hai pubblicato, purtroppo, dalla compilazione partorisce i seguenti errori :

Codice: Seleziona tutto

dharma@dharmanet:~/Desktop/SorgentiC/Esame$ gcc -ostrutt6 ./strutt6.c
./strutt6.c: In function ‘main’:
./strutt6.c:19: error: request for member ‘nome’ in something not a structure or union
./strutt6.c:22: error: request for member ‘telefono’ in something not a structure or union
./strutt6.c:28: error: request for member ‘nome’ in something not a structure or union
./strutt6.c:28: error: request for member ‘telefono’ in something not a structure or union
dharma@dharmanet:~/Desktop/SorgentiC/Esame$ gcc -ostrutt6 ./strutt6.c
./strutt6.c: In function ‘main’:
./strutt6.c:28: error: request for member ‘nome’ in something not a structure or union
./strutt6.c:28: error: request for member ‘telefono’ in something not a structure or union
dharma@dharmanet:~/Desktop/SorgentiC/Esame$ gcc -ostrutt6 ./strutt6.c
./strutt6.c: In function ‘main’:
./strutt6.c:28: error: request for member ‘nome’ in something not a structure or union
./strutt6.c:28: error: request for member ‘telefono’ in something not a structure or union
Sbaglio qualcosa nella compilazione?
Non mi è chiaro però come fai puntare i membri della struttura alla relativa componente del vettore (?)
Mi spiego meglio: in

Codice: Seleziona tutto

 scanf  ( "%s", &miapersona.nome);
assegni l'input all'indirizzo (al riferimento) di miapersona.nome, ma come indichi che si tratta del miapersona.nome della i-esima componente del vettore?
Ho provato a indicizzare i membri della struttura cosi:

Codice: Seleziona tutto

for ( i = 0; i < MAXV; i++)
   {
      printf ( "Inserisci il nome...");
      scanf  ( "%s", &miapersona[i].nome);

      printf ("Inserisci il telefono...");
      scanf  ( "%s", &miapersona[i].telefono);
   }

   // Stampa il vettore di struttura
   for ( i = 0; i < MAXV; i++)
   {
      printf ("NOME: %s ----> Telefono: %s\n", &miapersona[i].nome, &miapersona[i].telefono);
   }
La compilazione avviene senza errori ma in run time i risltati sono disastrosi:

Codice: Seleziona tutto

dharma@dharmanet:~/Desktop/SorgentiC/Esame$ gcc -ostrutt6 ./strutt6.c
dharma@dharmanet:~/Desktop/SorgentiC/Esame$ ./strutt6 
Inserisci il nome...Pippo
Inserisci il telefono...45
Inserisci il nome...Pluto
Inserisci il telefono...86
Inserisci il nome...Paperino
Inserisci il telefono...154
Inserisci il nome...Paperoga
Inserisci il telefono...1250
Inserisci il nome...GEO
Inserisci il telefono...89
NOME: Pipp154 ----> Telefono: 154
NOME: Pape1250GEO ----> Telefono: 1250GEO
NOME: GEO ----> Telefono: 89
E ti devo dire la verità quello cui non riesco a darmi pace è:
perchè il loop for non si interrompe come dovrebbe dopo il quarto (partendo da 0 :)) ciclo ma continua?
osserva l'output: vedi che Pippo 154 è diventato Pipp154 154... è tutto un problema di puntatori o sbaglio?
Come si fa?
Grazie, ciao

Perchè l'assegnazione al vettore struttura produce un vettore con tutte le componenti uguali???
Ultima modifica di geopardy il sabato 8 marzo 2008, 20:39, modificato 1 volta in totale.
Frag91
Prode Principiante
Messaggi: 3
Iscrizione: sabato 8 marzo 2008, 11:22

Re: [ANSI C] Vettore di struttura, il loop for clona le componenti ?!?Come è pos

Messaggio da Frag91 »

???
Mi sento molto frastornato  :o
Mi fungeva alla perfezione!

Forse ho semplicemente sbagliato il copia incolla  (rotfl)

Faccio uscire il cane, mi loggo su linux e vedo un pò. A dopo 8)
geopardy
Prode Principiante
Messaggi: 116
Iscrizione: giovedì 12 gennaio 2006, 14:50
Contatti:

Re: [ANSI C] Vettore di struttura, il loop for clona le componenti ?!?Come è pos

Messaggio da geopardy »

Io credo che il mio problema sia che non so veramente comprendere una stringa intesa come puntatore di caratteri ma la immagino come una stringa del basic (che non è!) Mi sto riguardando il capitolo sui puntatori e spero di avere un illuminazione, credo che dovrò usare strcpy per copiare una stringa e non come facevo io... nel mio caso il puntatore rimane lo stesso ed è per questo che le stringhe assumono tutte lo stesso valore... sì! ma da qui a farlo.... ne passa!
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: [ANSI C] Vettore di struttura, il loop for clona le componenti ?!?Come è pos

Messaggio da bite »

Ho dato un'occhiata rapida, ma credo proprio di aver visto ciò che vi sfugge.
La struttura 'persona' contiene dei puntatori, non contiene lo spazio per il nome e il numero di telefono.
Con riferimento al primo programma postato, quando assegni i puntatori

Codice: Seleziona tutto

		(p_rubrica+i)->nome = name;
		(p_rubrica+i)->telefono = phone;
in realtà li fai puntare sempre negli stessi posti: 'name' e 'phone'.
Questi sono char [50] e quindi hanno lo spazio per memorizzare la stringa, ma lo spazio è sempre lo stesso per tutte le stringhe e viene sovrascritto ad ogni scanf.
Chiaro quindi che quello che resta è l'ultimo inserito.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti