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

Langage C++ Discussion :

<thread> erreur: ne peut convertir «*int*» en «*void (*)()*»


Sujet :

Langage C++

  1. #1
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut <thread> erreur: ne peut convertir «*int*» en «*void (*)()*»
    Bonjour,

    J'ai cette erreur en incluant Ogre.h.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dans le fichier inclus depuis /usr/include/c++/12/thread:43,
                     depuis [..]/Ma/code/modules/ma/ogre/include/Ogre/Ogre.h:14,
                     depuis [..]/Ma/code/modules/ma/ogre/src/View.cpp:14:
    /usr/include/c++/12/bits/std_thread.h: Dans le constructeur «*std::thread::thread(_Callable&&, _Args&& ...)*»:
    /usr/include/c++/12/bits/std_thread.h:165:13: erreur: ne peut convertir «*int*» en «*void (*)()165 |             __depend);
          |             ^~~~~~~~
          |             |
          |             int
    J'utilise gcc 12.3.0 et je compile mon code avec la norme c++17.

    J'ai dû mal à savoir par quel bout prendre cette erreur.
    J'ai l'impression que cette erreur est apparue quand le système est passé à gcc 12 mais je n'en suis pas sûr et même si c'est vrais, je ne vois pas pourquoi l'inclusion de <thread> pourrait causer cette erreur.
    J'ai l'impression qu'une option de compilation ou quelque chose d'autre en amont a été déclaré et fait capoter l'inclusion de <thread>. Si c'est le cas, ça va être dur de trouver l'origine.

    À noter que la compilation de la librairie d'Ogre ne pose aucun soucis.

    Auriez-vous une idée par quel bout je dois commencer.

    Merci

    Voici le morceau de code qui génère cette erreur:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #ifdef _GLIBCXX_HAS_GTHREADS
        template<typename _Callable, typename... _Args,
    	     typename = _Require<__not_same<_Callable>>>
          explicit
          thread(_Callable&& __f, _Args&&... __args)
          {
    	static_assert( __is_invocable<typename decay<_Callable>::type,
    				      typename decay<_Args>::type...>::value,
    	  "std::thread arguments must be invocable after conversion to rvalues"
    	  );
     
    #ifdef GTHR_ACTIVE_PROXY
    	// Create a reference to pthread_create, not just the gthr weak symbol.
    	auto __depend = reinterpret_cast<void(*)()>(&pthread_create);
    #else
    	auto __depend = nullptr;
    #endif
    	using _Wrapper = _Call_wrapper<_Callable, _Args...>;
    	// Create a call wrapper with DECAY_COPY(__f) as its target object
    	// and DECAY_COPY(__args)... as its bound argument entities.
    	_M_start_thread(_State_ptr(new _State_impl<_Wrapper>(
    	      std::forward<_Callable>(__f), std::forward<_Args>(__args)...)),
    	    __depend); /// <—————————————————————————————————L'erreur vient d'ici.
          }
    #endif // _GLIBCXX_HAS_GTHREADS
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je comprends votre confusion et je dois dire que moi même, je l'ai été, en voyant une telle erreur. L'erreur se situe bien au niveau de votre code et vraisemblablement, lors de l'utilisation des threads (de std::thread). C'est que votre appel à std::thread n'est pas correct, ce qui déclenche une erreur qui n'est découvert par le compilateur, que lors du traitement de l'entête (à cause des template). Autrement dit, regarder votre appel, il semble que vous passiez un int alors que la bibliothèque attend un pointeur de fonction.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Merci beaucoup.

    Je n'utilise que les mutex dans mon code incriminé (la partie API). Les threads sont utilisés par Criterion qui lance les tests unitaires sur l'API en multi-thread.
    Le code qui échou ne dépend que de l'API, d'Ogre et de wxWidgets. Dans ces deux dernières librairies, il peut très bien avoir du code qui utilise std::thread.

    Le code de std::thread qui échoue (std_thread.h), indique que le compilateur à choisi d'utilisé GTHR_ACTIVE_PROXY, afin d'utiliser le pthread_create habituel. Si j'ai bien compris, en fonction des plateformes on peut souhaiter utiliser un autre pthread_create, genre sur Androïd.
    M_start_thread est défini ainsi, thread::_M_start_thread(unique_ptr<thread::_State>, void (*)())
    Le deuxième paramètre est bien du même type que __depend : void(*)()
    Pourtant à la compilation il indique bien qu'un int ne peut être converti automatiquement en void(*)()

    C'est bizarre car si c'est l'autre cas, c'est à dire quand GTHS_ACTIVE_PROXY n'est pas utilisé, __depend serait du type std::nullptr_t et non int. Je ne vois pas comment __depend peut être du type int.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifdef GTHR_ACTIVE_PROXY
    	// Create a reference to pthread_create, not just the gthr weak symbol.
    	auto __depend = reinterpret_cast<void(*)()>(&pthread_create);  // le code passe par là.
    #else
    	auto __depend = nullptr;
    #endif
    	using _Wrapper = _Call_wrapper<_Callable, _Args...>;
    	// Create a call wrapper with DECAY_COPY(__f) as its target object
    	// and DECAY_COPY(__args)... as its bound argument entities.
    	_M_start_thread(_State_ptr(new _State_impl<_Wrapper>(
    	      std::forward<_Callable>(__f), std::forward<_Args>(__args)...)),
    	    __depend);// <—— Échoue ici
          }
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  4. #4
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Bon je viens de voir mes erreurs. Des erreurs toutes simples.

    Première erreur de ma part:
    C'est bien auto __depend = nullptr; qui est utilisé.

    Deuxième erreur:
    Mon code date, ou du moins ma conception des choses.
    Du coup j'ai un fichier Prerequisites.h qui vérifie si nullptr existe bien, sinon il le redéfinie de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifndef nullptr
    #	define nullptr 0
    #endif

    La boulette.


    J'ai d'abord essayer ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifndef nullptr
    #	define nullptr std::nullptr_t()
    #endif
    Mais j'ai trouvé ça bête, car ça veux dire que #ifndef nullptr ne fonctionne pas. Bein oui nullptr est un mot clef et non pas une définition (comme il était à une certaine époque .
    Du coup j'ai viré c'est trois lignes et tout fonctionne .

    Aaa j'ai été formé au c++ avant le c++11, j'ai des vieux réflexes tout pourris. :p
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

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

Discussions similaires

  1. convertir int en Object et int en char
    Par djanos dans le forum Langage
    Réponses: 5
    Dernier message: 24/02/2007, 18h58
  2. Convertir int en chaîne de caractère
    Par be_tnt dans le forum Réseau
    Réponses: 44
    Dernier message: 25/04/2006, 15h35
  3. erreur ASM inline sur 'INT' avec delphi7
    Par the_magik_mushroom dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2005, 01h41
  4. [threading][logging] erreur de loggage dans un thread
    Par Guigui_ dans le forum Général Python
    Réponses: 5
    Dernier message: 12/10/2005, 15h01
  5. [Conversion]convertir int[] en bytes[]
    Par tony_big_guy dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2005, 15h47

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