Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

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

    Ciao a tutti,
    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:
    #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++)	{/* popolo 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 5*/
    	(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); /* ecco repplicata sempre l'ultima riga in ogni componente del vettore */
    }
    Ho provato ache con altri metodi, usando gli indici al posto dei puntaori, a copiare l'intera struttura in una componente di un analogo vettore struttura, il risultato non cambia. Da notare che solo i membri di tipo stringa sono tutti uguali all'ultimo inserimento , un eventuale intero all'interno della struttura manterrebbe il valore assengato.
    Cos'è che sbaglio???
    La luna è molto più importante del sole: C'è molto più bisogno di luce di notte che non di giorno!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    Succede perche' tu non hai ancora chiaro il concetto di stringa e di puntatore a stringa in C ... Hai scritto il codice quasi come se fosse BASIC ...

    Se all'interno della struttura hai due "puntatori" a stringa, quando vuoi assegnare una stringa variabile al puntatore, ne devi PRIMA allocare lo spazio dinamicamente e DOPO copiare il contenuto tramite la funzione strcpy ...

    Se assegni a tutte le stringhe (come stai facendo) il puntatore al buffer "name", alla fine tutte le stringhe punteranno allo stesso contenuto (quello di name) ovvero al suo ultimo contenuto assegnato ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    aiutino...

    Grazie Oregon per avermi risposto, è chiedere troppo poter vedere qualche esempio?
    (sicneramente ho capito quello che mi suggerisci ma non so bene da che parte iniziare)
    Magari mi dai un link a qualcosa dove viene presentato bene bene l'argomento??
    Grazie
    La luna è molto più importante del sole: C'è molto più bisogno di luce di notte che non di giorno!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    L'argomento in questione sono le stringhe e i puntatori ... e' un argomento trattato in TUTTI i libri di base del C ... (presumo tu stia studiando con un libro ...).

    Non so se hai studiato gia' l'allocazione dinamica della memoria, ma potresti affrontare i problemi gradualmente, cambiando la struttura in questo modo

    codice:
    struct rubrica
    {
       char nome[50];
       char telefono[50];
    };
    e modificando il codice in maniera opportuna ... ad esempio, il codice per popolare la struttura diventa

    codice:
    for (i = 0; i<MAXV; i++)
    {
       strcpy(miarubrica[i].nome, "Pippo");
       strcpy(miarubrica[i].telefono, "0123456789");
    }
    ... il resto saprai modificarlo da solo ... e mi raccomando usa la strcpy ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Studio su una traduzione del Kernighan Ritchie, alcuni concetti sono espressi in maniera poco approfondita, forse perchè si rivolge a un lettore già esperto.
    Ecco, ho capito che il tipo di assegnazione che usavo io non faceva altro che passare l'indirizzo (o riferiemento) di una locazione di memoria ai vari componenti struttura ergo passava sempre la medesima stringa.
    Stavo giusto guardando la strcpy, il KR (Kernighan Ritchie) a tale proposito dice dice: "...Sarebbe bello potere scrivere semplicemente s=t, ma questo copia soltanto i puntatori," quello che ho fatto io, "non i caratteri. Per copiare i caratteri, abbiamo bisogno di un ciclo..." e qui viene presentata la strcpy in varie versioni.
    Che dire?
    Decisamente mi sei stato di grande aiuto, mi hai messo sulla buona strada. GRAZIE!!!
    La luna è molto più importante del sole: C'è molto più bisogno di luce di notte che non di giorno!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    Di nulla ... pero' vedi ... nei libri c'e' scritto tutto ... bisogna leggerli PRIMA di scrivere il codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.