Oppure

Loading
06/10/10 21:07
mago85
Ciao a tutti, sono MaGo85 e sono nuovo del forum.

Ne approfitto subito per porvi una questione per me irrisolvibile.

Sto da poco affrontando l'annosa questione dei puntatori, con conseguente
allocazione di memoria ecc.
Ok, a questo aggiungiamoci le strutture e cosa ottengo ? Un po' di confusione...

Allora per testare le mie competenze, ho cercato di realizzare un semplice programmino che forniti dei dati in input, li memorizzi una struttura e poi stampi a video un resoconto del tutto.

Fatto ! Sembra funzionare tutto correttamente, ma al momento di stampare a video il resoconto, i valori che mi vengono stampati corrispondono tutti all'ultimo valore digitato...
Non riesco a capire cosa ci sia che non va

Vi riporto di seguito il codice

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


typedef struct option {
	char *sedili;
	char *volante;
}optionals;

typedef struct car {
	char *interni;
	char *esterni;
	char *cerchi;
	optionals opt; 
}arg;

void inizializza(arg *macchina, int nmacchine);
void inseriscidati(arg *macchina, int nmacchine);
void stampadati(arg *macchina, int nmacchine);

int main(void){
	
	int macchine;
	arg  * giulietta;
	
	printf("Inserisci il numero di Macchina da configurare: ");
	scanf("%d", &macchine);
	giulietta =(arg *) malloc(sizeof(arg)*macchine);
	inizializza(giulietta, macchine);
	inseriscidati(giulietta, macchine);
	stampadati(giulietta, macchine);
	free(giulietta);
	return 0;
}




//Funzione per inizializzare la struttura con valori vuoti
void inizializza(arg *macchina, int nmacchine){
	int i=0;
	
	for (i=0;i<nmacchine;i++){
		(macchina+i)->interni = 'Ciao a tutti, sono MaGo85 e sono nuovo del forum.


Ne approfitto subito per porvi una questione per me irrisolvibile.

Sto da poco affrontando l'annosa questione dei puntatori, con conseguente
allocazione di memoria ecc.
Ok, a questo aggiungiamoci le strutture e cosa ottengo ? Un po' di confusione...

Allora per testare le mie competenze, ho cercato di realizzare un semplice programmino che forniti dei dati in input, li memorizzi una struttura e poi stampi a video un resoconto del tutto.

Fatto ! Sembra funzionare tutto correttamente, ma al momento di stampare a video il resoconto, i valori che mi vengono stampati corrispondono tutti all'ultimo valore digitato...
Non riesco a capire cosa ci sia che non va

Vi riporto di seguito il codice

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


typedef struct option {
	char *sedili;
	char *volante;
}optionals;

typedef struct car {
	char *interni;
	char *esterni;
	char *cerchi;
	optionals opt; 
}arg;

void inizializza(arg *macchina, int nmacchine);
void inseriscidati(arg *macchina, int nmacchine);
void stampadati(arg *macchina, int nmacchine);

int main(void){
	
	int macchine;
	arg  * giulietta;
	
	printf("Inserisci il numero di Macchina da configurare: ");
	scanf("%d", &macchine);
	giulietta =(arg *) malloc(sizeof(arg)*macchine);
	inizializza(giulietta, macchine);
	inseriscidati(giulietta, macchine);
	stampadati(giulietta, macchine);
	free(giulietta);
	return 0;
}




//Funzione per inizializzare la struttura con valori vuoti
void inizializza(arg *macchina, int nmacchine){
	int i=0;
	
	for (i=0;i<nmacchine;i++){
		(macchina+i)->interni = '{parsed_message}';
		(macchina+i)->esterni = '{parsed_message}';
		(macchina+i)->cerchi = '{parsed_message}';
		(macchina+i)->opt.sedili = '{parsed_message}';
		(macchina+i)->opt.volante = '{parsed_message}';
	}
}

//Funzione per memorizzare i dati nella struttura
void inseriscidati(arg *macchina, int nmacchine){
	
	int i=0;
	char *temp;
	for(i=0;i<nmacchine;i++){
		printf("\nMacchina %d:", i+1);
		temp = (char *) malloc(sizeof(char));
		printf("\nInserisci il tipo di interno: ");
		scanf("%s",temp);
		(macchina+i)->interni = temp;
		printf("\n%s", (macchina+i)->interni);
		printf("\nInserisci il colore degli esterni: ");
		scanf("%s",temp);
		(macchina+i)->esterni = temp;
		printf("\nInserisci il tipo di cherchi: ");
		scanf("%s",temp);
		(macchina+i)->cerchi = temp;
		printf("\nOPTIONALS:");
		printf("\nInserisci il colore dei sedili: ");
		scanf("%s",temp);
		(macchina+i)->opt.sedili = temp;
		printf("\nInserisci la tipologia di volante: ");
		scanf("%s",temp);
		(macchina+i)->opt.volante = temp;
		free(temp);
	}
}

//Funzione che stampa a video i dati della struttura
void stampadati(arg *macchina, int nmacchine){
	int i=0;
	printf("\n\nCONFIGURAZIONI DISPONIBILI:");
	for(i=0;i<nmacchine;i++){
		printf("\n\nGiulietta %d", i+1);
		printf("\nInterni: %s", (macchina+i)->interni);
		printf("\nEsterni: %s", (macchina+i)->esterni);
		printf("\nCerchi: %s", (macchina+i)->cerchi);
		printf("\nOPTIONALS");
		printf("\nInterni: %s", (macchina+i)->opt.sedili);
		printf("\nInterni: %s", (macchina+i)->opt.volante);
	}
}


Grazie per la pazienza se siete arrivati fino a qui...
'; (macchina+i)->esterni = 'Ciao a tutti, sono MaGo85 e sono nuovo del forum.

Ne approfitto subito per porvi una questione per me irrisolvibile.

Sto da poco affrontando l'annosa questione dei puntatori, con conseguente
allocazione di memoria ecc.
Ok, a questo aggiungiamoci le strutture e cosa ottengo ? Un po' di confusione...

Allora per testare le mie competenze, ho cercato di realizzare un semplice programmino che forniti dei dati in input, li memorizzi una struttura e poi stampi a video un resoconto del tutto.

Fatto ! Sembra funzionare tutto correttamente, ma al momento di stampare a video il resoconto, i valori che mi vengono stampati corrispondono tutti all'ultimo valore digitato...
Non riesco a capire cosa ci sia che non va

Vi riporto di seguito il codice

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


typedef struct option {
	char *sedili;
	char *volante;
}optionals;

typedef struct car {
	char *interni;
	char *esterni;
	char *cerchi;
	optionals opt; 
}arg;

void inizializza(arg *macchina, int nmacchine);
void inseriscidati(arg *macchina, int nmacchine);
void stampadati(arg *macchina, int nmacchine);

int main(void){
	
	int macchine;
	arg  * giulietta;
	
	printf("Inserisci il numero di Macchina da configurare: ");
	scanf("%d", &macchine);
	giulietta =(arg *) malloc(sizeof(arg)*macchine);
	inizializza(giulietta, macchine);
	inseriscidati(giulietta, macchine);
	stampadati(giulietta, macchine);
	free(giulietta);
	return 0;
}




//Funzione per inizializzare la struttura con valori vuoti
void inizializza(arg *macchina, int nmacchine){
	int i=0;
	
	for (i=0;i<nmacchine;i++){
		(macchina+i)->interni = '{parsed_message}';
		(macchina+i)->esterni = '{parsed_message}';
		(macchina+i)->cerchi = '{parsed_message}';
		(macchina+i)->opt.sedili = '{parsed_message}';
		(macchina+i)->opt.volante = '{parsed_message}';
	}
}

//Funzione per memorizzare i dati nella struttura
void inseriscidati(arg *macchina, int nmacchine){
	
	int i=0;
	char *temp;
	for(i=0;i<nmacchine;i++){
		printf("\nMacchina %d:", i+1);
		temp = (char *) malloc(sizeof(char));
		printf("\nInserisci il tipo di interno: ");
		scanf("%s",temp);
		(macchina+i)->interni = temp;
		printf("\n%s", (macchina+i)->interni);
		printf("\nInserisci il colore degli esterni: ");
		scanf("%s",temp);
		(macchina+i)->esterni = temp;
		printf("\nInserisci il tipo di cherchi: ");
		scanf("%s",temp);
		(macchina+i)->cerchi = temp;
		printf("\nOPTIONALS:");
		printf("\nInserisci il colore dei sedili: ");
		scanf("%s",temp);
		(macchina+i)->opt.sedili = temp;
		printf("\nInserisci la tipologia di volante: ");
		scanf("%s",temp);
		(macchina+i)->opt.volante = temp;
		free(temp);
	}
}

//Funzione che stampa a video i dati della struttura
void stampadati(arg *macchina, int nmacchine){
	int i=0;
	printf("\n\nCONFIGURAZIONI DISPONIBILI:");
	for(i=0;i<nmacchine;i++){
		printf("\n\nGiulietta %d", i+1);
		printf("\nInterni: %s", (macchina+i)->interni);
		printf("\nEsterni: %s", (macchina+i)->esterni);
		printf("\nCerchi: %s", (macchina+i)->cerchi);
		printf("\nOPTIONALS");
		printf("\nInterni: %s", (macchina+i)->opt.sedili);
		printf("\nInterni: %s", (macchina+i)->opt.volante);
	}
}


Grazie per la pazienza se siete arrivati fino a qui...
'; (macchina+i)->cerchi = 'Ciao a tutti, sono MaGo85 e sono nuovo del forum.

Ne approfitto subito per porvi una questione per me irrisolvibile.

Sto da poco affrontando l'annosa questione dei puntatori, con conseguente
allocazione di memoria ecc.
Ok, a questo aggiungiamoci le strutture e cosa ottengo ? Un po' di confusione...

Allora per testare le mie competenze, ho cercato di realizzare un semplice programmino che forniti dei dati in input, li memorizzi una struttura e poi stampi a video un resoconto del tutto.

Fatto ! Sembra funzionare tutto correttamente, ma al momento di stampare a video il resoconto, i valori che mi vengono stampati corrispondono tutti all'ultimo valore digitato...
Non riesco a capire cosa ci sia che non va

Vi riporto di seguito il codice

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


typedef struct option {
	char *sedili;
	char *volante;
}optionals;

typedef struct car {
	char *interni;
	char *esterni;
	char *cerchi;
	optionals opt; 
}arg;

void inizializza(arg *macchina, int nmacchine);
void inseriscidati(arg *macchina, int nmacchine);
void stampadati(arg *macchina, int nmacchine);

int main(void){
	
	int macchine;
	arg  * giulietta;
	
	printf("Inserisci il numero di Macchina da configurare: ");
	scanf("%d", &macchine);
	giulietta =(arg *) malloc(sizeof(arg)*macchine);
	inizializza(giulietta, macchine);
	inseriscidati(giulietta, macchine);
	stampadati(giulietta, macchine);
	free(giulietta);
	return 0;
}




//Funzione per inizializzare la struttura con valori vuoti
void inizializza(arg *macchina, int nmacchine){
	int i=0;
	
	for (i=0;i<nmacchine;i++){
		(macchina+i)->interni = '{parsed_message}';
		(macchina+i)->esterni = '{parsed_message}';
		(macchina+i)->cerchi = '{parsed_message}';
		(macchina+i)->opt.sedili = '{parsed_message}';
		(macchina+i)->opt.volante = '{parsed_message}';
	}
}

//Funzione per memorizzare i dati nella struttura
void inseriscidati(arg *macchina, int nmacchine){
	
	int i=0;
	char *temp;
	for(i=0;i<nmacchine;i++){
		printf("\nMacchina %d:", i+1);
		temp = (char *) malloc(sizeof(char));
		printf("\nInserisci il tipo di interno: ");
		scanf("%s",temp);
		(macchina+i)->interni = temp;
		printf("\n%s", (macchina+i)->interni);
		printf("\nInserisci il colore degli esterni: ");
		scanf("%s",temp);
		(macchina+i)->esterni = temp;
		printf("\nInserisci il tipo di cherchi: ");
		scanf("%s",temp);
		(macchina+i)->cerchi = temp;
		printf("\nOPTIONALS:");
		printf("\nInserisci il colore dei sedili: ");
		scanf("%s",temp);
		(macchina+i)->opt.sedili = temp;
		printf("\nInserisci la tipologia di volante: ");
		scanf("%s",temp);
		(macchina+i)->opt.volante = temp;
		free(temp);
	}
}

//Funzione che stampa a video i dati della struttura
void stampadati(arg *macchina, int nmacchine){
	int i=0;
	printf("\n\nCONFIGURAZIONI DISPONIBILI:");
	for(i=0;i<nmacchine;i++){
		printf("\n\nGiulietta %d", i+1);
		printf("\nInterni: %s", (macchina+i)->interni);
		printf("\nEsterni: %s", (macchina+i)->esterni);
		printf("\nCerchi: %s", (macchina+i)->cerchi);
		printf("\nOPTIONALS");
		printf("\nInterni: %s", (macchina+i)->opt.sedili);
		printf("\nInterni: %s", (macchina+i)->opt.volante);
	}
}


Grazie per la pazienza se siete arrivati fino a qui...
'; (macchina+i)->opt.sedili = 'Ciao a tutti, sono MaGo85 e sono nuovo del forum.

Ne approfitto subito per porvi una questione per me irrisolvibile.

Sto da poco affrontando l'annosa questione dei puntatori, con conseguente
allocazione di memoria ecc.
Ok, a questo aggiungiamoci le strutture e cosa ottengo ? Un po' di confusione...

Allora per testare le mie competenze, ho cercato di realizzare un semplice programmino che forniti dei dati in input, li memorizzi una struttura e poi stampi a video un resoconto del tutto.

Fatto ! Sembra funzionare tutto correttamente, ma al momento di stampare a video il resoconto, i valori che mi vengono stampati corrispondono tutti all'ultimo valore digitato...
Non riesco a capire cosa ci sia che non va

Vi riporto di seguito il codice

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


typedef struct option {
	char *sedili;
	char *volante;
}optionals;

typedef struct car {
	char *interni;
	char *esterni;
	char *cerchi;
	optionals opt; 
}arg;

void inizializza(arg *macchina, int nmacchine);
void inseriscidati(arg *macchina, int nmacchine);
void stampadati(arg *macchina, int nmacchine);

int main(void){
	
	int macchine;
	arg  * giulietta;
	
	printf("Inserisci il numero di Macchina da configurare: ");
	scanf("%d", &macchine);
	giulietta =(arg *) malloc(sizeof(arg)*macchine);
	inizializza(giulietta, macchine);
	inseriscidati(giulietta, macchine);
	stampadati(giulietta, macchine);
	free(giulietta);
	return 0;
}




//Funzione per inizializzare la struttura con valori vuoti
void inizializza(arg *macchina, int nmacchine){
	int i=0;
	
	for (i=0;i<nmacchine;i++){
		(macchina+i)->interni = '{parsed_message}';
		(macchina+i)->esterni = '{parsed_message}';
		(macchina+i)->cerchi = '{parsed_message}';
		(macchina+i)->opt.sedili = '{parsed_message}';
		(macchina+i)->opt.volante = '{parsed_message}';
	}
}

//Funzione per memorizzare i dati nella struttura
void inseriscidati(arg *macchina, int nmacchine){
	
	int i=0;
	char *temp;
	for(i=0;i<nmacchine;i++){
		printf("\nMacchina %d:", i+1);
		temp = (char *) malloc(sizeof(char));
		printf("\nInserisci il tipo di interno: ");
		scanf("%s",temp);
		(macchina+i)->interni = temp;
		printf("\n%s", (macchina+i)->interni);
		printf("\nInserisci il colore degli esterni: ");
		scanf("%s",temp);
		(macchina+i)->esterni = temp;
		printf("\nInserisci il tipo di cherchi: ");
		scanf("%s",temp);
		(macchina+i)->cerchi = temp;
		printf("\nOPTIONALS:");
		printf("\nInserisci il colore dei sedili: ");
		scanf("%s",temp);
		(macchina+i)->opt.sedili = temp;
		printf("\nInserisci la tipologia di volante: ");
		scanf("%s",temp);
		(macchina+i)->opt.volante = temp;
		free(temp);
	}
}

//Funzione che stampa a video i dati della struttura
void stampadati(arg *macchina, int nmacchine){
	int i=0;
	printf("\n\nCONFIGURAZIONI DISPONIBILI:");
	for(i=0;i<nmacchine;i++){
		printf("\n\nGiulietta %d", i+1);
		printf("\nInterni: %s", (macchina+i)->interni);
		printf("\nEsterni: %s", (macchina+i)->esterni);
		printf("\nCerchi: %s", (macchina+i)->cerchi);
		printf("\nOPTIONALS");
		printf("\nInterni: %s", (macchina+i)->opt.sedili);
		printf("\nInterni: %s", (macchina+i)->opt.volante);
	}
}


Grazie per la pazienza se siete arrivati fino a qui...
'; (macchina+i)->opt.volante = 'Ciao a tutti, sono MaGo85 e sono nuovo del forum.

Ne approfitto subito per porvi una questione per me irrisolvibile.

Sto da poco affrontando l'annosa questione dei puntatori, con conseguente
allocazione di memoria ecc.
Ok, a questo aggiungiamoci le strutture e cosa ottengo ? Un po' di confusione...

Allora per testare le mie competenze, ho cercato di realizzare un semplice programmino che forniti dei dati in input, li memorizzi una struttura e poi stampi a video un resoconto del tutto.

Fatto ! Sembra funzionare tutto correttamente, ma al momento di stampare a video il resoconto, i valori che mi vengono stampati corrispondono tutti all'ultimo valore digitato...
Non riesco a capire cosa ci sia che non va

Vi riporto di seguito il codice

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


typedef struct option {
	char *sedili;
	char *volante;
}optionals;

typedef struct car {
	char *interni;
	char *esterni;
	char *cerchi;
	optionals opt; 
}arg;

void inizializza(arg *macchina, int nmacchine);
void inseriscidati(arg *macchina, int nmacchine);
void stampadati(arg *macchina, int nmacchine);

int main(void){
	
	int macchine;
	arg  * giulietta;
	
	printf("Inserisci il numero di Macchina da configurare: ");
	scanf("%d", &macchine);
	giulietta =(arg *) malloc(sizeof(arg)*macchine);
	inizializza(giulietta, macchine);
	inseriscidati(giulietta, macchine);
	stampadati(giulietta, macchine);
	free(giulietta);
	return 0;
}




//Funzione per inizializzare la struttura con valori vuoti
void inizializza(arg *macchina, int nmacchine){
	int i=0;
	
	for (i=0;i<nmacchine;i++){
		(macchina+i)->interni = '{parsed_message}';
		(macchina+i)->esterni = '{parsed_message}';
		(macchina+i)->cerchi = '{parsed_message}';
		(macchina+i)->opt.sedili = '{parsed_message}';
		(macchina+i)->opt.volante = '{parsed_message}';
	}
}

//Funzione per memorizzare i dati nella struttura
void inseriscidati(arg *macchina, int nmacchine){
	
	int i=0;
	char *temp;
	for(i=0;i<nmacchine;i++){
		printf("\nMacchina %d:", i+1);
		temp = (char *) malloc(sizeof(char));
		printf("\nInserisci il tipo di interno: ");
		scanf("%s",temp);
		(macchina+i)->interni = temp;
		printf("\n%s", (macchina+i)->interni);
		printf("\nInserisci il colore degli esterni: ");
		scanf("%s",temp);
		(macchina+i)->esterni = temp;
		printf("\nInserisci il tipo di cherchi: ");
		scanf("%s",temp);
		(macchina+i)->cerchi = temp;
		printf("\nOPTIONALS:");
		printf("\nInserisci il colore dei sedili: ");
		scanf("%s",temp);
		(macchina+i)->opt.sedili = temp;
		printf("\nInserisci la tipologia di volante: ");
		scanf("%s",temp);
		(macchina+i)->opt.volante = temp;
		free(temp);
	}
}

//Funzione che stampa a video i dati della struttura
void stampadati(arg *macchina, int nmacchine){
	int i=0;
	printf("\n\nCONFIGURAZIONI DISPONIBILI:");
	for(i=0;i<nmacchine;i++){
		printf("\n\nGiulietta %d", i+1);
		printf("\nInterni: %s", (macchina+i)->interni);
		printf("\nEsterni: %s", (macchina+i)->esterni);
		printf("\nCerchi: %s", (macchina+i)->cerchi);
		printf("\nOPTIONALS");
		printf("\nInterni: %s", (macchina+i)->opt.sedili);
		printf("\nInterni: %s", (macchina+i)->opt.volante);
	}
}


Grazie per la pazienza se siete arrivati fino a qui...
'; } } //Funzione per memorizzare i dati nella struttura void inseriscidati(arg *macchina, int nmacchine){ int i=0; char *temp; for(i=0;i<nmacchine;i++){ printf("\nMacchina %d:", i+1); temp = (char *) malloc(sizeof(char)); printf("\nInserisci il tipo di interno: "); scanf("%s",temp); (macchina+i)->interni = temp; printf("\n%s", (macchina+i)->interni); printf("\nInserisci il colore degli esterni: "); scanf("%s",temp); (macchina+i)->esterni = temp; printf("\nInserisci il tipo di cherchi: "); scanf("%s",temp); (macchina+i)->cerchi = temp; printf("\nOPTIONALS:"); printf("\nInserisci il colore dei sedili: "); scanf("%s",temp); (macchina+i)->opt.sedili = temp; printf("\nInserisci la tipologia di volante: "); scanf("%s",temp); (macchina+i)->opt.volante = temp; free(temp); } } //Funzione che stampa a video i dati della struttura void stampadati(arg *macchina, int nmacchine){ int i=0; printf("\n\nCONFIGURAZIONI DISPONIBILI:"); for(i=0;i<nmacchine;i++){ printf("\n\nGiulietta %d", i+1); printf("\nInterni: %s", (macchina+i)->interni); printf("\nEsterni: %s", (macchina+i)->esterni); printf("\nCerchi: %s", (macchina+i)->cerchi); printf("\nOPTIONALS"); printf("\nInterni: %s", (macchina+i)->opt.sedili); printf("\nInterni: %s", (macchina+i)->opt.volante); } }


Grazie per la pazienza se siete arrivati fino a qui...
aaa
07/10/10 10:21
Il Totem
Penso che il problema sia in inseriscidati. Tu usi una variabile temp (puntatore a carattere) allocandola dinamicamente ogni volta in un blocco da 1 byte. Non ha senso usare un puntatore a carattere per memorizzare un solo carattere. Se vuoi una stringa, devi allocare più spazio:
temp = (char*)malloc(sizeof(char) * n);

n è una costante. Puoi usare sia gets che scanf.
Ma il problema è che fai la free di temp ad ogni iterazione. Questo significa che lo spazio puntato da interni, esterni, cerchi, sedili e volante è vuoto: nota che tutti i campi della struttura puntano alla stessa zona di memoria, perchè temp è stato allocato una sola volta e scanf cambia solo il valore dei dati in quell'indirizzo, ma non tocca l'indirizzo stesso.
Mi pare strano che non dia un segmentation fault...
aaa
08/10/10 12:48
Alex
in inserisci dati hai allocato lo spazio per un char... forse non ti da errore perchè la scanf legge solo quel char e poi lascia i prossimi caratteri alla sua successiva chiamata perchè il vettore (che contiene solo un char) è pieno...
aaa