Comparison between pointer and integer

[Fermé]
Signaler
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
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;

}

12 réponses

Messages postés
1483
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
285
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
Messages postés
1483
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
285
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
Messages postés
1483
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
285
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);
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);
Messages postés
1483
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
285
as-tu bien changer
char caractereActuel[]="";

par : char caractereActuel="";
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é
Messages postés
1483
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
285
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.
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 .
!!!!!!!
Messages postés
1483
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
285
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);
} 
même avec cette solution l'erreur reste .
incompatible types in assignment pour
motAct = strcat(motAct,tempchaine);
et
motAct =strcat(motAct,tempchaine);
Messages postés
1483
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
285
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)
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 776
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é ?
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;

}
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.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 776
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