[RISOLTO]C Errore di segmentazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

[RISOLTO]C Errore di segmentazione

Messaggio da Marcico »

Ciao a tutti!
Io sto facendo un programma in c , e quando lo lancio da terminale all'inizio funziona senza problemi, poi ad un certo punto compare: ERRORE DI SEGMENTAZIONE (CORE DUMP CREATO)
E il programma si chiude.
Nn è un problema del codice, perché ho provato a lanciare il programma su di un altro computer con la stessa identica versione di ubuntu.
Sapreste aiutarmi??
Grazie mille!!
Ultima modifica di Marcico il venerdì 15 giugno 2012, 11:44, modificato 1 volta in totale.
Avatar utente
PsykoMantis
Prode Principiante
Messaggi: 35
Iscrizione: giovedì 14 ottobre 2010, 23:23

Re: C Errore di segmentazione

Messaggio da PsykoMantis »

quando ti da segmentazione, significa che stai scrivendo in una zona di memoria che non può essere scritta, ma solo letta. Ciò può implicare una marea di cose: può essere che stai sforando con un indice oppure stai scrivendo su di un puntatore senza accorgertene (molto frequente scrivere su un char*) ridai un'occhiata al codice, perchè può essere solo lì l'errore.
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

lo so, però il codice è giusto, dato ke sull'altro computer funziona senza problemi..
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: C Errore di segmentazione

Messaggio da 1001001 »

Marcico ha scritto:lo so, però il codice è giusto, dato ke sull'altro computer funziona senza problemi..
non è così automatico in realtà, per quanto possa sembrare strano. Personalmente, mi è successo di scrivere un codice che andava in segmentation fault sul mio computer e non su quello di un mio amico, e alla fine si è trovato che c'era davvero un indice che sforava...morale: se il codice è giusto, va su tutti i computer, ma il fatto che funzioni su UN computer non significa che sia giusto :)
"I find your lack of faith disturbing."
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

Interessante osservazione.... Cosa intendi esattamente con un indice che sfora?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: C Errore di segmentazione

Messaggio da 1001001 »

praticamente, all'ultima iterazione del ciclo principale, in un certo punto di una funzione ausiliaria cercavo di accedere a vett[-1]...e il bello è che l'errore di segmentazione non me lo dava subito lì, ma alla fine dell'intero programma, dopo aver stampato anche il risultato (giusto!!)
"I find your lack of faith disturbing."
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

si anke a me, il programma e tutte le varie funzioni vanno.. quando completa l'ultima mi da l'errore..
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: C Errore di segmentazione

Messaggio da melfnt »

Una banalità:

Hai provato a ricompilarlo?

A volte da errore alla fine delle funzioni se non riesce a chiudere un file o qualcosa del genere.
Sennò posta il codice che gli diamo un'occhiata...
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

Ricompilato più e più volte, il programma è ancora in work in progress, nn so se hai molta voglia di controllare 800 righe di codice.. :news:
l3on4rdo

Re: C Errore di segmentazione

Messaggio da l3on4rdo »

Compila il programma usando le opzioni -Wall e -pedantic del compilatore.
Posta eventuali output, se ti segnala warning vari.
Posta inoltre il codice sorgente, altrimenti non ha molto senso parlare dei motivi (non relativi al tuo problema) legati alla segmentazione.

Ciao

ps:
ci sono esempi di programmi "errati", appositamente scritti sbagliati come esercizi in corsi universitari, che su processori a 32 bit riproducono il problema mentre su processori a 64 bit no.
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

Allora come mi hai suggerito ho provato a compilare usando -Wall..
a parte alcuni avvisi di variabili create e poi nn utilizzate mi da questo:

Codice: Seleziona tutto

X6.c: In function ‘cercaNome’:
X6.c:331:34: warning: variable ‘save’ set but not used [-Wunused-but-set-variable]
X6.c: In function ‘saltariduzione’:
X6.c:679:22: warning: variable ‘massimi’ set but not used [-Wunused-but-set-variable]
X6.c: In function ‘riduciGrigi’:
X6.c:771:2: warning: statement with no effect [-Wunused-value]
X6.c: In function ‘cercaNome’:
X6.c:368:1: warning: control reaches end of non-void function [-Wreturn-type]
X6.c: In function ‘cercaCodice’:
X6.c:325:1: warning: control reaches end of non-void function [-Wreturn-type]
X6: In function `loadBMP':
(.text+0x30a4): multiple definition of `loadBMP'
/tmp/ccGvqTPn.o:bmp.c:(.text+0x0): first defined here
X6: In function `visualizzaPazienti':
(.text+0xa82): multiple definition of `visualizzaPazienti'
/tmp/ccrEbwRW.o:X6.c:(.text+0x99e): first defined here
X6: In function `ordina':
(.text+0x2c6c): multiple definition of `ordina'
/tmp/ccrEbwRW.o:X6.c:(.text+0x2b88): first defined here
X6: In function `contaPazienti':
(.text+0xdce): multiple definition of `contaPazienti'
/tmp/ccrEbwRW.o:X6.c:(.text+0xcea): first defined here
X6: In function `menuImmagine':
(.text+0x161c): multiple definition of `menuImmagine'
/tmp/ccrEbwRW.o:X6.c:(.text+0x1538): first defined here
X6: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
X6: In function `menuAnalizza':
(.text+0x20e6): multiple definition of `menuAnalizza'
/tmp/ccrEbwRW.o:X6.c:(.text+0x2002): first defined here
X6: In function `contaImmagini':
(.text+0x1c6b): multiple definition of `contaImmagini'
/tmp/ccrEbwRW.o:X6.c:(.text+0x1b87): first defined here
X6: In function `cercaNome':
(.text+0x12cc): multiple definition of `cercaNome'
/tmp/ccrEbwRW.o:X6.c:(.text+0x11e8): first defined here
X6: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here
X6: In function `inserisciImmagine':
(.text+0x16b4): multiple definition of `inserisciImmagine'
/tmp/ccrEbwRW.o:X6.c:(.text+0x15d0): first defined here
X6: In function `contorno':
(.text+0x2d28): multiple definition of `contorno'
/tmp/ccrEbwRW.o:X6.c:(.text+0x2c44): first defined here
X6: In function `__data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o:(.data+0x0): first defined here
X6:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.rodata.cst4+0x0): first defined here
X6: In function `saveBMP':
(.text+0x3218): multiple definition of `saveBMP'
/tmp/ccGvqTPn.o:bmp.c:(.text+0x174): first defined here
X6: In function `saltariduzione':
(.text+0x249b): multiple definition of `saltariduzione'
/tmp/ccrEbwRW.o:X6.c:(.text+0x23b7): first defined here
X6: In function `istFreq':
(.text+0x23da): multiple definition of `istFreq'
/tmp/ccrEbwRW.o:X6.c:(.text+0x22f6): first defined here
X6: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here
X6: In function `recuperaPaziente':
(.text+0x9cc): multiple definition of `recuperaPaziente'
/tmp/ccrEbwRW.o:X6.c:(.text+0x8e8): first defined here
X6: In function `main':
(.text+0xe4): multiple definition of `main'
/tmp/ccrEbwRW.o:X6.c:(.text+0x0): first defined here
X6: In function `visualizzaImmagine':
(.text+0x1d14): multiple definition of `visualizzaImmagine'
/tmp/ccrEbwRW.o:X6.c:(.text+0x1c30): first defined here
X6: In function `ricercaPaziente':
(.text+0xf7e): multiple definition of `ricercaPaziente'
/tmp/ccrEbwRW.o:X6.c:(.text+0xe9a): first defined here
X6: In function `aggiungiPaziente':
(.text+0x1ff): multiple definition of `aggiungiPaziente'
/tmp/ccrEbwRW.o:X6.c:(.text+0x11b): first defined here
X6: In function `riduciGrigi':
(.text+0x25d5): multiple definition of `riduciGrigi'
/tmp/ccrEbwRW.o:X6.c:(.text+0x24f1): first defined here
X6: In function `cercaCodice':
(.text+0x1036): multiple definition of `cercaCodice'
/tmp/ccrEbwRW.o:X6.c:(.text+0xf52): first defined here
X6: In function `analisiGrigi':
(.text+0x216e): multiple definition of `analisiGrigi'
/tmp/ccrEbwRW.o:X6.c:(.text+0x208a): first defined here
X6: In function `livella':
(.text+0x2938): multiple definition of `livella'
/tmp/ccrEbwRW.o:X6.c:(.text+0x2854): first defined here
X6: In function `swap':
(.text+0x2cfc): multiple definition of `swap'
/tmp/ccrEbwRW.o:X6.c:(.text+0x2c18): first defined here
X6: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
X6: In function `scegliImmagine':
(.text+0x1f25): multiple definition of `scegliImmagine'
/tmp/ccrEbwRW.o:X6.c:(.text+0x1e41): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
X6:(.dtors+0x8): first defined here
/usr/bin/ld: error in X6(.eh_frame); no .eh_frame_hdr table will be created.
collect2: ld returned 1 exit status
Io ora non sono un genio del C, cosa vuole dire con tutte quelle "multimpe definition of [..] first define here"?

il codice del programma è:

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>
#include "bmp.h"

#define DATA_DIM 256
#define XL 120
#define L 50  //LARGE
#define M 30  //MEDIUM
#define S 17

typedef struct {
	int giorno, mese, anno;
} Data;

typedef struct {

char via[L];
int civico;
char comune[M];
char provincia[3];
char nazione[M];	
} Residenza;


typedef struct{
	char nome[L], cognome[L];
	Data dataNascita;
	char luogoNascita[M], sesso; 
	int num_immagini;   //numero effettivo di immagini xke potrebe averne di meno del max
	char percorso[M];
	char cf[S];
	int idMedico;
	Residenza res;
	int codice;

} Paziente;


void aggiungiPaziente(char *lista);
void recuperaPaziente(char *lista);
void visualizzaPazienti(char *lista);
void ricercaPaziente();
int contaPazienti(char *lista);
int cercaCodice();
int cercaNome();
void visualizzaImmagine();
void scegliImmagine();
void menuImmagine();
void menuAnalizza();
void inserisciImmagine(char *percorso);
int contaImmagini(char *lista);
void analisiGrigi(char *percorsoImmagine);
void istFreq(int * frequenze);
void saltariduzione();
void riduciGrigi();
void livella();
void ordina(int *arr);
void swap(int *a, int *b);
void contorno();


int main(int argc, char *argv[])
{
	char op[2];
	FILE *fp;
	fp=fopen(argv[1],"r");
	if(	fp==NULL)
		printf("ERRORE!! Impossibile trovare il file!\n");
	fclose(fp);



	printf("\n\nPROGETTO DI: INFORMATICA ED ELEMENTI DI INFORMATICA MEDICA\n\n");
	printf("AA 2011 - 2012\n");


	do{
		printf("\n   COMANDO\t\tOPERAZIONE\n");
		printf("\n");
		printf("\t1\tInserire dati nuovo paziente\n");
		printf("\t2\tRecuperare dati paziente\n");
		printf("\tq\tTermina programma\n");
			scanf("%s",op);
			getchar();
		switch(op[0]){
			case 'q' : printf("Programma terminato\n\n");
				break;				
			case '1' : 	aggiungiPaziente(argv[1]);
				break;
			case '2' :	recuperaPaziente(argv[1]);
				break;
			default: printf("\nCOMANDO NON RICONOSCIUTO!\n");
				break;
			}
	}while (op[0]!='q');

	
	return 0;
}


void aggiungiPaziente(char *lista){ /*devo mettere *lista xke argv[1] che mando nella funzione mi dà 
									la stringa che c'è nella mia funzione, la funzione deve ricevere appunto quella stringa,
									se io mettessi solo lista passerei alla funzione l'indirizzo del puntatore lista(quindi argv)*/
	Paziente paz;
	FILE *fp;
	int cont=0,posizione;
	char scelta[1];

		fp=fopen(lista,"a+");

		printf("Nomi, Cognomi o Luoghi contenenti più di una parola vanno uniti come da esempio:\n");
		printf("NOME : Carlo_Alberto\n\n");
		printf("Inserire dati paziente: \n");
		printf("NOME: "); 
			scanf("%s",paz.nome);
		printf("COGNOME: ");
			scanf("%s",paz.cognome);
		printf("DATA DI NASCITA\n");
		printf("MESE: ");
			scanf("%d",&paz.dataNascita.mese);
				if(paz.dataNascita.mese>12)
					do{
						printf("\nERRORE DATA NON VALIDA!\n");
						printf("MESE: ");
							scanf("%d",&paz.dataNascita.mese);
					}while(!(paz.dataNascita.mese<=12));

		printf("GIORNO: ");
			scanf("%d",&paz.dataNascita.giorno);
				if(paz.dataNascita.mese==11||paz.dataNascita.mese==4||paz.dataNascita.mese==6||paz.dataNascita.mese==9)
					if(paz.dataNascita.giorno>30)
						do{
							printf("\nERRORE DATA NON VALIDA!\n");
							printf("GIORNO: ");
								scanf("%d",&paz.dataNascita.giorno);
						}while(!(paz.dataNascita.giorno<=30));
				 if(paz.dataNascita.mese==2)
					if(paz.dataNascita.giorno>29)
						do{
							printf("\nERRORE DATA NON VALIDA!\n");
							printf("GIORNO: ");
								scanf("%d",&paz.dataNascita.giorno);
						}while(!(paz.dataNascita.giorno<=29));

				if(paz.dataNascita.mese==1||paz.dataNascita.mese==3||paz.dataNascita.mese==5||paz.dataNascita.mese==7||paz.dataNascita.mese==8||paz.dataNascita.mese==10||paz.dataNascita.mese==12)
					if(paz.dataNascita.giorno>31)
						do{
							printf("\nERRORE DATA NON VALIDA!\n");
							printf("GIORNO: ");
								scanf("%d",&paz.dataNascita.giorno);
						}while(!(paz.dataNascita.giorno<=31));
		printf("ANNO: ");
			scanf("%d",&paz.dataNascita.anno);
				if(paz.dataNascita.anno<1890 || paz.dataNascita.anno>2012)
					do{
						printf("\nERRORE DATA NON VALIDA!\n");
						printf("ANNO: ");
							scanf("%d",&paz.dataNascita.anno);
					}while(!(paz.dataNascita.anno>=1890 && paz.dataNascita.anno<=2012));
		printf("LUOGO DI NASCITA: ");
			scanf("%s",paz.luogoNascita);   
			getchar();
		printf("SESSO: ");
			scanf("%c",&paz.sesso);
		printf("CODICE FISCALE (in minuscolo): ");
			scanf("%s",paz.cf);
		printf("ID MEDICO: ");
			scanf("%d",&paz.idMedico);
        printf("INDIRIZZO DI RESIDENZA\nVIA: ");
        	scanf("%s", paz.res.via);
        printf("CIVICO: ");
        	scanf("%d", &paz.res.civico);
        printf("COMUNE: ");
        	scanf("%s", paz.res.comune);
        printf("PROVINCIA (es: MI): ");
        	scanf("%s", paz.res.provincia);
        printf("STATO: ");
        	scanf("%s", paz.res.nazione);


		cont=contaPazienti(lista);   //ci spostiamo alla fine del file ogni apertura, così se apre ed è all inizio, la seek dà 0, e allora 
										//paz.codice=cont cioè 1, altrimenti facciamo cont+1
		fseek(fp,SEEK_SET,SEEK_END);
		posizione=ftell(fp);

		if(posizione==0)     				
			paz.codice=cont;
		else
			paz.codice=cont+1;
		strcpy(paz.percorso,"Pazienti/paz"); 

		fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s%d\t%d\n",paz.nome,paz.cognome,paz.dataNascita.giorno,paz.dataNascita.mese,paz.dataNascita.anno,paz.luogoNascita,paz.sesso,paz.cf,paz.idMedico, paz.res.via, paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione, paz.percorso,paz.codice,paz.codice);

	fclose(fp);

	do{
		printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
		printf(" a\tInserisci immagine paziente\n");
		printf(" b\tTorna al menù principale\n");
		scanf("%s",scelta);
		getchar();
		if(scelta[0] !='a' && scelta[0] !='b')
			printf("CARATTERE ERRATO!\n");
		
	}while(!(scelta[0]=='a' || scelta[0]=='b')); 


		if(scelta[0]=='a')
			printf("Inserire funzione immagine\n");// da togliere ovviamente	
}

void recuperaPaziente(char *lista){
	char scelta[1];

	
	do{
		printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
		printf("\ta\tVisualizza lista pazienti\n");
		printf("\tb\tRicerca paziente\n");
		printf("\t0\tTorna al menù principale\n");
			scanf("%s",scelta);
			getchar();
		if(scelta[0] !='a' && scelta[0] !='b' && scelta[0]!='0')
			printf("CARATTERE ERRATO!\n");
	}while(!(scelta[0]=='a' || scelta[0]=='b' || scelta[0]=='0')); 

			if(scelta[0]=='a')
				visualizzaPazienti(lista);
			if(scelta[0]=='b')
				ricercaPaziente(lista);


}					

void visualizzaPazienti(char *lista){ // è una castronata ma il file ci da problemi con testi oltre e meno di 7 caratteri

	Paziente paz;
	FILE *fp;
	

	fp=fopen(lista,"r");
	printf("CODICE\tNOME\t\t\tCOGNOME\t\t\tCODICE FISCALE\n\n");
	do{
		
		fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
		if(strlen(paz.nome)<8){
			if(strlen(paz.cognome)<8)
				printf("%d\t%s\t\t\t%s\t\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
			else
				printf("%d\t%s\t\t\t%s\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
		}
		else 
			if(strlen(paz.cognome)<8)
				printf("%d\t%s\t\t%s\t\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
			else
				printf("%d\t%s\t\t%s\t\t%s\n",paz.codice,paz.nome, paz.cognome, paz.cf);
	}while(!feof(fp));
	ricercaPaziente(lista);
	fclose(fp);
}

int contaPazienti(char *lista){ //serve per poter associare il codice paziente ad un nuovo paziente,
									//conta quanti pazienti sono presenti così poi vado a aggiungerne uno nuovo in cont+1.
	int cont=0;
	Paziente paz;

	FILE *fp;
	fp=fopen(lista,"r");
	do{
		fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
		cont++;
	}while(!feof(fp));
	fclose(fp);
	return cont;
}

void ricercaPaziente(char *lista){
	char op[1];

	do{
		printf("\nEseguire ricerca per:\n\n");
		printf("\ta\tCODICE PAZIENTE\n");
		printf("\tb\tNOME COGNOME\n\n");
		printf("\tq\tMenù principale\n");
			scanf("%s", op);
				getchar();
				if(op[0] !='a' && op[0] !='b' && op[0]!='q')
					printf("CARATTERE ERRATO!\n");
	}while(!(op[0]=='a' || op[0]=='b' || op[0]=='q')); 
		if(op[0]=='a')
			cercaCodice(lista);
		else if(op[0]=='b')
			cercaNome(lista);
}

int cercaCodice(char *lista){
	Paziente paz;
	FILE *fp;
	int cod;

	fp=fopen(lista,"r");

		printf("INSERIRE CODICE: ");
			scanf("%d",&cod);

		do{
		fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
				if(cod==paz.codice) {
					printf("\nNOME: %s\nCOGNOME: %s\nDATA DI NASCITA (gg/mm/aaaa): %d/%d/%d\nLUOGO DI NASCITA: %s\nSESSO: %c\nC.F: %s\nCODICE: %d\n",paz.nome,paz.cognome,paz.dataNascita.giorno,paz.dataNascita.mese,paz.dataNascita.anno,paz.luogoNascita,paz.sesso,paz.cf,paz.codice);
					break;
				}
		}while(!feof(fp));

	if(!(paz.codice==cod)){
		printf("\n\nERRORE CODICE NON TROVATO!\n");          /*Se alla fine del file non ho trovato nessuno con quel codice,
															errore, altrimenti andrebbe avanti con l ultimo del file*/
		cercaCodice(lista);
			fclose(fp);
	}
	else{
		fclose(fp);
		menuImmagine(paz.percorso);
    }
}

int cercaNome( char *lista){
	Paziente paz;
	FILE *fp;
	char nom[L],cognom[L];
	int compNom,compCogn,contComp=0,save;	

	fp=fopen(lista,"r");

		printf("INSERIRE DATI:\n\n");
		printf("NOME: ");
			scanf("%s",nom);
			
		printf("COGNOME: ");
			scanf("%s",cognom);
			
		//inizia, se trova nome e cognome li stampa e continua e se ne trova ancora stampa anche quelli, ad ogni stampa un contatore aumenta,
	    // alla fine if cont=......
		do{
			fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%s\t%c\t%s\t%d\t%s\t%d\t%s\t%s\t%s\t%s\t%d\n",paz.nome,paz.cognome,&paz.dataNascita.giorno,&paz.dataNascita.mese,&paz.dataNascita.anno,paz.luogoNascita,&paz.sesso,paz.cf,&paz.idMedico,paz.res.via, &paz.res.civico, paz.res.comune, paz.res.provincia, paz.res.nazione,paz.percorso,&paz.codice);
			compNom=strcmp(cognom,paz.cognome);
			compCogn=strcmp(nom,paz.nome);				 //aggiungere anche il cognome e impara a fare doppio strcmp
				if(compNom==0 && compCogn==0) { //NON È + CARINO IF !STRCMP ?? aggiungere particolari alla stampa a video
								printf("\nNOME: %s\nCOGNOME: %s\nDATA DI NASCITA (gg/mm/aaaa): %d/%d/%d\nLUOGO DI NASCITA: %s\nSESSO: %c\nC.F: %s\nCODICE: %d\n",paz.nome,paz.cognome,paz.dataNascita.giorno,paz.dataNascita.mese,paz.dataNascita.anno,paz.luogoNascita,paz.sesso,paz.cf,paz.codice);
								save=paz.codice;
								contComp++;
				}
			
		}while(!feof(fp)); 

		printf("\nTrovati %d pazienti\n\n",contComp);
		if (contComp>1)
			cercaCodice(lista);
		else if(contComp==0){
			printf("PAZIENTE NON TROVATO!\n");
			cercaNome(lista);
		}
		else
			menuImmagine(paz.percorso);
			

	fclose(fp);
}

void menuImmagine(char *percorso){

	char op[2];

	do{
		printf("\nGESTIONE IMMAGINI:\n\n\ta\tINSERISCI\n\tb\tCERCA\n\n\tq\tMenù precedente\n");
			scanf("%s", op);
				getchar();
				if(op[0] !='a' && op[0] !='b' && op[0]!='q')
					printf("CARATTERE ERRATO!\n");
	}while(!(op[0]=='a' || op[0]=='b' || op[0]=='q')); 

		if(op[0]=='a')
			inserisciImmagine(percorso);
		if(op[0]=='b')
			visualizzaImmagine(percorso);
		
}
void inserisciImmagine(char *percorso){

	char nomeImmagine[L],nomeImmagineDaCaricare[L],percorsoLegenda[L];
	char tmp[L],legenda[L];                         						//legenda deve essere pure lei grande L perchè poi quando faccio 
																		//il for mi puo dare casini
	int i,contLen,contImm,codice,posizione;
	Data data;
	FILE *fp;

	
																	
		BMP_Image *pnt;
		BMP_Image immagine; 
		pnt=&immagine;
		printf("\nPERCORSO IMMAGINE DA CARICARE:\nes: home/Scrivania/nome-immagine\nPer spostarsi nella cartella superiore usare: ../ \n");
			scanf("%s", nomeImmagineDaCaricare);
		printf("\nNUOVO NOME IMMAGINE (preceduto da /): ");
			scanf("%s",nomeImmagine);
		printf("INSERIRE DATA ESAME\n");
		printf("MESE: ");
			scanf("%d",&data.mese);
				if(data.mese>12)
					do{
						printf("\nERRORE DATA NON VALIDA!\n");
						printf("MESE: ");
							scanf("%d",&data.mese);
					}while(!(data.mese<=12));

		printf("GIORNO: ");
			scanf("%d",&data.giorno);
				if(data.mese==11||data.mese==4||data.mese==6||data.mese==9)
					if(data.giorno>30)
						do{
							printf("\nERRORE DATA NON VALIDA!\n");
							printf("GIORNO: ");
								scanf("%d",&data.giorno);
						}while(!(data.giorno<=30));
				 if(data.mese==2)
					if(data.giorno>29)
						do{
							printf("\nERRORE DATA NON VALIDA!\n");
							printf("GIORNO: ");
								scanf("%d",&data.giorno);
						}while(!(data.giorno<=29));

				if(data.mese==1||data.mese==3||data.mese==5||data.mese==7||data.mese==8||data.mese==10||data.mese==12)
					if(data.giorno>31)
						do{
							printf("\nERRORE DATA NON VALIDA!\n");
							printf("GIORNO: ");
								scanf("%d",&data.giorno);
						}while(!(data.giorno<=31));
		printf("ANNO: ");
			scanf("%d",&data.anno);
				if(data.anno<1890 || data.anno>2012)
					do{
						printf("\nERRORE DATA NON VALIDA!\n");
						printf("ANNO: ");
							scanf("%d",&data.anno);
					}while(!(data.anno>=1890 && data.anno<=2012));
																		/*noi passiamo percorso Pazienti/paz2 , 
																		copiamo questo su tmp, poi faccio il for per copiare anche 
																		il nome del file in coda; percorso puo essere lungo
																		13 o 14 , allora contLen conta quanto è lungo e il for parte da
																		quella lunghezza, fina a un valore max di L*/

																		/*facciamo la stessa copia anche su percorsoLegenda e poi 
																		gli attacchiamo anche /Legenda così abbiamo il percorso
																		del file Legenda che sta dentro ogni cartella paz*/

		if(strlen(nomeImmagine)>L)
			printf("\nERRORE INSERIRE UN NOME PIÙ CORTO!\n");
			else  {
				strcpy(tmp,percorso);   
				strcpy(percorsoLegenda,percorso);
				strcpy(legenda,"/Legenda");
				contLen=strlen(percorso);
				for ( i = contLen; i < L;i++){
					tmp[i]=nomeImmagine[i-contLen];
					percorsoLegenda[i]=legenda[i-contLen];  
					
				}
							
					loadBMP(nomeImmagineDaCaricare ,pnt);
					saveBMP(immagine, tmp);
			}

																	/*facciamo la contapazienti che conta le righe nel file e associa a ogni
																	immagine il suo codice*/
	fp=fopen(percorsoLegenda,"a+");


		contImm=contaImmagini(percorsoLegenda);   //ci spostiamo alla fine del file ogni apertura, così se apre ed è all inizio, la seek dà 0, e allora 
										//paz.codice=contPaz cioè 1, altrimenti facciamo contPaz+1
		fseek(fp,SEEK_SET,SEEK_END);
		posizione=ftell(fp);

		if(posizione==0)     				
			codice=contImm;
		else
			codice=contImm+1;
		 

		fprintf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,data.giorno,data.mese,data.anno,codice);
		fclose(fp);

}

int contaImmagini(char *lista){ //serve per poter associare il codice paziente ad un nuovo paziente,
									//conta quanti pazienti sono presenti così poi vado a aggiungerne uno nuovo in cont+1.
	int cont=0,codice;
	char nomeImmagine[L];
	Data data;

	FILE *fp;
	fp=fopen(lista,"r");
	do{
		fscanf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,&data.giorno,&data.mese,&data.anno,&codice);
		cont++;
	}while(!feof(fp));
	fclose(fp);
	return cont;
}

void visualizzaImmagine( char *percorso){

	int codice,contLen,i;
	char nomeImmagine[L],legenda[L],percorsoLegenda[L];      

	Data data;
	FILE *fp;

	strcpy(percorsoLegenda,percorso);
	strcpy(legenda,"/Legenda");
	contLen=strlen(percorso);
				for ( i = contLen; i < L;i++)
					percorsoLegenda[i]=legenda[i-contLen]; 

		printf("\nELENCO IMMAGINI PAZIENTE\n");

		fp=fopen(percorsoLegenda,"r");
			
	fseek(fp,SEEK_SET,SEEK_END);
		if(ftell(fp)==0)                                               /*se il file fosse vuoto e stmperei il cntenuto 
																		stamperebbe numeri strani*/
			printf("NESSUNA IMMAGINE TROVATA!\n");
		else{
			fseek(fp,SEEK_SET,SEEK_SET);
			printf("\n   CODICE\tDATA\t\tNOME IMMAGINE\n\n");
											
					do{		
						fscanf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,&data.giorno,&data.mese,&data.anno,&codice);	
							printf("\t%d\t%d/%d/%d\t%s\n",codice,data.giorno,data.mese,data.anno,nomeImmagine);
					}while(!feof(fp));
			fclose(fp);
			scegliImmagine(percorsoLegenda);
		}
}

void scegliImmagine(char *percorsoLegenda){

	int codiceSelez,codice,i,contLen;
	char percorsoImmagine[L],nomeImmagine[L];
	FILE *fp;
	Data data;

	printf("INDICARE IL CODICE DELL'IMMAGINE DESIDERATA:\n");
	scanf("%d",&codiceSelez);

		fp=fopen(percorsoLegenda,"r");
		do{		
				fscanf(fp,"%s\t%d\t%d\t%d\t%d\n",nomeImmagine,&data.giorno,&data.mese,&data.anno,&codice);		
					if(codiceSelez==codice)
						break;
		}while(!feof(fp));

	if(!(codice==codiceSelez)){
		printf("\n\nERRORE CODICE NON TROVATO!\n");          /*Se alla fine del file non ho trovato nessuno con quel codice,
																errore, altrimenti andrebbe avanti con l ultimo del file*/
		scegliImmagine(percorsoLegenda);
			fclose(fp);
	}
	else{
		strcpy(percorsoImmagine,percorsoLegenda);
		contLen=(strlen(percorsoLegenda)-8);
			for ( i = contLen; i < L;i++)
				percorsoImmagine[i]=nomeImmagine[i-contLen];

		menuAnalizza(percorsoImmagine);
		
	}
}

void menuAnalizza(char *percorsoImmagine){

	char op[2];

	do{
		printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
		printf("\ta\tANALISI E RIDUZIONE GRIGI\n");
		printf("\tq\tTorna al menù principale\n");
			scanf("%s", op);
				getchar();
		if(op[0] !='a' && op[0]!='q')
					printf("CARATTERE ERRATO!\n");
	}while(!(op[0]=='a' || op[0]=='q')); 

	if(op[0]=='a')
		analisiGrigi(percorsoImmagine);
	
}

void analisiGrigi(char *percorsoImmagine){
	
	int i,j,cont=0,frequenze[DATA_DIM];
	char op[2];
	BMP_Image *pnt;
	BMP_Image immagine; 
	pnt=&immagine;

	for (i=0; i<DATA_DIM; i++)
		frequenze[i]=0;

	loadBMP(percorsoImmagine,pnt);

printf("\n\tANALISI DEI GRIGI\n");

	for (i=0; i<DATA_DIM; i++)                  /*popoliamo l'array di frequenze, ogni volta che
												incontro un pixel cn un livello di grigio aumenta di uno 
												il valore della casella dell'array frequenze nella posizione
												di quel livllo di grigio*/
		for(j=0; j<DATA_DIM; j++){

			frequenze[immagine.data[i][j].grey]++;
		}

	for (i = 0; i < DATA_DIM; i++){     /*conto i livelli di grigio, tutte le caselle dell'array 0 vengono saltate
											e aumento il contatore ogni volta che ne trovo una !=0*/
		if(frequenze[i]!=0)
		cont++;
	}


													/*se sono 10 non f analisi e riduzione e passa avanti
													altrimenti va ad analisi e riduzione*/
	if(cont==10){

		istFreq(frequenze);
		printf("\n\nNell'immagine sono già presenti %d livelli di grigio\n\n",cont);
			do{
				printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
				printf("\ta\tDEFINIRE PIXEL DI CONTORNO\n");
				printf("\tq\tTorna al menù principale\n");
					scanf("%s", op);
						getchar();
				if(op[0] !='a' && op[0]!='q')
							printf("CARATTERE ERRATO!\n");
			}while(!(op[0]=='a' || op[0]=='q')); 

		if(op[0]=='a')
			saltariduzione(frequenze,percorsoImmagine);

	}

	// RIDUZIONE A 10 LIVELLI
		else{
			printf("\nNell'immagine sono presenti %d livelli di grigio\n\n",cont);
			istFreq(frequenze);
			riduciGrigi(frequenze,percorsoImmagine);
		}

	}




void istFreq(int * frequenze){
	int i,j;
	printf("\nDISTRIBUZIONE DEI LIVELLI DI GRIGIO\n\n");
	printf("%s%13s%17s\n\n", "LIVELLO", "QUANTITA", "ISTOGRAMMA");

	for(i=0; i<DATA_DIM; i++){
		printf("%7d%13d      ", i, frequenze[i]);
		for(j=1; j<=frequenze[i]/10; j++)
			printf("*");
		printf("\n");
	}
}

void saltariduzione(int *frequenze,char *percorsoImmagine){

	int copia[DATA_DIM],massimi[DATA_DIM],livelli[9],massimipro[DATA_DIM];
	int i,j,max=0,tmp=65536;

														/* 		ordino tutti i 256 valori di freq in ordine di
																"potenza", così da poter vedere quali sono
																i grigi che predominano, il primo for
																serve a fare 256 volte il giro dell'array
																il secondo for fa il giro vero e trova il max 
																per ogni giro ricordando in tmp l'ultimo max trovato
																*/

for( i = 0; i < DATA_DIM; i++)
		copia[i]=frequenze[i];

	for ( i = 0; i < DATA_DIM; i++){
			massimi[i]=0;			
	}
	

	for(i=0; i<DATA_DIM; i++){
		max=0;
			                                               
			for (j = 0; j<DATA_DIM; j++){			
				if(copia[j]>max && copia[j]<tmp ){						
					max=copia[j];
					massimi[i]=j;										
				}
			}
			tmp=max;
	}

	for(i=0;i<10;i++)
		livelli[i]=massimipro[i];
	
	contorno(livelli,percorsoImmagine);
}

void riduciGrigi(int frequenze[],char *percorsoImmagine){		

	int massimi[DATA_DIM],massimipro[DATA_DIM],max=0,copia[DATA_DIM],tmp=65536,livelli[9];
	int i,j,cont,contapro,contloop,distanza=23,diff;
	

	

																	/* 		ordino tutti i 256 valori di freq in ordine di
																			"potenza", così da poter vedere quali sono
																			i grigi che predominano, il primo for
																			serve a fare 256 volte il giro dell'array
																			il secondo for fa il giro vero e trova il max 
																			per ogni giro ricordando in tmp l'ultimo max trovato
																			*/
																	
//TROVO I 256 GRIGI
	for ( i = 0; i < DATA_DIM; i++)
		copia[i]=frequenze[i];
	for ( i = 0; i < DATA_DIM; i++){
			massimi[i]=0;
			massimipro[i]=0;
	}
	
	

	for(i=0; i<DATA_DIM; i++){
		max=0;
			                                               
			for (j = 0; j<DATA_DIM; j++){			
				if(copia[j]>max && copia[j]<tmp ){						
					max=copia[j];
					massimi[i]=j;										
				}
			}
			tmp=max;
	}

	//DISTANZE

do{	                                                
														/*
														controllo se il primo max è il nero, e lo associo a massimipro[0];
														che è l array dove andranno i 10 grigi finali: Se si il for parte da
														1, altrimenti comincia normalmente da 0; */

		for ( i = 0; i < DATA_DIM; i++)
				massimipro[i]=0;
	if(massimi[0]==0){
			massimipro[0]=0;
			i=1;
		}
	else
		i=0;

	for(i; i<DATA_DIM; i++){

	cont=0;
													/*massimi[i] è in ordine di "potenza", lui li prende a uno a uno
														e li mette in massimipro solo se distano almeno "distanza" da tutti 
														quello gia presenti in massimipro.*/
		for(j=0; j<DATA_DIM ; j++){
			diff=massimipro[j]-massimi[i];
			if(diff<0)
				diff=-diff;
			if(diff<distanza)
				cont++;
			
		}

		

		 if (cont==0)
			massimipro[i]=massimi[i];
		else

			massimipro[i]=300;
	}

	
													/*ordino massimipro in modo da avere i nostri grigi tutti nelle prime
													 posizioni, e conto quanti sono i grigi presenti( quelli diversi da 300)
													 e impongo le condizioni su quelli: 
													 -se sono meno di dieci diminuisco "distanza" così ne trova di piu
													 -se sono di piu al contrario; */
		ordina(massimipro);
		
		contapro=0;
		contloop=0;
		for(i=0;i<DATA_DIM;i++){
			if(massimipro[i]!=300)
				contapro++;
		}

	


												/*All inizio era solo se <10 --, se >10 ++, solo che se saltava da 9 a 11
												andava in loop(ecco contloop), ora, ogni volta che arrivo a 11, contloop++
												cosi dico che sono gia passato di li una volta e agisco di conseguenza*/
		if (contapro<10)
			distanza--;
		if(contapro>10 && contloop==0){
			if(contapro==11){
				distanza++;
				contloop++;
			}
				else
					distanza++;
		}	
												/*se contloop=1 vuol dire che non riesco a trovare una distanza che mi 
												trova i 10 livelli e allora siamo costretti a approssimare e unire 2
												livelli in 1 ( dalla parte dei bianchi prendiamo gli ultimi 2, e vince il piu alto
												alla fine contapro=10 così esce dal ciclo*/
		if(contloop==1){
			contapro=10;
			if(frequenze[massimipro[10]]>frequenze[massimipro[9]]){
				massimipro[9]=massimipro[10];
				massimipro[10]=300;
			}
			else
				massimipro[10]=300;
		}
			

	}while(contapro!=10);
															/*mettiamo i 10 grigi in un array da 10 così è 
															piu semplice lavorare*/

	for(i=0;i<10;i++)
		livelli[i]=massimipro[i];

	printf("\nRIDUZIONE LIVELLI DI GRIGIO\n\n");
	printf("I 10 livelli di grigio ora sono : \n\n");
	for(i=0;i<10;i++)
		printf("%d  ",livelli[i]);
	printf("\n");

	livella(livelli,percorsoImmagine,distanza);
}

void livella(int *livelli,char *percorsoImmagine,int distanza){
																	/*per ogni punto della matrice originale,
																		controlla qual'è il grigio tra i 10 piu vicino e ci si
																		uniforma*/
	BMP_Image *pnt;
	BMP_Image immagine; 
	pnt=&immagine;

	int i,j,k,diff,contLen;
	int grigio;
	char op[2],percorsoImmagineAnalisi[L],analisi[L]={"_analisi"};

	loadBMP(percorsoImmagine,pnt);

	for(i=0; i<DATA_DIM; i++)
		for(j=0; j<DATA_DIM; j++){

			for(k=0; k<10; k++){
				diff=immagine.data[i][j].grey-livelli[k];
				if(diff<0)
					diff=-diff;
				if(diff<distanza/2)
					grigio=livelli[k];
			}

			immagine.data[i][j].grey=grigio;
		}

		strcpy(percorsoImmagineAnalisi,percorsoImmagine);
		contLen=(strlen(percorsoImmagine));
			for ( i = contLen; i < L;i++)
				percorsoImmagineAnalisi[i]=analisi[i-contLen];

	saveBMP(immagine,percorsoImmagineAnalisi);

	do{
		printf("\n\tSCEGLIERE OPERAZIONE DA ESEGUIRE\n\n");
		printf("\ta\tDEFINIRE PIXEL DI CONTORNO\n");
		printf("\tq\tTorna al menù principale\n");
			scanf("%s", op);
				getchar();
		if(op[0] !='a' && op[0]!='q')
					printf("CARATTERE ERRATO!\n");
	}while(!(op[0]=='a' || op[0]=='q')); 

	if(op[0]=='a')
		contorno(livelli,percorsoImmagine);
}


void ordina(int *arr){
	
	int i,j;

    for ( i = 1 ; i < DATA_DIM ; i++ )			
		for ( j = 0 ; j < DATA_DIM - i ; j++ )	
		{
                  if (arr[j] > arr[j + 1])		// per ogni coppia di elementi in posizioni consecutive
                      swap(&arr[j], &arr[j+1]);	// se l'elemento più a sinistra è maggiore dell'elemento più a destra, scambio la loro posizione
            
      	}

}

void swap(int *a, int *b){
	
	int tmp;	/* Variabile di supporto per salvare uno dei due valori durante lo spostamento */

	tmp=*a;
	*a=*b;
	*b=tmp;

}

void contorno(int *livelli,char *percorsoImmagine){

	char analisi[L]={"_analisi"},contorni[L]={"_contorni"},percorsoImmagineAnalisi[L],percorsoImmagineAnalisiContorni[L];
	int contLen,i,j;
	BMP_Image *pnt;
	BMP_Image immagine; 
	pnt=&immagine;

		strcpy(percorsoImmagineAnalisi,percorsoImmagine);
			contLen=(strlen(percorsoImmagine));
				for ( i = contLen; i < L;i++)
					percorsoImmagineAnalisi[i]=analisi[i-contLen];

		loadBMP(percorsoImmagineAnalisi,pnt);

		for(i=0; i<DATA_DIM; i++)
			for(j=0; j<DATA_DIM; j++){
				if(immagine.data[i][j].grey==livelli[0] || immagine.data[i][j].grey==livelli[1])
					immagine.data[i][j].grey=0;
				else
					immagine.data[i][j].grey=255;
			}

		strcpy(percorsoImmagineAnalisiContorni,percorsoImmagineAnalisi);
			contLen=(strlen(percorsoImmagineAnalisi));
				for ( i = contLen; i < L;i++)
					percorsoImmagineAnalisiContorni[i]=contorni[i-contLen];

	saveBMP(immagine,percorsoImmagineAnalisiContorni);



}
Il programma serve per poter gestire ed eseguire alcune azioni su delle immagini..

grazie mille!
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: C Errore di segmentazione

Messaggio da melfnt »

Se usi un IDE come geany, puoi cliccare due volte sull'errore per vedere a che riga è.

Comunque ci sta che sia "colpa" dei prototipi (oppure non è che in "bmp.h" ci sono funzioni con lo stesso nome, magari anche solo prototipi?)

Le funzioni cercaNome e cercaCodice cosa ritornano?

ma soprattutto: la compilazione va a buon fine?
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

Per scrivere il codice io uso Sublime text 2, che è molto comodo.
Le funzioni cercaCodice e cercaNome non ritornano niente, avevo sbagliato ora l'ho corretto, però mi resta comunque l'avviso :
multimpe definition of [..] first define here

In pratica io ho una libreria bmp.h

Codice: Seleziona tutto

// Dimensione immagine in pixel, quadrata
#define DATA_DIM 256             

//Struttura per l'header
typedef struct {
   unsigned int size;
   unsigned short int reserved1;
   unsigned short int reserved2;
   unsigned int offset;
} Header;

//Struttura per l'header info
typedef struct {
   unsigned int size;
   int width,height;
   unsigned short int planes;
   unsigned short int bits;
   unsigned int compression;
   unsigned int imagesize;
   int xresolution,yresolution;
   unsigned int ncolours;
   unsigned int importantcolours;
} Info;

//Struttura per rappresentare un pixel. Nel nostro caso solo 8 bits, un solo campo
typedef struct {
   unsigned char grey;			
} Pixel;

//Struttura immagine
typedef struct{
	unsigned char magic[2];                     //Tipo di immagine
	Header header;                              //Header
	Info info;                                  //Info header
	unsigned char color_table[DATA_DIM*4];      //Tabella colori
	Pixel data[DATA_DIM][DATA_DIM];             //Matrice di pixel   
}BMP_Image;

//Caricamento immagine
int loadBMP(char * filename, BMP_Image *img);

//Salvataggio immagine
int saveBMP(BMP_Image img, char * filename);
e un file bmp.c

Codice: Seleziona tutto

#include <stdio.h>
#include "bmp.h"

/** Funzione per caricare un'immagine BMP da file
Parametri: 
	nome del file in lettura, puntatore alla struttura in cui memorizzare i dati dell'immagine
Valore di ritorno:
	0 se il caricamento è avvenuto con successo, un numero diverso da 0 altrimenti
*/
int loadBMP(char *filename, BMP_Image *image)
{
	
	FILE *fp;

	fp = fopen(filename, "rb");
	if(fp == NULL)
	{
		printf("Error: impossibile aprire il file in lettura\n");
		return 1;
	}

	fread(image->magic, sizeof(image->magic), 1, fp );

	if(image->magic[0]!='B' || image->magic[1]!='M')
	{
		printf("Error: tipo di immagine non corretto\n");
		return 2;
	}

	fread(&image->header, sizeof(image->header), 1, fp);
	fread(&image->info, sizeof(image->info), 1, fp);

	if(image->info.bits!=8)
	{
		printf("Error: numero di bits/pixel diverso da 8\n");
		return 3;
	}

	if(image->info.width!=DATA_DIM || image->info.height!=DATA_DIM)
	{
		printf("--- Attenzione, dimensioni non corrette ---");
	}

	fread(&image->color_table, sizeof(image->color_table), 1, fp);
	fread(image->data, sizeof(image->data), 1, fp);

	fclose(fp);
	return 0;

}

/** Funzione per salvare una struttura BMP_Image su file
Parametri: 
	puntatore alla struttura da cui leggere i dati dell'immagine, nome del file su cui scrivere
Valore di ritorno:
	0 se il salvataggio è avvenuto con successo, 1 altrimenti
*/
int saveBMP(BMP_Image image, char * filename){
	
	FILE *fp2;
	fp2 = fopen(filename, "wb");

	if(fp2==NULL)
	{
		printf("Impossibile aprire il file in scrittura\n");
		return 1;
	}

	fwrite(&image.magic, sizeof(image.magic), 1, fp2);
	fwrite(&image.header, sizeof(image.header), 1, fp2);
	fwrite(&image.info, sizeof(image.info), 1, fp2);
	fwrite(&image.color_table, sizeof(image.color_table), 1, fp2);
	fwrite(image.data, sizeof(image.data), 1, fp2);

	fclose(fp2);
	return 0;

}
che usa
#include <stdio.h>
#include "bmp.h"

io nel mio file X6.c ho aggiunto "bmp.h", compila :
gcc X6.c bmp.c -o X6
ed esegue ma alla fine non termina correttamente ma restituisce:
errore di segmentazione(core dump creato)

può essere che c'è confusione tra file e librerie? (non le ho create io, mi sono state date)
inoltre mi è stato detto di includere in questo modo: #include <bmp.h> ma non riuscivo a compilare allora io ho incluso così #include "bmp.h"

idee?? :muro:
grazie mille!
Avatar utente
PsykoMantis
Prode Principiante
Messaggi: 35
Iscrizione: giovedì 14 ottobre 2010, 23:23

Re: C Errore di segmentazione

Messaggio da PsykoMantis »

mi pare ci fossero dei problemi nel linkare le librerie a volte, sembra quasi che non riconosca quello che hai incluso, ma sinceramente non li capisco e (altrettanto sinceramente) ti dico che non ho avuto la pazienza di guardare tutto il codice.
Ad ogni modo ( senza fare il finto genio e risponderti con cose che ho letto :p ) c'è già un topic dove è proposta una soluzione plausibile ti consiglio di andartelo a vedere: LINK
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

si l'avevo già visto quel topic, ho anche provato a fare quello ke dicono li ma niente.... :hypno:
Avatar utente
Marcico
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 22 febbraio 2012, 10:02
Distribuzione: Ubuntu 12.04 LTS x86_64
Località: Milano

Re: C Errore di segmentazione

Messaggio da Marcico »

Grazie a tutti per l'aiuto, sono riuscito a risolvere il problema. C'erano dei problemi con dei char..
:ciao:
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti