Overflow in implicit constant conversion: Veut dire?
Bonjour, j'écris une fonction qui lit du "faux hexa" dans un fichier texte. Le 1er hexa étant la taille. Mais j'ai quelque problème lors de la compilation:
Je vous 2 possibles erreurs, ma ligne:
if(c>='A' || c<='F') c=('F'-'lettre'+15);
Mais je ne vois pas comment faire autrement.
et mon fwrite (qui est le 1er que je fait donc surement une erreur)
fwrite(lettre, 1 * sizeof(int), 1, fichier_Bin);
J'ai poster l'intégralité du code au cas où mais je suppose que seul les 2 lignes cité contiennent une erreur. J'ai lu de la docu sure le fwrite mais je suis pas sur de ma ligne
Je vous 2 possibles erreurs, ma ligne:
if(c>='A' || c<='F') c=('F'-'lettre'+15);
Mais je ne vois pas comment faire autrement.
et mon fwrite (qui est le 1er que je fait donc surement une erreur)
fwrite(lettre, 1 * sizeof(int), 1, fichier_Bin);
lab.c:45: warning: overflow in implicit constant conversion lab.c:69: warning: passing arg 1 of 'fwrite' makes pointer from integer without a cast lab.c:87: error: parse error at end of input
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#define fichierTexteHexa "hexa2.txt"
#define fichierBinaire "fichier.dat"
#define fichieTexte "fichier.txt"
/**
* Pré:
* @param fichierBin contier l'adresse d'un fichier binaire
* @param fichierHex contient un ficher texte contenant de l'hexadecimal
* Post:
* @param fichierBin contiendra l'hexa traitée
* @param fichierHex est inchangé
**/
void HexaToBin(char * fichierBin, char * fichierHex){
FILE * fichier_Bin;
//on ouvre le fichier binaire pour y écrire si il y a quelque chose on écrase les info
if ((fichier_Bin = fopen(fichierBin,"wb"))==NULL) {
perror("Write ");
exit(1);
}
FILE * fichier_Hex;
//on ouvre le fichierHex pour lire les info dedans
if ((fichier_Hex = fopen(fichierHex,"r"))==NULL) {
perror("Read ");
exit(1);
}
int taille=0,i=0,j=0;
char c;
/*temps que on n'as pas atteint la fin du fichier on lit*/
while(c!=EOF){
c=fgetc(fichier_Hex); //on lit le charactère où se trouve le pointeur dans le fichier
if(c>='A' || c<='F') c=('F'-'lettre'+15); //on transforme les lettres en chiffres
if(i<2){ //les 2 premiers char donne la taille de la ligne
taille=taille+c;
i++;
}
if(i==2){
int test_pair=taille%2; //on vérifie si la ligne contient un nombre paire ou impair de char
if(test_pair==1) taille--;
}
if(i==2){
int lettre;
int l;
while(j<taille){
lettre=fgetc(fichier_Hex);
if (l<2){
lettre=lettre+c;
l++;
if(l==1) lettre=lettre*16;
}
if (l==2){
//fwrite(fichier_Bin,"%d",lettre);
fwrite(lettre, 1 * sizeof(int), 1, fichier_Bin);
l=0;
lettre=0;
}
j++;
i=0;
}
}
}
int main (void){
printf("Travail n°4, en C\n");
HexaToBin(fichierBinaire,fichierTexteHexa);
return 0;
}
J'ai poster l'intégralité du code au cas où mais je suppose que seul les 2 lignes cité contiennent une erreur. J'ai lu de la docu sure le fwrite mais je suis pas sur de ma ligne
3 réponses
-
J'ai corriger encore de nombreuse erreur mais voila que je boucle sans arrêt alors j'ai ajouter une modification pour finir mais toujours rien dans mon fichier.txt
Pourtant ca devrait enregistrer mais j'ai un problème avec la lecture de taille rien n'y fait j'ai des problèmes partout:
taille 1/taille 2/ligne, 119J vaut 2taille 5/ligne, 102J vaut 2ligne, 238J vaut 4ligne, 34J vaut 6taille 0/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 119J vaut 6taille 8/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 102J vaut 6ligne, 221J vaut 8ligne, 119J vaut 10ligne, 0J vaut 12ligne, 102J vaut 14taille 12/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 34J vaut 6ligne, 0J vaut 8ligne, 119J vaut 10ligne, 51J vaut 12ligne, 102J vaut 14ligne, 153J vaut 16ligne, 102J vaut 18ligne, 221J vaut 20ligne, 119J vaut 22ligne, 0J vaut 24ligne, 102J vaut 26taille 12/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 34J vaut 6ligne, 238J vaut 8ligne, -833J vaut 10ligne, -833J vaut 12ligne, -833J vaut 14ligne, -833J vaut 16ligne, -833J vaut 18ligne, -833J vaut 20ligne, -833J vaut 22ligne, -833J vaut 24ligne, -833J vaut 26ligne, -833J vaut 28ligne, -833J vaut 30ligne, -833J vaut 32ligne, -833J vaut 34ligne, -833J vaut 36ligne, -833J vaut 38taille -49/b
#include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> #define fichierTexteHexa "hexa2.txt" #define fichierBinaire "fichier.dat" #define fichierTexte "fichier.txt" /** * Pré: * @param fichierBin contier l'adresse d'un fichier binaire * @param fichierHex contient un ficher texte contenant de l'hexadecimal * Post: * @param fichierBin contiendra l'hexa traitée * @param fichierHex est inchangé **/ void HexaToBin(char * fichierBin, char * fichierHex){ FILE * fichier_Bin; //on ouvre le fichier binaire pour y écrire si il y a quelque chose on écrase les info if ((fichier_Bin = fopen(fichierBin,"wb"))==NULL) { perror("Write "); exit(1); } FILE * fichier_Hex; //on ouvre le fichierHex pour lire les info dedans if ((fichier_Hex = fopen(fichierHex,"r"))==NULL) { perror("Read "); exit(1); } int taille=0,i=1,j=0; int c; /*temps que on n'as pas atteint la fin du fichier on lit*/ while(c!=EOF){ c=fgetc(fichier_Hex); //on lit le charactère où se trouve le pointeur dans le fichier if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres else c=c-'0'; if(i=1){ //les 2 premiers char donne la taille de la ligne taille*16; i++; } if(i==2){ taille=taille+c; int test_pair=taille%2; //on vérifie si la ligne contient un nombre paire ou impair de char if(test_pair==1) taille--; printf("taille %d\n",c); if (c==-49) c=EOF; int lettre; int l=1; int temp; while(j<taille){ lettre=fgetc(fichier_Hex); j++; if(lettre>='A' && lettre<='F') lettre=lettre-'A'+10; else lettre=lettre-'0'; if(l==1) { temp=lettre*16; l++; } if (l==2){ lettre=lettre+temp; fwrite(&lettre, 1 * sizeof(int), 1, fichier_Bin); printf("ligne, %d",lettre); l=1; lettre=0; } j++; printf("J vaut %d",j); i=0; } j=0; } } fclose(fichier_Hex); fclose(fichier_Bin); } /** * Pré: * @param fichierBin contier l'adresse d'un fichier binaire remplie * @param fichierTxt contient un ficher texte vide où remplie (mais sera écraser); * Post: * @param fichierBin est inchangé * @param fichierTxt contiendra du texte **/ void BinToTexte(char * fichierBin, char * fichierTxt){ FILE * fichier_Bin; //on ouvre le fichier binaire pour lire le contenu if ((fichier_Bin = fopen(fichierBin,"rb"))==NULL) { perror("Read "); exit(1); } FILE * fichier_Txt; //on ouvre le fichierTexte pour y écrire if ((fichier_Txt = fopen(fichierTxt,"w"))==NULL) { perror("Write "); exit(1); } int lettre; while (fread(&lettre,sizeof(int),1,fichier_Bin)){ //fwrite(&lettre, 1 * sizeof(int), 1, fichier_Txt); //fprintf(fichier_Txt,%c,lettre); fread(&lettre, 1 * sizeof(int), 1, fichier_Txt); } fclose(fichier_Txt); fclose(fichier_Bin); } int main (void){ printf("Travail n°4, en C\n"); /* conversion faux hexadecimal en binaire */ HexaToBin(fichierBinaire,fichierTexteHexa); /* Conversion binaire en texte lisible */ BinToTexte(fichierBinaire,fichierTexte); return 0; }-
vu que je peux pas modifier mon dernier post (pas trouver pourquoi) j'ai décider de refaire tout ma procédure a zéro car a force de modifier comme un cochon je m'y retrouvais plus.
J'ai réussi a écrire dans le .dat des plus bizarre les uns que les autres mais je n'ai aucune idée si cela est normal. Par contre rien ne s'écrit dans mon .txt et sa m'empèche de vérifier si la 1er procédure est just ou fausse. Si vous avez une idée je suis tout ouïe
#include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> #define fichierTexteHexa "hexa1.txt" #define fichierBinaire "fichier.dat" #define fichierTexte "fichier.txt" void HexaToBin(char * fichierBin, char * fichierHex){ FILE * fichier_Bin; //on ouvre le fichier binaire pour y écrire si il y a quelque chose on écrase les info if ((fichier_Bin = fopen(fichierBin,"wb"))==NULL) { perror("Write "); exit(1); } FILE * fichier_Hex; //on ouvre le fichierHex pour lire les info dedans if ((fichier_Hex = fopen(fichierHex,"r"))==NULL) { perror("Read "); exit(1); } int temp=0, c; c=fgetc(fichier_Hex); //on vérifie en 1er si le fichier est vide if(c!=EOF){ //si il ne l'est pas on commence a calculer la taille if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres else c=c-'0'; temp=c*16; } int taille=0, i=1; char sortir='n'; /*temps que on n'as pas atteint la fin du fichier on lit*/ while(c!=EOF && sortir=='n'){ while(i<2){ //On regarde la taille de la ligne c=fgetc(fichier_Hex); //on lit le charactère où se trouve le pointeur dans le fichier i++; if(c==EOF) sortir='o'; if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres else c=c-'0'; if (i==1) temp=c*16; else { taille=temp+c; int test_pair=taille%2; //on vérifie si la ligne contient un nombre paire ou impair de char if(test_pair==1) taille--; } } i=0; while(i<taille && sortir=='n'){ c=fgetc(fichier_Hex); //on lit le charactère où se trouve le pointeur dans le fichier i++; if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres else c=c-'0'; if (i==1) temp=c*16; else { temp=temp+c; fwrite(&temp, 1 * sizeof(int), 1, fichier_Bin); } } i=0; } fclose(fichier_Hex); fclose(fichier_Bin); } /** * Pré: * @param fichierBin contier l'adresse d'un fichier binaire remplie * @param fichierTxt contient un ficher texte vide où remplie (mais sera écraser); * Post: * @param fichierBin est inchangé * @param fichierTxt contiendra du texte **/ void BinToTexte(char * fichierBin, char * fichierTxt){ FILE * fichier_Bin; //on ouvre le fichier binaire pour lire le contenu if ((fichier_Bin = fopen(fichierBin,"rb"))==NULL) { perror("Read "); exit(1); } FILE * fichier_Txt; //on ouvre le fichierTexte pour y écrire if ((fichier_Txt = fopen(fichierTxt,"w"))==NULL) { perror("Write "); exit(1); } int lettre; while (fread(&lettre,sizeof(int),1,fichier_Bin)){ fread(&lettre, 1 * sizeof(int), 1, fichier_Txt); } fclose(fichier_Txt); fclose(fichier_Bin); } int main (void){ printf("Travail n°4, en C\n"); /* conversion faux hexadecimal en binaire */ HexaToBin(fichierBinaire,fichierTexteHexa); /* Conversion binaire en texte lisible */ BinToTexte(fichierBinaire,fichierTexte); return 0; } -
ContributeurPourquoi faire appel à des headers non standards ? Sachant que tu ne les utilises pas (genre : #include <sys/wait.h>, mais c'est pas la seule).
Ensuite, mets plutôt exit(EXIT_FAILURE) que exit(1);
Attention, dans les if : if(i=1) => if(i==1) vérifie s'il n'y a pas d'autres erreurs de ce style. -
pour les bibli on ne les à pas étudier je sais l'utilité de quelque une d'entre elle mais pas de tous. J'ai supprimer celle que tu ma dis mais pour les autres je ne sais pas.
j'ai aussi modifier les exit(1); mais pourquoi faut il plutot utiliser EXIT_FAILURE ?
Sinon pas moyen de trouver le if qui contient une erreur. -
-
ContributeurJ'ai supprimer celle que tu ma dis mais pour les autres je ne sais pas.
Tu peux supprimer également :
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
mais pourquoi faut il plutot utiliser EXIT_FAILURE ?
EXIT_FAILURE correspond à la valeur attendue pour indiquer que cela s'est mal déroulé. Dans certains cas (la plupart), cela vaut 1, mais pas systématiquement.
Pour le reste, je sens que tu vas devoir reposter ton code avec les modifications que tu as faites et sur la bonne version.
Courage, tu es sur la bonne voie ;-).
-