[RISOLTO]C Errore di segmentazione
- 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
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!!
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.
- PsykoMantis
- Prode Principiante
- Messaggi: 35
- Iscrizione: giovedì 14 ottobre 2010, 23:23
Re: C Errore di segmentazione
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.
- 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
lo so, però il codice è giusto, dato ke sull'altro computer funziona senza problemi..
-
- 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
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 giustoMarcico ha scritto:lo so, però il codice è giusto, dato ke sull'altro computer funziona senza problemi..
"I find your lack of faith disturbing."
- 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
Interessante osservazione.... Cosa intendi esattamente con un indice che sfora?
-
- 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
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."
- 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
si anke a me, il programma e tutte le varie funzioni vanno.. quando completa l'ultima mi da l'errore..
Re: C Errore di segmentazione
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...
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...
- 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
Ricompilato più e più volte, il programma è ancora in work in progress, nn so se hai molta voglia di controllare 800 righe di codice..
Re: C Errore di segmentazione
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.
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.
- 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
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:
Io ora non sono un genio del C, cosa vuole dire con tutte quelle "multimpe definition of [..] first define here"?
il codice del programma è:
Il programma serve per poter gestire ed eseguire alcune azioni su delle immagini..
grazie mille!
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
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);
}
grazie mille!
Re: C Errore di segmentazione
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?
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?
- 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
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
e un file bmp.c
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??
grazie mille!
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);
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;
}
#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??
grazie mille!
- PsykoMantis
- Prode Principiante
- Messaggi: 35
- Iscrizione: giovedì 14 ottobre 2010, 23:23
Re: C Errore di segmentazione
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 ) c'è già un topic dove è proposta una soluzione plausibile ti consiglio di andartelo a vedere: LINK
Ad ogni modo ( senza fare il finto genio e risponderti con cose che ho letto ) c'è già un topic dove è proposta una soluzione plausibile ti consiglio di andartelo a vedere: LINK
- 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
si l'avevo già visto quel topic, ho anche provato a fare quello ke dicono li ma niente....
- 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
Grazie a tutti per l'aiuto, sono riuscito a risolvere il problema. C'erano dei problemi con dei char..
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 12 ospiti