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 :

error: conflicting types for 'impairr'


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 62
    Points : 43
    Points
    43
    Par défaut error: conflicting types for 'impairr'
    bonjour , j'ai un problème avec un code sources j'ai cette erreur en intitulé ,quels conflit de types ???

    pourriez vous m'aider please ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #include <stdbool.h>
    #include <stdio.h>
    bool pairr(int n){
        if(n==0){
            printf("true");
            return true ;
        }
        return impairr(n);
    }
    bool impairr(int n){
    if(n==0){
            printf("false");
            return false ;
        }
        return pairr(n);
    }
    Nom : error_conflict_type.PNG
Affichages : 639
Taille : 52,2 Ko

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu actives les warnings de compilation, tu auras l'explication sous la forme d'un warning:
    Citation Envoyé par gcc
    Implicit declaration of function 'impairr'
    Citation Envoyé par Microsoft Visual C++
    'impairr': Undeclared, assuming extern returning 'int'.
    Tu dois déclarer ta fonction avant de l'utiliser.
    De plus, le code actuel semble présenter une récursion infinie si on lui passe n'importe quelle valeur non-nulle.
    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.

  3. #3
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Les fonctions doivent normalement exister dans le code qui précède une fonction appelante. Comme tu fais une fonction qui en appelle une autre et inversement, tu as le problème de la poule et de l'oeuf.

    Si tu veux pouvoir appeler une fonction dont le code ne figure pas avant le code de la fonction appelante (par exemple : le code est après dans le même fichier ou ailleurs dans une autre unité de compilation), le fichier compilé doit avoir au moins accès à la déclaration de son prototype avant que l'appel puisse être fait.

    Ainsi, dans ton cas, tu pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdbool.h>
    #include <stdio.h>
     
    /* prototypes */
     
    bool pairr(int n);
    bool impairr(int n);
     
    /* implémentation */
     
    bool pairr(int n){
       /* code appelant impairr() */
    }
     
    bool impairr(int n){
       /* code appelant pairr() */
    }
    Note que je ne pense pas que les fonctions fassent ce que leur nom suggère, en l'état de ton code, par exemple en appelant tes fonctions vont s'appeler l'une l'autre en une boucle infinie, en épuisant toute la mémoire de la pile d’exécution.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alex5956 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    bool pairr(int n){
        if(n==0){
            printf("true");
            return true ;
        }
        return impairr(n);
    }
    bool impairr(int n){
    if(n==0){
            printf("false");
            return false ;
        }
        return pairr(n);
    }
    Bonjour
    -Eks- a donné la bonne explication. On déclare ses fonctions avant de les appeler.

    Maintenant moi je m'interroge sur ta logique. Tu as une fonction appelée "pair()" qui teste si son argument vaut 0. Si c'est le cas, elle renvoie "vrai". Sinon elle appelle la fonction "impair()" qui, elle, teste si l'argument vaut 0 et si c'est le cas elle renvoie "faux" sinon elle appelle "pair()".
    C'est... éblouissant !!! Bon déjà parce que "0 ou pas 0" ne signifie pas (chez-moi) "pair ou impair" mais surtout parce que déjà l'argument il vaut soit 0 soit pas 0 donc s'il vaut 0 c'est un cas sinon c'est l'autre cas et pas besoin d'appeler une autre fonction pour le vérifier. Mais surtout, je m'imagine ce qui se passera si tu appelles pair(5). Et tu devrais essayer aussi de te représenter le déroulement des opérations...

    Généralement, on ne fait pas deux fonctions pour vérifier une chose et son contraire. On n'en fait qu'une seule (fonction généralement et traditionnellement nommée "is_quelquechose()") et ensuite, si on veut vérifier la chose on appelle if (is_quelquechose() == true) et si on veut vérifier son contraire on appelle if (is_quelquechose() != true). Et surtout on évite d'invoquer la récursivité pour ça d'autant plus quand c'est une récursivité non maitrisée.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    oui y a une erreur je me disais bien c 'est le prof qui a écrit ça dans le td ils s'est trompé .
    par contre ===> pour Microsoft Visual C++
    'impairr': Undeclared, assuming extern returning 'int'.
    pour quoi il veut que je la mette en extern int

    et quels rapport au final avec "un conflit de type" ?


    encore merci les gars vous me sauvez la vie !XD j'avais déclaré les proto masi dans un header pour mettre toutes les fonctions dans le main

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par alex5956 Voir le message
    pour quoi il veut que je la mette en extern int
    Il veut rien du tout, il te prévient qu'il ne connait pas ce type et qu'il suppose donc que c'est une fonction qui retourne un int.

    Citation Envoyé par alex5956 Voir le message
    et quels rapport au final avec "un conflit de type" ?
    La fonction supposée est sencée retourner un int et non un bool, il y a bien un conflit de type.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alex5956 Voir le message
    'impairr': Undeclared, assuming extern returning 'int'.
    Il faut comprendre : "impairr n'est pas déclaré, on suppose donc que c'est une fonction externe (== qui est dans un autre fichier), on suppose qu'elle renvoie 'int'. Toi, tu as lu "assuming returning extern int", ce qui n'est pas la même chose

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alex5956 Voir le message
    pour quoi il veut que je la mette en extern int
    Le compilateur considère toute fonction non déclarée comme int par défaut et c'est ce qu'il te dit ("assuming" signifie "en supposant"). Ce n'est donc pas un ordre qu'il te donne mais une action qu'il exécute et dont il t'informe.

    Citation Envoyé par alex5956 Voir le message
    j'avais déclaré les proto mais dans un header pour mettre toutes les fonctions dans le main
    Rien compris. Je comprends les mots, je vois un peu le sujet de ce dont il s'agit toutefois mettre la conjonction "mais" indiquant une opposition entre la première partie de la phrase qui parle de prototypes et sa seconde partie qui parle de headers (alors que les deux vont ensembles) tout en justifiant cette action par une explication qui n'a rien à voir (mettre toutes les fonctions dans le main) rend ta phrase incompréhensible.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    ok donc seulement MSVC m'aurait indiqué que la fonction est par défaut reconnu comme retournant un type int alors que de tte façon gcc ne me l'aurait jamais indiqué.

    je disais que j'avais mis mes proto dans mesFonctions.h et que je l'avais seulement inclut dans le main

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alex5956 Voir le message
    ok donc seulement MSVC m'aurait indiqué que la fonction est par défaut reconnu comme retournant un type int alors que de tte façon gcc ne me l'aurait jamais indiqué.
    gcc te le dit si tu le lui demandes avec l'option -Wimplicit-function-declaration (option incluse dans -Wall)

    Citation Envoyé par alex5956 Voir le message
    je disais que j'avais mis mes proto dans mesFonctions.h et que je l'avais seulement inclut dans le main
    C'est exactement comme ça qu'il faut faire (le prototype seulement, pas le code !!!)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    oui mais j'ai pas mis les proto dans le fichier.c des fonctions recursives

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

Discussions similaires

  1. [SDL 1.2] Erreur : conflicting types for SDL_main
    Par Anonyme1784 dans le forum SDL
    Réponses: 1
    Dernier message: 23/12/2015, 08h02
  2. Erreur Conflicting types for " "
    Par PoelQ dans le forum C
    Réponses: 2
    Dernier message: 20/10/2015, 09h11
  3. Réponses: 6
    Dernier message: 20/03/2015, 09h31
  4. Conflicting types for en C
    Par Kimly dans le forum C
    Réponses: 3
    Dernier message: 27/06/2012, 16h11
  5. pb de conflicting types for
    Par Fahmi06 dans le forum C
    Réponses: 1
    Dernier message: 26/12/2008, 14h26

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