IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

C4047 : Incompréhensible


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut C4047 : Incompréhensible
    Salut à tous,

    Je ne comprends pas l'erreur C4047 que me renvoie mon compilateur avec cette fonction sur la ligne de comparaison en gras

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int Comparaison(char* Nom,char* Code)
    {
        int i,j;
        printf("\n%s    %c\n",Nom,Code);
        for (i=0;i<nb_max;i++ )
        {
            if (strcmp(Pelm[i].nom,Nom)==0 && strcmp(Pelm[i].code,Code)==0)
            {
                return i;
            }
        }
        return -1;
    }

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par chental
    Salut à tous,
    Je ne comprends pas l'erreur C4047 que me renvoie mon compilateur avec cette fonction sur la ligne de comparaison en gras
    Alors je cherche l'erreur C4047... Ah oui, c'est en rapport avec la remarque C231...

    [EDIT]
    D'ailleurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\n%s %c\n",Nom,Code);
    le %c avec un type char* n'est pas vraiment recommandé...

    et si on avait la déclaration de Pelm (donc la structure...) ce serait aussi un +
    [/EDIT]

    Jc

    PS : Le message d'erreur en complet serait plus sympa non ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut erreur complète
    L'erreur complète est : C4047 : 'function ' : 'const char *' differs in levels of indirection from 'char'

  4. #4
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par chental
    Salut à tous,

    Je ne comprends pas l'erreur C4047 que me renvoie mon compilateur avec cette fonction sur la ligne de comparaison en gras

    int Comparaison(char* Nom,char* Code)
    {
    int i,j;
    printf("\n%s %c\n",Nom,Code);
    for (i=0;i<nb_max;i++ )
    {
    if (strcmp(Pelm[i].nom,Nom)==0 && strcmp(Pelm[i].code,Code)==0)
    {
    return i;
    }
    }
    return -1;
    }
    Ce n'est pas incompréhensible, cela veut dire d'après MSDN que tu as des niveaux d'indirection incompatibles [Edit, Remove : (pas le même type, mais ne génère qu'un warning car il s'agit de types pointeurs)], e.g. tu donnes un char** à quelquechose qui attend un char *.

    [Edit : Je mettais mis dans la tête que ça devait générer une erreur...Ben non. A part ça, cela veut dire que tu passes un char à strcmp() qui n'attend que des const char*. Regardes bien le type des variables que tu passes à strcmp()].

    A+

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par chental
    L'erreur complète est : C4047 : 'function ' : 'const char *' differs in levels of indirection from 'char'
    Et ta déclaration de ta structure ressemble à quoi ?

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Foobar1329
    Hello,



    Ce n'est pas incompréhensible, cela veut dire d'après MSDN que tu as des niveaux d'indirection incompatibles (pas le même type, mais ne génère qu'un warning car il s'agit de types pointeurs), e.g. tu donnes un char** à quelquechose qui attend un char *.

    A+

    Je crois que c'est l'inverse ici... Un des champs Nom ou Code est sûrement de type char...

    Jc

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut Voici ma structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct  /* Déclaration de notre structure */
    {
        char nom[30];
        char code;
        int cotes[5];
    }Element;
     
    Element Pelm;
    La partie printf() fonctionne, c'est la partie strcmp qui pose problème.
    Effectivement lors de la compil., j' ai un warning donc ça passe mais à l'exécution , gros bugggggg.

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par fearyourself
    Je crois que c'est l'inverse ici... Un des champs Nom ou Code est sûrement de type char...
    EEEEEEETTTTTTTTTTTTTTTT :

    Citation Envoyé par chental
    typedef struct /* Déclaration de notre structure */
    {
    char nom[30];
    char code;
    int cotes[5];
    }Element;


    Aller, regarde le prototype de la fonction strcmp, regarde le type du paramètre Code, regarde le type de ton élément code et réfléchit...

    Jc

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut
    Citation Envoyé par fearyourself
    EEEEEEETTTTTTTTTTTTTTTT :





    Aller, regarde le prototype de la fonction strcmp, regarde le type du paramètre Code, regarde le type de ton élément code et réfléchit...

    Jc
    Ils sont tous du même type, et je ne vois aucune difference.
    Sauf que ma fonction fait appel à un pointeur d'ailleurs de m^me type.

  10. #10
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Citation Envoyé par chental
    typedef struct /* Déclaration de notre structure */
    {
    char nom[30];
    char code;
    int cotes[5];
    }Element;

    Element Pelm;

    La partie printf() fonctionne, c'est la partie strcmp qui pose problème.
    Effectivement lors de la compil., j' ai un warning donc ça passe mais à l'exécution , gros bugggggg.
    Hé bien, Pelm.code est un char. Si tu veux comparer 2 char, ce n'est pas strcmp, c'est opérateur d'égalité direct qu'il faut utiliser. En supposant que Code est aussi un char, ça doit donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!strcmp(Pelm[i].nom,Nom) && Pelm[i].code == Code) {
      /*...*/
    }
    A+

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Foobar1329
    Hé bien, Pelm.code est un char. Si tu veux comparer 2 char, ce n'est pas strcmp, c'est opérateur d'égalité direct qu'il faut utiliser. En supposant que Code est aussi un char, ça doit donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!strcmp(Pelm[i].nom,Nom) && Pelm[i].code == Code) {
      /*...*/
    }
    A+
    Pas exactement, le paramètre Code est aussi un char *... Mais je pense que si on regardait comment l'appel est fait, on remarquerait vite que le 2ème paramètre est aussi un char...

    Il faut faire un peut attention à ce qu'on fait...
    Jc

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Citation Envoyé par chental
    Ils sont tous du même type, et je ne vois aucune difference.
    Sauf que ma fonction fait appel à un pointeur d'ailleurs de m^me type.
    C'est faux : nom est un char[30], code est un char.
    Tu ne vois pas une petite différence ?

    char[30] est implicitement convertible en const char *.
    Ce n'est pas le cas de char, donc "niveaux d'indirection différents" : strcmp() demande un pointeur, tu lui passes un char.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut
    Citation Envoyé par Foobar1329
    Hé bien, Pelm.code est un char. Si tu veux comparer 2 char, ce n'est pas strcmp, c'est opérateur d'égalité direct qu'il faut utiliser. En supposant que Code est aussi un char, ça doit donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!strcmp(Pelm[i].nom,Nom) && Pelm[i].code == Code) {
      /*...*/
    }
    A+
    En effet, tu as raison par contre je devrais passer Code en valeur et non en réference.
    Là ça marche mais ça me fait perdre la portabilité.

  14. #14
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Citation Envoyé par chental
    En effet, tu as raison par contre je devrais passer Code en valeur et non en réference.
    Là ça marche mais ça me fait perdre la portabilité.
    ??? C'est quoi cette perte de portabilité ? Tu mest ton paramètre Code de ta fonction Comparaison() en char et le tour est jour. Si éventuellement Code dans Comparaison() est utilisé ailleurs, tu peux le laisser en char * en paramètre : tu vérifies que Code != NULL puis tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!strcmp(Pelm[i].nom,Nom) && Pelm[i].code == *Code) {
      /*...*/
    }
    A+

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut
    Citation Envoyé par Foobar1329
    ??? C'est quoi cette perte de portabilité ? Tu mest ton paramètre Code de ta fonction Comparaison() en char et le tour est jour. Si éventuellement Code dans Comparaison() est utilisé ailleurs, tu peux le laisser en char * en paramètre : tu vérifies que Code != NULL puis tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!strcmp(Pelm[i].nom,Nom) && Pelm[i].code == *Code) {
      /*...*/
    }
    A+
    C'est vrai t'as raison, testé et Ok.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Incompréhensible CFont ...
    Par olive_le_malin dans le forum MFC
    Réponses: 6
    Dernier message: 19/07/2004, 17h22
  2. messages incompréhensibles
    Par devalender dans le forum Outils
    Réponses: 2
    Dernier message: 06/07/2004, 16h53
  3. incompréhension avec ado
    Par Orgied dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/05/2004, 18h24
  4. [WSAD5] probleme incompréhensible
    Par capitaine_banane dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 07/04/2004, 11h56
  5. [JSP] Erreur incompréhensible
    Par xxaragornxx dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 09/09/2003, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo