Array di puntatori a strutture.

di il
5 risposte

Array di puntatori a strutture.

Buonasera a tutti, 

Sono nuovo in questo forum e alle prime armi con il linguaggio C, ed infatti ho incontrato un primo problema e volevo gentilmente chiedere aiuto. Il problema è: è possibile (e se sì come posso farlo) creare un array che contenga 4 puntatori a strutture (allocati dinamicamente) senza ricorrere ai puntatori a puntatori?

Ringrazio in anticipo chiunque mi risponderà.

5 Risposte

  • Re: Array di puntatori a strutture.

    Ciao Asdrubale senza d, non ho capito se lo vuoi fare in quel modo perché non sai usare il puntatore a puntatori o ti hanno detto di farlo.

    Comunque il vettore di puntatori può essere statico

    struct TuaStruttura * pVet[4];

  • Re: Array di puntatori a strutture.

    Salve Oregon, 

    Innanzitutto, ti ringrazio molto per la risposta.

    Sto svolgendo un esercizio (senza soluzione), perché come ho detto sono alle prime armi con il C, e l'indicazione dello stesso non specifica quale metodo usare, quindi sono voluto rimanere nel più “semplice” e generale possibile, ma magari anche un tuo consiglio su quale preferire mi farebbe molto comodo. 

    Per chiare la parte dell'esercizio che mi interessa e in cui ho problemi chiede la seguente cosa: “Definire la funzione imposta_persona() che chiede di inserire da tastiera il numero di persone, che può variare da minimo 1 a massimo 4. Ogni persona è rappresentata da una struct Persona, che viene creta in memoria dinamica. L’insieme delle persone è rappresentato da un array di 4 Struct Persone* (NULL se la persona è assente). Inoltre, il nome viene inserito da tastiera e l'eta è fissa a 20 anni per tutte le persone.”

    Dovendo svolgere l'esercizio seguendo il principio di programmazione modulare la funzione imposta_persona() è definita in un modulo e la struttura in un'altro che è incluso. 

    Io come scritto da te nella funzione imposta_persona ho utilizzato un vettore statico e questo è come ho strutturato il modulo relativo alla funzione imposta_persona():

    #include "persona.h"
    
    static void crea_persona(struct Persona *personaPtr[], int i);
    
    unsigned short num_persone = 0;
    int c = 0; 
    struct Persona* persone[4];
    
    void imposta_persona(){
    	
    	do {
    	printf("\nInserire il numero di persone (da un minimo di 1 a un massimo di 4):\n\n");
    	scanf(%hu, &num_persone);	
    	while((c = getchar()) != '\n' && != EOF);
    	
    	for(int i = 0; i < num_persone; i++){
    		persone[i] = (struct Persona*) malloc(sizeof(struct Persona));
    	}
    	
    	switch(num_persone){
    		case 1:
    		crea_persona(persone[0], 0);
    		persone[1] = NULL; 
    		persone[2] = NULL;
    		persone[3] = NULL; 
    		break;
    		
    		case 2:
    		crea_persona(persone[0], 0);
    		crea_persona(persone[1], 1);
    		persone[2] = NULL;
    		persone[3] = NULL; 
    		break;
    		
    		case 3:
    		crea_persona(persone[0], 0);
    		crea_persona(persone[1], 1);
    		crea_persona(persone[2], 2);
    		persone[3] = NULL; 
    		break;
    		
    		case 4:
    		crea_persona(persone[0], 0);
    		crea_persona(persone[1], 1);
    		crea_persona(persone[2], 2);
    		crea_persona(persone[3], 3);
    		break;
    		
    		default:
    		printf("Numero di persone non valido);
    	    }
    	} while(num_persone < 1 || num_persone > 4);
    }
    
    static void crea_persona(struct Persona *personaPtr[], int i){
    	personaPtr -> eta = 20;
    }

    La definizione della struttura è la seguente:

    struct Persona {
    	char nome_persona[40];
    	int eta;
    };

    Bene, a questo punto compilando il programma e aggiungendo anche i flag -std =c11 -Wall mi ritorna il seguente errore: “error: ‘*personePtr’ is a pointer; did you mean to use ‘->’?” 

    E vorrei capire quale fosse il problema visto che l'operatore ? l'ho utilizzato. 

    P.S. ho tralasciato la parte del nome della persona inserito da tastiera, perchè tanto il problema persiste e perché in particolare mi interessa e mi resta difficile capire come posso definire un array di 4 Struct Persone*.

  • Re: Array di puntatori a strutture.

    Devi utilizzare uno dei 4 puntatori, non il nome dell'array di puntatori

    personaPtr[i]->eta = 20;

    ma le chiamate devono essere

    crea_persona(persone, 0);

    e cos' via.

    In ogni caso, il ciclo e lo switch devono essere rivisti …

  • Re: Array di puntatori a strutture.

    22/05/2023 - oregon ha scritto:


    Devi utilizzare uno dei 4 puntatori, non il nome dell'array di puntatori

    personaPtr[i]->eta = 20;

    ma le chiamate devono essere

    crea_persona(persone, 0);

    e cos' via.

    In ogni caso, il ciclo e lo switch devono essere rivisti …

    Bene, grazie mille. Per fissare i concetti e capire la logica, come mai quando chiamo la funzione crea_persona() devo passare ‘persone’? E poi riguardo lo switch ti riferisci al fatto che ci sono errori nell'impostare a NULL?

    Grazie mille ancora per la risposta e scusa per la mia incapacità ma voglio capire bene dove sbaglio e imparare. 

  • Re: Array di puntatori a strutture.

    Devi passare l'array proprio perché è tutto l'array che gli hai indicato come primo parametro

    struct Persona *personaPtr[]

    e la funzione deve in seguito accedere al singolo puntatore che è l'elemento i-esimo dell'array.

    Per il resto, non capisco perché usi un ciclo do-while che include tutte le operazioni, non ha senso, con il ciclo devi solo controllare l'input corretto del valore num_persone. In seguito, non serve lo switch ma un ciclo for che alloca la memoria e contemporaneamente chiama la crea_persona. Ricorda che l'array fuori dal main è già azzerato quindi già con gli elementi a NULL

Devi accedere o registrarti per scrivere nel forum
5 risposte