[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
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
A voir également:
- [C]erreur de compilation et segmentation faul
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 1001 outlook - Accueil - Bureautique
- Erreur 38 free ✓ - Forum Mobile
- Erreur 3005 france tv - Forum TV & Vidéo
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 ;-)
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 ;-)
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
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
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
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
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 :
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.
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.