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 :

Vector de function


Sujet :

C++

  1. #1
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut Vector de function
    Bonjour,

    J’essaie actuellement de créer un vector contenant des fonction d'une classe.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef float64 (DataReader::*getFonction)();
     
    std::vector<getFonction> vec;
    std::vector<getFonction>::iterator it;
     
    vec.push_back(&DataReader::getLa);
    vec.push_back(&DataReader::getLon);
     
    for(it = vec.begin(); it<vec.end(); it++)
    	std::cout << *it << std::endl;
    Les fonction "get..." (non static) doivent retournées des valeurs stocke sur des ressources partagées et déjà initialisées.
    Mais voilà, elles me retournent uniquement la valeurs '1'.

    Une idée?

  2. #2
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Bonjour,

    Qu'attend tu en sortie ?

    Ici Il est implicitement converti en bool.

  3. #3
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    J'attends en sortie un float.
    Les valeurs attendues sont: 80 & 60

  4. #4
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Ici dans ton exemple en sortie tu as juste une représentation du pointeur de fonction , qui est implicitement convertie en booléen et la sortie vaut 1 parce qu'il n'est pas null .

    Si tu veux appeler la fonction et avoir valeur de retour en sortie, tu as besoin de l'appeler sur une instance :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DataReader reader;
     
    for(it = vec.begin(); it<vec.end(); it++)
        std::cout << (reader.*(*it))() << std::endl;

  5. #5
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Ha ok merci,

    Par contre le compilo m'insulte méchamment:
    J'ai instancier ma classe comme suite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataReader* R_Ptr = new DataReader();
    et modifier la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << (R_Ptr->*it)() << std::endl;
    Ps: Même chose si je fais en instance

  6. #6
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Citation Envoyé par Hyssgrif Voir le message
    Ha ok merci,

    Par contre le compilo m'insulte méchamment:
    J'ai instancier ma classe comme suite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataReader* R_Ptr = new DataReader();
    et modifier la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << (R_Ptr->*it)() << std::endl;
    regarde au dessus j'ai mis à jour le code pour l'affichage

  7. #7
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Si tu utilises C++11, peut-être mieux adapté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    using getFunction = std::function<leap::float64(DataReader&)>;
     
    std::vector<getFunction> vec;
    std::vector<getFunction>::iterator it;
     
    vec.emplace_back(&DataReader::getLa);
    vec.emplace_back(&DataReader::getLon);
     
    DataReader reader;
    for(it = vec.begin(); it<vec.end(); it++)
        std::cout << (*it)(reader) << std::endl;

  8. #8
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Erff, je ne suis pas sur C++11.
    Par contre j'utilise la lib boost.

    Pour le moment je récupère un fatal error.
    Unknown type


  9. #9
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Je reposte mon code en entier avec le fatal error lors de l'exécution:

    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
     
     
    	DataReader* R_Ptr = new DataReader();
     
     
    	typedef float64 (DataReader::*getFonction)();
     
    	std::vector<getFonction> vec;
    	std::vector<getFonction>::iterator it;
     
    	vec.push_back(&DataReader::getLa);
    	vec.push_back(&DataReader::getLon);
     
    	for(it = vec.begin(); it<vec.end(); it++)
    	{
    		std::cout << (R_Ptr->*(*it))() << std::endl;
    	}

  10. #10
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Une idée?

  11. #11
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    J'ai pris ce code, j'ai créé une structure DataReader toute con:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct DataReader
    {
    	float getLa()
    	{
    		return 1.0f;
    	}
    	float getLon()
    	{
    		return 2.0f;
    	}
    };
    Et ça s'exécute sans soucis. Le problème ne vient pas de là.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  12. #12
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    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.

  13. #13
    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
    float ou float64? Il faudrait savoir...
    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.

  14. #14
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Hum, en effet je confirme, ça marche bien dans mes tests.
    Ci joint le code teste de mon programme (version simplifié)

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    #include <iostream>
    #include <vector>
    using namespace std;
     
    struct Data
    {
    	float La;
    	float Lon;
    };
     
    class DataWriter
    {
    public:
    	DataWriter(){};
    	~DataWriter();
     
    	void setLa(Data &a,float La){a.La = La;}
    	void setLon(Data &a,float Lon){a.Lon = Lon;}
     
    };
     
    class DataReader
    {
    public:
    	DataReader(Data &a){this->data = &a;};
    	~DataReader();
     
    	float getLa(){return data->La;}
    	float getLon(){return data->Lon;}
     
    private:
    	Data* data;
    };
     
    int main() {
     
    	Data a;
    	DataReader* R_Ptr = new DataReader(a);
    	DataWriter* W_Ptr = new DataWriter();
     
    	W_Ptr->setLa(a,5);
    	W_Ptr->setLon(a,9);
     
    	typedef float (DataReader::*getFonction)();
     
    	std::vector<getFonction> vec;
    	std::vector<getFonction>::iterator it;
    	getFonction test = (&DataReader::getLa);
     
    	vec.push_back(&DataReader::getLa);
    	vec.push_back(&DataReader::getLon);
     
    	for(it = vec.begin(); it < vec.end(); it++)
    	{
    		test = *it;
    		std::cout << (R_Ptr->*(test))();
    		std::cout << std::endl;
    	}
     
    	W_Ptr->setLa(a,20);
    	W_Ptr->setLon(a,30);
     
    	for(it = vec.begin(); it < vec.end(); it++)
    	{
    		test = *it;
    		std::cout << (R_Ptr->*(test))();
    		std::cout << std::endl;
    	}
     
    	return 0;
    }
    Valeurs retournées:
    5
    9
    20
    30

  15. #15
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Voici une base pour commencer, J'initialise un vecteur avec des valeurs de 0~9 et je le parcours dans une boucle pour afficher chaque valeur.

    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
    #include <iostream>
    #include <vector>
     
    int main ()
    {
      std::vector<int> myvector (10);   // init de mon vecteur d'une taille de 10
     
      // Ajout de valeur à mon vecteur:
      for (unsigned i=0; i<myvector.size(); i++)
        myvector.at(i)=i;
     
      std::cout << "myvector contient les valeurs suivantes:";
      for (unsigned i=0; i<myvector.size(); i++)
        std::cout << ' ' << myvector.at(i);
      std::cout << '\n';
     
      return 0;
    }

  16. #16
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Yop, j'avais laissé pas mal d'erreur dans mon poste précédant, je l'ai modifié.
    Maintenant ça marche mais pas pour mon application cible.

  17. #17
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Si cela fonctionne c'est cool après concernant ton appli cible ça j'ai envie de dire que c'est un autre soucis.

  18. #18
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Je pense que le problème vient de l'appli qui est destinée à du système embarquée.
    Appli qui se base sur la lib boost et qui a pour cible un boitier (ARM) sur linux (version simplifié).

  19. #19
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    qu'elles sont les erreurs lorsque tu l’exécute sur ton appli cible ?

  20. #20
    Membre très actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par défaut
    Je récupère comme erreur:

    fatal error in "...": unknown type

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. str::tr1::function dans std::vector
    Par Klaim dans le forum SL & STL
    Réponses: 2
    Dernier message: 25/06/2008, 14h19
  2. [POSTGRESQL] exec function
    Par peuh dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/05/2003, 15h15
  3. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01
  4. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  5. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37

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