[Risolto] Programma con struct in C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Taurus95
Prode Principiante
Messaggi: 100
Iscrizione: venerdì 16 giugno 2017, 13:18
Desktop: ubuntu
Distribuzione: Ubuntu 22.10
Sesso: Maschile
Località: Pisa

[Risolto] Programma con struct in C

Messaggio da Taurus95 »

Ciao a tutti!
Un problema mi sta facendo dannare l'anima e quindi mi rivolgo a voi per un aiuto da esperti!

Devo scrivere un programma, ma continua a darmi certi errori che non capisco bene.

Vi allego il testo dell'esercizio e il mio sorgente per cercare di capire cosa non va.

ps: suggerimenti per migliorare sono ben accetti.

Testo del problema

Codice: Seleziona tutto

#include <stdio.h>
struct persona                          //creo la struct
{	char nome[10];
	struct persona * mamma;
	struct  persona * babbo;
} ;
typedef  struct persona  Persona;    //sì, potevo farlo diretto

void ins_nome(Persona *d, Persona *e, Persona *f)    //inserisco i nomi delle 3 struct
{	int i;
	for (i=0; i<10; i++)
		scanf("%c", &d->nome[i]);
	for (i=0; i<10; i++)
		scanf("%c", &e->nome[i]);
	for (i=0; i<10; i++)
		scanf("%c", &f->nome[i]);
}
void ins_genitori(Persona *x, Persona *y, Persona *z)  //associo le struct
{	char temp;
	if(y->nome!=NULL)
		for(int i=0;i<10;i++)
		{	temp=y->nome[i];
			x->mamma->nome[i]=temp;  
		}
	if(z->nome!=NULL)
		for(int i=0;i<10;i++)
		{	temp=z->nome[i];
			x->babbo->nome[i]=temp;
		}
}
void print_persona (Persona w)   //stampa output nel formato richiesto
{	int i;
	for(i=0;i<10;i++)
		printf("%c", w.nome[i]);
	printf("\n");
	{	if (&mamma.nome != NULL)
			for(i=0;i<10;i++)
				printf("%c", mamma.nome[i]);
		else
			printf("Sconosciuto");
	}
/*error: ‘mamma’ undeclared (first use in this function)
  { if (&mamma.nome != NULL)
         ^~~~~
famiglia.c:36:9: note: each undeclared identifier is reported only once for each function it appears in*/
//idem nel blocco successivo
	{	if (&babbo.nome != NULL)
			for(i=0;i<10;i++)
				printf("%c", babbo.nome[i]);
		else
			printf("Sconosciuto");
	}
	printf("\n");
}
int main()
{	Persona figlio, madre, padre, ignoto;     //creo le 4 struct
	ins_nome(&figlio, &madre, &padre);      //inserisco i nomi negli array
	figlio.mamma=&madre;                             //associo figlio con genitori
	figlio.babbo=&padre;
	ins_genitori(&figlio, &madre, &padre);     //inserisco i nomi dei genitori
	ins_genitori(&madre, &ignoto, &ignoto);
	ins_genitori(&padre, &ignoto, &ignoto);
	print_persona(figlio);        //stampo le stringhe richieste
	print_persona(madre);
	print_persona(padre);
	return 0;
}
Grazie in anticipo a chi mi potrà aiutare!
(Spero di aver azzeccato la sezione giusta :cry: )
Ultima modifica di Taurus95 il giovedì 3 maggio 2018, 14:59, modificato 4 volte in totale.
Avatar utente
Taurus95
Prode Principiante
Messaggi: 100
Iscrizione: venerdì 16 giugno 2017, 13:18
Desktop: ubuntu
Distribuzione: Ubuntu 22.10
Sesso: Maschile
Località: Pisa

Re: Programma con struct in C

Messaggio da Taurus95 »

Nessuno può aiutarmi?
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [AIUTO] Programma con struct in C

Messaggio da gila75 »

Ho solo dato una guardata veloce.
Mamma e babbo sono due puntatori alla struttura...un po' come next per le liste.
Dovrei vedere gli appunti, al telefono, non sono cosi' bravo.
Ma devi, se non erro, allocare lo spazio per quei puntatori. Nelle liste usi malloc: il puntatore punta la struttura e malloc dimensiona lo spazio della struttura stessa.
Avatar utente
Taurus95
Prode Principiante
Messaggi: 100
Iscrizione: venerdì 16 giugno 2017, 13:18
Desktop: ubuntu
Distribuzione: Ubuntu 22.10
Sesso: Maschile
Località: Pisa

Re: Programma con struct in C

Messaggio da Taurus95 »

In teoria questo esercizio non dovrebbe utilizzare le liste poiché sarebbe previsto nella lezione successiva la lista..però adesso provo
Avatar utente
Taurus95
Prode Principiante
Messaggi: 100
Iscrizione: venerdì 16 giugno 2017, 13:18
Desktop: ubuntu
Distribuzione: Ubuntu 22.10
Sesso: Maschile
Località: Pisa

Re: Programma con struct in C

Messaggio da Taurus95 »

Allora, ho smanettato un po'..la compilazione mi è riuscita, ma all'esecuzione ricevo un Segmentation Fault "Errore di segmentazione (core dump creato)". :cry: :cry:
Allego il nuovo codice

Codice: Seleziona tutto

//FAMIGLIA
#include <stdio.h>
struct persona 
{	char nome[10];
	struct persona * mamma;
	struct  persona * babbo;
} ;
typedef  struct persona  Persona;
void ins_nome(Persona *d, Persona *e, Persona *f)
{	int i;
	for (i=0; i<10; i++)
		scanf("%c", &d->nome[i]);
	for (i=0; i<10; i++)
		scanf("%c", &e->nome[i]);
	for (i=0; i<10; i++)
		scanf("%c", &f->nome[i]);
}
void ins_genitori(Persona *x, Persona *y, Persona *z)
{	char temp;
	if(y->nome!=NULL)
		for(int i=0;i<10;i++)
		{	temp=y->nome[i];
			x->mamma->nome[i]=temp;
		}
	if(z->nome!=NULL)
		for(int i=0;i<10;i++)
		{	temp=z->nome[i];
			x->babbo->nome[i]=temp;
		}
}
void print_persona(Persona w)
{	int i;
	for(i=0;i<10;i++)
		printf("%c", w.nome[i]);
	printf("\n");
	{	if (w.mamma->nome != NULL)
			for(i=0;i<10;i++)
				printf("%c", w.mamma->nome[i]);
		else
			printf("Sconosciuto");
	}
	{	if (w.babbo->nome != NULL)
			for(i=0;i<10;i++)
				printf("%c", w.babbo->nome[i]);
		else
			printf("Sconosciuto");
	}
	printf("\n");
}
int main()
{	Persona figlio, madre, padre, ignoto;
	ins_nome(&figlio, &madre, &padre);
	figlio.mamma=&madre;
	figlio.babbo=&padre;
	ins_genitori(&figlio, &madre, &padre);
	ins_genitori(&madre, &ignoto, &ignoto);
	ins_genitori(&padre, &ignoto, &ignoto);
	print_persona(figlio);
	print_persona(madre);
	print_persona(padre);
	return 0;
}
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: Programma con struct in C

Messaggio da gila75 »

Non intendevo usare le liste.
Dico che *mamma punta a una struttura. Ma quanto spazio deve riservare *mamma ?
Cosi' e' solo un puntatore.
Pero' non voglio portarti su strade magari sbagliate.
Ogni volta, se passa un po' di tempo, devo ripassare.
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: Programma con struct in C

Messaggio da Actarus5 »

Purtroppo non ho modo di usare il PC questi giorni però mi pare che Gila abbia ragione ed in effetti il segmentazione fault sembra confermare la cosa.
A parte questo non capisco perché tu stia usando scanf e printf in quel modo... È una richiesta del docente?
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: Programma con struct in C

Messaggio da gila75 »

Non so se ho inteso giusto (non ho capito un granchè della consegna).
Ma dovrebbe essere una cosa così:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

	struct struttura
	{
		char stringa[10];
		struct struttura *mamma;
		
    } ;

int main(void)
{
	struct struttura *p;
	p=malloc(sizeof( struct struttura));
	if (NULL==p)
    {
    	printf ("abort\n");
        exit(0);
    }
	puts("allocazione 1 ok");
	strcpy (p->stringa, "ciao1");
	p->mamma=malloc(sizeof( struct struttura));
	if (NULL==p->mamma)
    {
    	printf ("abort\n");
        exit(0);
    }
	puts("allocazione 2 ok");
	strcpy (p->mamma->stringa,"ciao2");
	printf ("%s\n", p->mamma->stringa);
	printf ("%s\n", p->stringa);
	free(p->mamma);
	free(p);
	return 0;
}
Scusami ma poi io faccio fatica con typedef... persona Persona.. bho io mi confondo.
Non è sede ma typedef se non per "nascondere" dati per cose un po' complesse non ne vedo l'utilità. Confonde a mio avviso.
è un po' che non ripasso strutture malloc ecc.
Ma l'idea è che se un puntatore punta a qualcosa devi pur riservargli lo spazio no?
Nell'esempio ho fatto una struttura:

Codice: Seleziona tutto

	struct struttura
	{
		char stringa[10];
		struct struttura *mamma;
		
    } ;
quindi alloco:

Codice: Seleziona tutto

struct struttura *p;
	p=malloc(sizeof( struct struttura));
	if (NULL==p)
    {
    	printf ("abort\n");
        exit(0);
    }
	puts("allocazione 1 ok");
	strcpy (p->stringa, "ciao1")
ora dal puntatore p in poi ci sarà spazio per la struttura.
Come esempio ho fatto una prova e ci piazzo la stringa ciao1 nel campo stringa.
Adesso ho il puntatore *mamma, che è un campo della struttura di prima, puntata da p.
Quindi *mamma rimarrà in quello spazio che abbiamo allocato prima.
Da qui si snoda la seconda struttura che ha bisogno pure lei di spazio:

Codice: Seleziona tutto

p->mamma=malloc(sizeof( struct struttura));
	if (NULL==p->mamma)
    {
    	printf ("abort\n");
        exit(0);
    }
	puts("allocazione 2 ok");
sempre come prova faccio:

Codice: Seleziona tutto

strcpy (p->mamma->stringa,"ciao2");
e infine stampo le due scritte per assicurarmi che non abbia sovrascritto nulla.
Quindi ho la certezza che sono 2 strutture distinte:

Codice: Seleziona tutto

printf ("%s\n", p->mamma->stringa);
	printf ("%s\n", p->stringa);
questo è solo uno spunto, spero di non aver detto caxxate... :D
Avatar utente
Taurus95
Prode Principiante
Messaggi: 100
Iscrizione: venerdì 16 giugno 2017, 13:18
Desktop: ubuntu
Distribuzione: Ubuntu 22.10
Sesso: Maschile
Località: Pisa

Re: Programma con struct in C

Messaggio da Taurus95 »

Sì, tranquillo! Le consegne sono un po' da interpretare a sentimento! Comunque proverò i tuoi suggerimenti e farò sapere!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti