Comparison between pointer and integer

nounou.ing -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. Krysstof Messages postés 1659 Statut Membre 295
     
    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
    1. Krysstof Messages postés 1659 Statut Membre 295
       
      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
    2. Krysstof Messages postés 1659 Statut Membre 295
       
      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
  2. 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
  3. Krysstof Messages postés 1659 Statut Membre 295
     
    as-tu bien changer
    char caractereActuel[]="";

    par : char caractereActuel="";
    0
  4. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Krysstof Messages postés 1659 Statut Membre 295
     
    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
  7. 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
  8. Krysstof Messages postés 1659 Statut Membre 295
     
    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
  9. 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
  10. Krysstof Messages postés 1659 Statut Membre 295
     
    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
  11. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   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
  12. 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
  13. 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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   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