Comparison between pointer and integer

nounou.ing -  
fiddy Messages postés 11653 Statut Contributeur -
salut :)
Quand je compile ce code source avec DevC ++, il m'indique cette erreur là "comparison between pointer and integer "
y a-t- il qcq qui peut m'aider
ce code permet de partager un fichier ( chaque ligne contient un seul mot) en 4 nouveau fichier selon la langueur du mot
voila le code:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define f "french_wordlist_sans_accent.txt"

int main ( int argc, char argv[ ] )
{
FILE* fichier5 = NULL;
FILE* fichier6 = NULL;
FILE* fichier7 = NULL;
FILE* fichier8 = NULL;
FILE* fichier;
char caractereActuel[]="";
char motAct[]="";

fichier = fopen (f,"r");
fichier5 = fopen ("mot5.txt", "a+");
fichier6 = fopen ("mot6.txt", "a+");
fichier7 = fopen ("mot7.txt", "a+");
fichier8 = fopen ("mot8.txt", "a+");


if ((fichier = fopen (f,"r")) == NULL)
{
printf("ERREUR");
fprintf(stderr, "\n Erreur: Impossible de lire le fichier f %s\n",f);
return(EXIT_FAILURE);
}
caractereActuel == fgetc(fichier);
while (caractereActuel != "\n")

motAct =strcpy(motAct,caractereActuel);

switch (strlen(motAct))
{
case 5: fputs(motAct, fichier5);
printf("\n");
break;

case 6: fputs(motAct, fichier6);
printf("\n");
break;

case 7: fputs(motAct, fichier7);
printf("\n");
break;

case 8: fputs(motAct, fichier5);
printf("\n");
break;
default:
printf("ERROR\n");
break;

}
fclose(fichier);
fclose(fichier5);
fclose(fichier6);
fclose(fichier7);
fclose(fichier8);
return 0;

}
A voir également:

12 réponses

Krysstof Messages postés 1659 Statut Membre 294
 
char caractereActuel[]=""; >> ca c'est une tableau de char


caractereActuel == fgetc(fichier); >> ca c'est un bug car == c'est une test, pas une affectation


donc char caractereActuel="";
et caractereActuel = fgetc(fichier);

ca devrait marcher mieux
0
Krysstof Messages postés 1659 Statut Membre 294
 
ah oué, tant que j'y pense ton code ne marchera pas après car tu lis caracatère à caractère avec "fgetc", donc ton code ne me parait pas valable derriere
0
Krysstof Messages postés 1659 Statut Membre 294
 
rah, mais en lisant mieux ca peut pas du tout marcher ... tu lis une premiere fois avec fgetc, mais dans ton while tu ne list pas la suite, donc ta boucle sera infini

caractereActuel =fgetc(fichier);
while (caractereActuel != "\n")
{
motAct =strcat(motAct,caractereActuel);
caractereActuel =fgetc(fichier);
}

tu remarquera strcat a la place de strcpy, pour concatener tous les caractere lu un a un


tu peux aussi remplacer tout ca par

motAct = fgets(fichier);
0
nounou.ing
 
Merci bien Krysstof , très gentil .
j'ai remplacé le test par une affectation et strcpy par strcat mais ça n'a pas encore marché.
De nouveau il m'indique cette erreur là " incompatible types in assignment "
dans ces deux ligne

caractereActuel = fgetc(fichier);

motAct = strcat(motAct,caractereActuel);
0
Krysstof Messages postés 1659 Statut Membre 294
 
as-tu bien changer
char caractereActuel[]="";

par : char caractereActuel="";
0
nounou.ing
 
salut.
je n'est changée ce que tu viens d'indiquer car si je fais ce changement , il aura ces erreurs là

" initialization makes integer from pointer without a cast" pour char caractereActuel="";

" comparison between pointer and integer" pour caractereActuel != "\n"

"passing arg 2 of 'strcat' makes pointer from integer without a cast " et "incompatible types in assignment "
pour motAct = strcat(motAct,caractereActuel); e

donc le changement effectue plus de difficulté
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Krysstof Messages postés 1659 Statut Membre 294
 
bon, c vrai que j'ai pas expliqué en détail ... fgetc(); renvoie une variable de type char

un char est un entier sur 8 bits (de 0 a 255)

on représente un caractere soit en mettant un chiffre, soit le caractere entre simple quote
donc

" initialization makes integer from pointer without a cast" pour char caractereActuel="";
== > caractereActuel=''; (pas "")

"comparison between pointer and integer" pour caractereActuel != "\n"
==> caractereActuel != '\n'



ensuite les fonctions strcpy, strcat, etc... sont des fonctions de chaine de caractere
une chaine de caractere est en fait un pointeur vers un tableau de char

donc si tu déclare une variable de type char, tu ne peux pas utiliser les fonctions de chaine directement dessus.


la malheureusement j'ai un trou de mémoire : comment transformer un char en en string... (ca fait 8 ans que j'ai pas fait de pointeur en c :) )

donc pour
"passing arg 2 of 'strcat' makes pointer from integer without a cast " et "incompatible types in assignment "
pour motAct = strcat(motAct,caractereActuel); e

essaye

motAct = strcat(motAct,&caractereActuel)

le & collé au nom de la variable représente le pointeur vers la variable.
0
nanou.ing
 
malgres que j'ai remplacé
caractereActuel=""; par caractereActuel=''; (pas "")
et motAct = strcat(motAct,caractereActuel); par
motAct = strcat(motAct,&caractereActuel)
il affiche cette erreur : incompatible types in assignment.
malgres que tu m'indiquer que le & ajouter va elever cette erreur .
!!!!!!!
0
Krysstof Messages postés 1659 Statut Membre 294
 
comme je disais ca fait super longtemps que j'ai pas programmé en C...

on va essayer ca :

//déclaration
char caractereActuel='';
char tempchaine[1]="";

//transformation du char en string (char *)
tempchaine[0] = caractereactuel;

//concaténation des 2 chaines
motAct = strcat(motAct,tempchaine) 



c'est pas tres propre, mais comme cela tu es sur que tu converti le caractere seul en une chaine de caractere contenat ce caractere...

ca donnerait ca avec la boucle

caractereActuel =fgetc(fichier);
while (caractereActuel != '\n')
{
    tempchaine[0] = caractereactuel;
    motAct =strcat(motAct,tempchaine);
    caractereActuel =fgetc(fichier);
} 
0
nanou.ing
 
même avec cette solution l'erreur reste .
incompatible types in assignment pour
motAct = strcat(motAct,tempchaine);
et
motAct =strcat(motAct,tempchaine);
0
Krysstof Messages postés 1659 Statut Membre 294
 
hum... redonne ton code complet avec les dernière modification s'il te plait, car la je comprends pas...

(pense à utiliser les balises de code en appuyant sur le petit bouton en haut du message "<>" a droite des boutons B I S)
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Bonjour,

J'ai survolé de très haut, mais, il y a une erreur ici en tout cas :
motAct = strcat(motAct,tempchaine);

motAct est défini comment ? Pointeur ou tableau ? Est-il alloué ?
0
nounou.ing
 
c mon code source

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define f "french_wordlist_sans_accent.txt"

int main ( int argc, char argv[ ] )
{
FILE* fichier5 = NULL;
FILE* fichier6 = NULL;
FILE* fichier7 = NULL;
FILE* fichier8 = NULL;
FILE* fichier;
char caractereActuel = '';
char motAct[] ="";
char tempchaine[1]="";

//transformation du char en string (char *)
tempchaine[0] = caractereActuel;

//concaténation des 2 chaines
motAct = strcat(motAct,tempchaine);

fichier = fopen (f,"r");
fichier5 = fopen ("mot5.txt", "a+");
fichier6 = fopen ("mot6.txt", "a+");
fichier7 = fopen ("mot7.txt", "a+");
fichier8 = fopen ("mot8.txt", "a+");


if ((fichier = fopen (f,"r")) == NULL)
{
printf("ERREUR");
fprintf(stderr, "\n Erreur: Impossible de lire le fichier f %s\n",f);
return(EXIT_FAILURE);
}
// motAct = fgets(fichier);
//caractereActuel = fgetc(fichier);

caractereActuel =fgetc(fichier);
while (caractereActuel != '\n')
{
tempchaine[0] = caractereActuel;
motAct =strcat(motAct,tempchaine);
caractereActuel =fgetc(fichier);
}


// while (caractereActuel != '\n')
// motAct = strcat(motAct,&caractereActuel);

switch (strlen(motAct))
{
case 5: fputs(motAct, fichier5);
printf("\n");
break;

case 6: fputs(motAct, fichier6);
printf("\n");
break;

case 7: fputs(motAct, fichier7);
printf("\n");
break;

case 8: fputs(motAct, fichier5);
printf("\n");
break;
default:
printf("ERROR\n");
break;

}

fclose(fichier);
fclose(fichier5);
fclose(fichier6);
fclose(fichier7);
fclose(fichier8);
return 0;

}
0
nounou.ing
 
Salut,
Merci pour votre participation dans la résolution de mon problème.
char motAct[] =""; tableau de caractere.
il n'est pas alloué. on n'a pas besoin de faire une allocation.
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
il n'est pas alloué. on n'a pas besoin de faire une allocation.
Ben si justement. Cette déclaration permer d'allouer statiquement. Dans votre exemple, vous allouez un tableau d'un caractère dans la pile qui contiendra le caractère '\0'. En gros, une chaîne inutile.

char tempchaine[1]="";
Même remarque.

int main ( int argc, char argv[ ] )
C'est char *argv[] ou char **argv, mais pas char argv[]. Il s'agit d'un pointeur sur des chaînes de caractères.

char caractereActuel = '';
Il faut mettre un caractère entre les crochets. Sinon le compilateur ne pourra pas initialisé avec le code ascii correspondant.

tempchaine[0] = caractereActuel;
Comme dit plus haut, le problème est que vous allez écrire sur le caractère '\0', qui est obligatoire pour finir une chaîne. D'autant plus que vous utilisez strcat qui se base dessus.
Il faudrait donc allouer un caractère de plus dans le tableau. Soit : char tempchaine[2]="";

motAct = strcat(motAct,tempchaine);
Vous utilisez mal la fonction. strcat(motAct, tempchaine) suffit. Cela concatène en écrivant à l'adresse pointée par le pointeur motAct. En plus, attention motAct comme le tableau tempchaine n'est pas assez grand. La taille dépendra du nombre de caractères que vous souhaitez mettre dedans. On se sert de la valeur de renvoie notamment dans les boucles while pour tester si strcat ne renvoie pas NULL.


Bon et j'arrête là, car ça vous fera déjà pas mal de points à revoir.
Sinon pourquoi n'utilisez vous pas la fonction fgets qui fait toute votre moulinette fgetc + la condition sur le '\n' de fin de ligne ? Si c'est à titre d'entrainement, autant se la recoder et se faire une fonction que répéter tous ses blocs faux. Cela augmentera la lisibilité du programme, et sa maintenabilité.

Si vous avez des questions, n'hésitez pas.

Bonne chance,
Cordialement
0