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

Visual C++ Discussion :

visual confond les bool et les int


Sujet :

Visual C++

  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut visual confond les bool et les int
    Bonjour a tous.

    Il m'arrive un truc cocasse. je programme en C++ sur visual 2005.
    je crée une fonction qui retourne un bool
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool myFunc()
    {
      return true;
    }
    je l'appelle (sans même recuperer la valeur de retour)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
    myFunc();
    return 0;
    }
    et au linkage, visual me retourne une erreur:
    unresolved external symbol "int _cdecl myFunc(void)" blablabla
    Si je change ma fonction pour qu'elle retourne un int:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int myFunc()
    {
      return true;
    }
    Il y a plus de problème...

    J'imagine qu'il y a un truc bizarre dans mes options de projet mais je sais pas quoi. Quelqu'un a une idée? merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Salut,
    T'es sur que tu fais pas du C? ton projet c'est bien un projet C++?

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Et si c'est bien du C++ : Peut-on voir la déclaration de la fonction en question, si sa définition n'est pas dans le même fichier source ?
    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.

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    c'est bien du C++.
    Je code sur une machine qui n'as pas acces à internet donc je peux pas copier-coller ici... c'est pourquoi j'ai d'abord réduit au strict minimum.
    La fonction est declarée ainsi (dans un fichier tools.h séparé):
    Elle est définie ainsi: (dans un fichier tools.cpp qui inclut le tools.h)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool isBigEndian()
    {
      int i = 0x00000001;
      char c = *(reinterpret_cast<char*>(&i));
      return !!c;
    }
    Dans le fichier qui contient le main, j'inclus tools.h et j'apelle simplement la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
      //...
      isBigEndian(); //pour tester
      //...
      retrun 0;
    }
    si je remplace le mot-clé bool par int dans les fichier tools.h et tools.cpp, ça marche.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    J'ai jamais vu ca:
    c'est quoi(double !!)?

  6. #6
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    ben !x ça retourne 1 si x vaut 0, et 0 si x vaut "tout sauf 0"
    donc !!x ça retourne 0 si x vaut 0, et 1 si x vaut "tout sauf 0"

    en gros, ça te permet de transformer un entier en une valeur qui ne peut être que 0 ou 1. Si tu veux, ça ramène les entiers non nuls sur 1.
    c'est vrai que ici c'est pas franchement utile, mais j'ai essayé en changeant cette ligne par:
    et par:
    et par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return static_cast<bool>(c);
    ça change rien...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Ok tout simplement! C'est bien ce que pensai mais je trouvai ca bizarre autant pour moi.

    Sinon tu dis que tu inclus tools.h mais tools.cpp il est aussi inclus dans ton projet? je veux dire tools est pas dans une lib?

  8. #8
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    non il est aussi inclus.

    entre-temps, j'ai reussi à resoudre le problème, mais j'ai pas compris comment:

    j'inclus deux fichiers: serial.h et tools.h. J'ai juste changé pour inclure tools.h avant serial.h, et maintenant ça marche...
    Par contre j'ai beau chercher dans serial.h, je ne vois pas ce qui pose problème... (je cherche un [extern "C"] ou un [typedef bool int], mais rien qui ressemble à ça...)
    mais bon. pour l'instant ça fonctionne. Merci de m'avoir répondu!
    a+

  9. #9
    Membre éclairé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Par défaut
    A mon avis le problème est que tu renvoies soit 0 soit 1, donc de type int, et que ta fonction est définie pour renvoyer un booléen ...

    Sinon un petit cast du !!c dans le return devrait éviter à Visual de confondre un booléen qu'il attend en retour avec un int que tu lui envoies

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/12/2011, 17h48
  2. Quelles sont les différences entre les types char et int ?
    Par RayBradbury dans le forum Débuter
    Réponses: 3
    Dernier message: 27/03/2011, 16h10
  3. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06

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