Rechercher : dans
Par :

[C]erreur de compilation et segmentation faul

Dernière réponse le 9 mai 2009 à 23:41:15 linksys23, le 6 mai 2009 à 22:21:29 
 Signaler ce message aux modérateurs

Bonjour,
je développe un programme en C pour traite des images bmp, voici le code de la fonction qui plante :

void rgbSurface(FILE* surface1,unsigned int sizeFile) 
{
    char nfile[]="",buffer;
    FILE *filebmp = NULL;
    int i=0,a=0;

 printf("entrez le nom du fichier que vous voulez coller: \n");
   scanf("%s",nfile);
    filebmp = fopen(nfile,"rb+");
         printf("choisissez un facteur d'opacite entre 0 (totalement transparant) et 100 (totalement opaque) : /n");
           scanf("%d",&a); 
             a = a/100;
         fseek(surface1,0x36,SEEK_SET);
       fseek(filebmp,0x36,SEEK_SET);

 for(i=0;i<sizeFile-54;i++) 
     {
        buffer=(surface1[i]*a)+(filebmp[i]*(1-a));
        fwrite(&buffer,sizeof(BYTE),1,surface1);
     }
fclose(filebmp);
}

a la compilation j'ai cette erreur :
lecturebmp.c: In function ‘rgbSurface’:
lecturebmp.c:55: erreur: invalid operands to binary * (have ‘FILE’ and ‘int’)
lecturebmp.c:55: erreur: invalid operands to binary * (have ‘FILE’ and ‘int’)

et j'ai encore un probleme avec cette fonction :
void bmpreverse(FILE* bmpfile, unsigned int sizeFile) {

   char buffer[48] = {0};

   int i=0;



      fseek(bmpfile,0x36,SEEK_SET);
 //0x36 egal la taille de l'entete d'un fichier bmp.
for(i=0;i<sizeFile - 54;i++) {
 //54 = 0x36
      fread((long*)buffer[i], sizeof(BYTE),1,bmpfile);

      }

      fseek(bmpfile,54,SEEK_SET);

   fwrite(buffer,sizeof(char),sizeFile-54,bmpfile);




}

pour cette fonction c'est le cast qui n'est pas bon mais elle compile quand meme mais elle me fait un segmentation fault.
pouvez-vous m'aidez s'il vous plait.
Configuration: Linux
Firefox 3.0.10

Meilleures réponses pour « [C]erreur de compilation et segmentation faul » dans :
[Langage C] C/C++ Erreur de segmentation Voir Qu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...

1

loupius, le 6 mai 2009 à 22:48:58

char nfile[]="";
scanf("%s",nfile);

Là déjà, c'est sûr ça va planter. La déclaration du char est celle d'un tableau qui ne contient qu'un seul octet. Donc la saisie va forcément déborder. Il faut lui donner de l'espace mémoire !

filebmp = fopen(nfile,"rb+");
Il est bien de tester si 'filebmp' n'est pas nul.

FILE* surface1
buffer=(surface1[i] ...

N'a aucun sens. 'surface1' est un pointeur de type 'FILE'; ce n'est pas un tableau ! Il faut lire le fichier en utilisant 'fread'. De même pour 'filebmp'.

fread((long*)buffer[i], ...
Non le premier paramètre est un pointeur vers un bloc de donnée, donc: 'fread (&buffer[i], ...'.

char buffer[48];
for(i=0;i<sizeFile - 54;i++)

Il serait bon de s'assurer que 'i' n'atteindra pas 48. donc: 'for (i=0; (i<sizeFile - 54) && (i<48); i++)'.

C'est tout pour le moment ;-)

Répondre à loupius

2

fiddy, le 6 mai 2009 à 22:55:41

Salut,
Erreur d'allocation de tableau.

char nfile[]=""
Ceci crée un tabun tableau d'une case.
Ainsi lorsque tu fais un scanf("%s",nfile), chaque caractère donnera lieu à un débordement, ce qui va récrire la pile et provoquer le segfault.
=> char nfile[MAX];

buffer=(surface1[i]*a)+(filebmp[i]*(1-a));
filmbmp est de type FILE*. filmebmp[i] n'a aucun sens.
Si tu veux lire le ième caractère du fichier, tu dois passer par des fonctions de lectures.

Note : Je n'ai pas regardé le reste du code.
Cdlt
Google is your friend

Répondre à fiddy

3

 linksys23, le 9 mai 2009 à 23:41:15

Merci beaucoup a vous deux mon code compile maintenant parfaitement, mais j'ai maintenant un problème avec la variable y, en effet lorsque je l'observe avec gdb elle devrait changer de valeur a chaque tour de boucle or elle vaut -1 au premier tour et 0 pendant tous les autres pourtant je n'ai pas ce problème avec la variable x.
je ne sais pas pourquoi -1, j'ai pensé a la valeur de retour de fread(); mais bon je ne comprends pas trop pourquoi ça planterai :(
voici le code de la fonction :

int rgbSurface(FILE* surface1,unsigned int sizeFile) 
{
    char nfile[30]="",x=0,y=0,buf=0;
    FILE *filebmp = NULL;
    int i=0,a=0;
    unsigned int sizebmp2=0;

printf("entrez le nom du fichier que vous voulez coller: \n");
       scanf("%s",nfile);
filebmp = fopen(nfile,"rb+");
          if(filebmp==NULL)
              return 0;

      sizebmp2=readSizeFi(filebmp);
printf("choisissez un facteur d'opacite entre 0 (totalement transparant) et 100 (totalement opaque) : /n");
        scanf("%d",&a); 
               a = a/100;

       fseek(surface1,0x36,SEEK_SET);
       fseek(filebmp,0x36,SEEK_SET);
for(i=0;i<sizebmp2-54;i++) 
     {
        fread(&x,sizeof(BYTE),1,surface1); //x change de manière normal a chaque tour de boucle .
        fread(&y,sizeof(BYTE),1,filebmp); //y lui vaut -1 au premier tour puis 0 a chaque autre.
                buf=(x*a)+(y*(1-a));
        fwrite(&buf,sizeof(BYTE),1,surface1);
     }
fclose(filebmp);
return 0;
}

je devrai peut être tester la valeur de retour des fonctions fread mais même si c'est vraiment la le problème je ne saurais pas le résoudre :-( est ce que vous pouvez m'éclaircir sur ce problème. merci en avance =p.

Répondre à linksys23