[RISOLTO]C Errore di segmentazione

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[RISOLTO]C Errore di segmentazione

Messaggioda Marcico » domenica 10 giugno 2012, 15:30

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
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64

Re: C Errore di segmentazione

Messaggioda PsykoMantis » domenica 10 giugno 2012, 23:10

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
PsykoMantis Non specificato
Prode Principiante
 
Messaggi: 35
Iscrizione: ottobre 2010

Re: C Errore di segmentazione

Messaggioda Marcico » lunedì 11 giugno 2012, 9:44

lo so, però il codice è giusto, dato ke sull'altro computer funziona senza problemi..
Avatar utente
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64

Re: C Errore di segmentazione

Messaggioda 1001001 » lunedì 11 giugno 2012, 18:46

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 :)
1001001 Maschile
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1070
Iscrizione: dicembre 2010
Località: Verona
Distribuzione: Ubuntu 12.04.4 LTS 64bit
Desktop: Unity

Re: C Errore di segmentazione

Messaggioda Marcico » lunedì 11 giugno 2012, 22:37

Interessante osservazione.... Cosa intendi esattamente con un indice che sfora?
Avatar utente
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64

Re: C Errore di segmentazione

Messaggioda 1001001 » lunedì 11 giugno 2012, 23:19

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!!)
1001001 Maschile
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1070
Iscrizione: dicembre 2010
Località: Verona
Distribuzione: Ubuntu 12.04.4 LTS 64bit
Desktop: Unity

Re: C Errore di segmentazione

Messaggioda Marcico » martedì 12 giugno 2012, 8:53

si anke a me, il programma e tutte le varie funzioni vanno.. quando completa l'ultima mi da l'errore..
Avatar utente
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64

Re: C Errore di segmentazione

Messaggioda melfnt » martedì 12 giugno 2012, 10:28

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...
melfnt Non specificato
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 876
Iscrizione: ottobre 2011

Re: C Errore di segmentazione

Messaggioda Marcico » martedì 12 giugno 2012, 12:44

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:
Avatar utente
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64

Re: C Errore di segmentazione

Messaggioda l3on4rdo » martedì 12 giugno 2012, 16:28

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.
l3on4rdo
 

Re: C Errore di segmentazione

Messaggioda Marcico » mercoledì 13 giugno 2012, 0:10

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!
Avatar utente
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64

Re: C Errore di segmentazione

Messaggioda melfnt » mercoledì 13 giugno 2012, 8:51

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?
melfnt Non specificato
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 876
Iscrizione: ottobre 2011

Re: C Errore di segmentazione

Messaggioda Marcico » mercoledì 13 giugno 2012, 13:11

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
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64

Re: C Errore di segmentazione

Messaggioda PsykoMantis » mercoledì 13 giugno 2012, 14:00

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
PsykoMantis Non specificato
Prode Principiante
 
Messaggi: 35
Iscrizione: ottobre 2010

Re: C Errore di segmentazione

Messaggioda Marcico » mercoledì 13 giugno 2012, 14:03

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

Re: C Errore di segmentazione

Messaggioda Marcico » venerdì 15 giugno 2012, 11:43

Grazie a tutti per l'aiuto, sono riuscito a risolvere il problema. C'erano dei problemi con dei char..
:ciao:
Avatar utente
Marcico Maschile
Prode Principiante
 
Messaggi: 111
Iscrizione: febbraio 2012
Località: Milano
Distribuzione: Ubuntu 12.04 LTS x86_64


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 1 ospite