[C]erreur de compilation et segmentation faul

Fermé
linksys23 Messages postés 133 Date d'inscription samedi 16 février 2008 Statut Membre Dernière intervention 30 décembre 2010 - 6 mai 2009 à 22:21
linksys23 Messages postés 133 Date d'inscription samedi 16 février 2008 Statut Membre Dernière intervention 30 décembre 2010 - 9 mai 2009 à 23:41
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.
A voir également:

3 réponses

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 ;-)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
6 mai 2009 à 22:55
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
0
linksys23 Messages postés 133 Date d'inscription samedi 16 février 2008 Statut Membre Dernière intervention 30 décembre 2010 27
9 mai 2009 à 23:41
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.
0