Strutture collegate fra loro a mezzo di puntatore linguaggio C

di il
4 risposte

Strutture collegate fra loro a mezzo di puntatore linguaggio C

Buongiorno, ho un problema con la realizzazione di questo codice:

creo una struttura così fatta :

struct docente {
	char nome[N];
	char cognome[N];
	struct permesso *lista_p;
	struct dipartimento *ptr;
};
creo un vettore di struct docente che siano collegati ad altre due strutture così fatte:

struct permesso{
	int data;
	int targa;
};

struct dipartimento{
	int  rif_dip;
	int telefono;
};


il codice completo è il seguente:

#include <stdio.h>
#include <stdlib.h>
#define N 15
#define dim 3

struct docente {
	char nome[N];
	char cognome[N];
	struct permesso *lista_p;
	struct dipartimento *ptr;
};

struct permesso{
	int data;
	int targa;
};

struct dipartimento{
	int  rif_dip;
	int telefono;
};
int main(void) {

	struct docente V[dim];
	int j;

	for(j=0;j<dim;j++){

		scanf("%s",V[j].nome);
		scanf("%s",V[j].cognome);
		scanf("%d",&V[j].lista_p->data);
		scanf("%d",&V[j].lista_p->targa);
		scanf("%d",&V[j].ptr->rif_dip);
		scanf("%d",&V[j].ptr->telefono);

	}
	for(j=0;j<dim;j++)
			{
		printf("Il nome è: %s il cognome è : %s la data del permesso è: %d  la targa associata è: %d il riferimento del dipartimento associato è: %d   ed il numero di telefono del dipartimento è:   %d",V[j].nome,V[j].cognome,V[j].lista_p->data,V[j].lista_p->targa,V[j].ptr->rif_dip,V[j].ptr->telefono);
			}
	
	return EXIT_SUCCESS;
}
Dunque, inizio a far girare il programma e dopo aver digitato :nome,cognome e data mi arriva un messaggio di errore da windows che mi dice : il programma "x.exe" ha smesso di funzionare.

Normalmente utilizzo eclipse, pertanto pensando che fosse un problema della piattaforma, ho provato a far girare il tutto con codeblocks ma purtroppo mi dà il solito errore.


Dunque il codice prevede di assegnare ai docenti di un corso di laurea una serie di permessi di parcheggio, definiti attraverso una data ed una targa associata, per capire se funzionava ho semplificato il codice ed ho dichiarato che vi sia un solo permesso per ogni prof.
altrimentio avrei dovuto dichiarare una struct così fatta:

struct permesso{
	int data;
	int targa;
	struct permesso *prox; // classica lista 
};

Ripeto in genere provo il codice senza l'utilizzo delle funzioni come scritto sopra dopodichè riarrangio il tutto utilizzo le funzioni.

La domanda mia è questa:

Se il puntatore alla struttura serve per legare o concatenare strutture , come mai il mio vettore di struct docente al cui interno della struttura sono stati dichiarati
due puntatori alle strutture permesso e dipartimento non fà ciò?

struct docente {
	char nome[N];
	char cognome[N];
	struct permesso *lista_p;
	struct dipartimento *ptr;
};

struct permesso{
	int data;
	int targa;
};

struct dipartimento{
	int  rif_dip;
	int telefono;
};

4 Risposte

  • Re: Strutture collegate fra loro a mezzo di puntatore linguaggio C

    I puntatori non possono essere utilizzati se non li fai puntare a memoria allocata. Prima dell'input devi allocare dinamicamente un elemento per ogni struttura.
  • Re: Strutture collegate fra loro a mezzo di puntatore linguaggio C

    Grande Giove!

    Funziona. Eppure la prima volta avevo fatto così. Poi pensando che non avevo bisogno di allocare dinamicamente memoria dato che il vettore di struct è statico e non dinamico .

    comunque adesso il codice gira difatti:
    
    #include <stdio.h>
    #include <stdlib.h>
    #define N 15
    #define dim 3
    
    struct docente {
    	char nome[N];
    	char cognome[N];
    	struct permesso *lista_p;
    	struct dipartimento *ptr;
    };
    
    struct permesso{
    	int data;
    	int targa;
    };
    
    struct dipartimento{
    	int  rif_dip;
    	int telefono;
    };
    int main(void) {
    
    	struct docente V[dim];
    	int j;
    
    	for(j=0;j<dim;j++){
    
    		scanf("%s",V[j].nome);
    		scanf("%s",V[j].cognome);
    		V[j].lista_p=(struct permesso*)malloc(sizeof(struct permesso));
    		scanf("%d",&V[j].lista_p->data);
    		scanf("%d",&V[j].lista_p->targa);
    		V[j].ptr=(struct dipartimento*)malloc(sizeof(struct dipartimento));
    		scanf("%d",&V[j].ptr->rif_dip);
    		scanf("%d",&V[j].ptr->telefono);
    
    	}
    	for(j=0;j<dim;j++)
    			{
    		printf("Il nome è: %s il cognome è : %s la data del permesso è: %d  la targa associata è: %d il riferimento del dipartimento associato è: %d   ed il numero di telefono del dipartimento è:   %d",V[j].nome,V[j].cognome,V[j].lista_p->data,V[j].lista_p->targa,V[j].ptr->rif_dip,V[j].ptr->telefono);
    			}
    	return EXIT_SUCCESS;
    }
    
  • Re: Strutture collegate fra loro a mezzo di puntatore linguaggio C

    Eterno333 ha scritto:


    Funziona.
    Beh ...
    Eppure la prima volta avevo fatto così.
    No, sbagliato.
    Poi pensando che non avevo bisogno di allocare dinamicamente memoria dato che il vettore di struct è statico e non dinamico .
    Il vettore di struct docente è statico ma le strutture permesso e dipartimento no !
  • Re: Strutture collegate fra loro a mezzo di puntatore linguaggio C

    Giustissimo. Grazie mille.
Devi accedere o registrarti per scrivere nel forum
4 risposte