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 :

Comment declarer une map


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut Comment declarer une map
    Bonjour,

    Je suis newbies et j'ai un soucis pour déclarer une map .

    Voici ce que j'ai fais d'apres ce que j'ai trouvé sur le Web :

    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
    int main() {
        std::map<float, float> mappy;
        float measX;
        float measY;
        float measZ;
        float xAng, yAng, zAng;
     
        int X = 0, Y = 0, Z = 0;
     
        int minVal = 265;
        int maxVal = 402;
     
        while(1) {
     
            measX = analog_X.read(); // Converts and read the analog input value (value from 0.0 to 1.0)
            measY = analog_Y.read(); 
            measZ = analog_Z.read(); 
     
    //convert read values to degrees -90 to 90 - Needed for atan2
            xAng = mappy(measX , minVal, maxVal, -90, 90);
            yAng = mappy(measY, minVal, maxVal, -90, 90);
            zAng = mappy(measZ, minVal, maxVal, -90, 90);
     
            X = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
            Y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
            Z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);
     
            printf("x:  %.0f  | y: %.0f  | z: %.0f \r", X, Y, Z );

    J'applique ce code sur une board où est connecté un pointeur 3D.
    J'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error: Call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type in "main.cpp", Line: 47, Col: 17
    sur les 3 calculs d'angle.
    J'ai apparemment mal déclarer un objet mais je ne sais pas lequel.

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    C'est laquelle, la ligne 47 ???

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    20, 21, 22 j'imagine. Std::map ne possède pas d'opérateur parenthésé, mais je ne comprends ce qu'est sensé faire le code... ?

  4. #4
    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
    Si t'as trouvé ça sur le web mappy(measX , minVal, maxVal, -90, 90), change de web.
    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.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    20, 21, 22 j'imagine. Std::map ne possède pas d'opérateur parenthésé, mais je ne comprends ce qu'est sensé faire le code... ?
    Merci de m'avoir répondu et le premier degrés :-)

    J'avais prévenu je suis newbie. C'est assez simple, il mesure une entrée en volts et la converti en degrée suivant la valeur de la tension measX, measY ou measZ dans le code.
    Voici la doc Arduino ici mais ma board est une Nucleo STM32 et utilise C++ comme langage de programmation

    Ou pourrais je trouver de la documentation pour faire le map et tableau de hachage en C++?

    D'avance merci

  6. #6
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Bonjour,

    Connais tu exactement le role d'un std::map en C++ ? Ce n'est pas un objet pour du calcul géométrique mais un conteneur de type tableau associatif. Il sert à stocker des objets (dans ton cas de type float) identifié par une clef (ici également de type float).

    Ton erreur proprement dite vient de ce que dans map, il n'y a pas d'opérateur ainsi défini : float map::operator() (float, float, float, int, int);

    Tu n'as apparemment pas compris le rôle de map et tu tentes de l'utiliser d'une façon qui n'a rien à voir avec sa fonction.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    la documentation se trouve sur des sites de "référence".
    personnellement, j'utilise cppreference.com, mais il existe aussi cplusplus.com.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Dans le billet de blog que tu cites, voici ce que je trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //convert read values to degrees -90 to 90 - Needed for atan2
      int xAng = map(xRead, minVal, maxVal, -90, 90);
      int yAng = map(yRead, minVal, maxVal, -90, 90);
      int zAng = map(zRead, minVal, maxVal, -90, 90);
    map est ici une fonction ou un objet-fonction mais ledit billet ne semble pas préciser sa définition. Seule certitude, ce n'est pas un std::map
    -- Yankel Scialom

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par prgasp77 Voir le message

    map est ici une fonction ou un objet-fonction mais ledit billet ne semble pas préciser sa définition. Seule certitude, ce n'est pas un std::map
    Merci PrGasp,

    Je vois que je ne suis pas dans un bonne approche. En fait dans la page, je pesais que la personne essayait de faire un tableau de correspondance entre le mouvement en G, l'angle et le niveau de tension mesurée.

    Je vais donc bosser la dessus en restant ouvert à tous vos conseils.
    Encore merci

  10. #10
    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
    Btw, une map avec une clé en float, c'est sûrement le meilleur moyen de ne jamais retrouver son entrée.
    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.

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Btw, une map avec une clé en float, c'est sûrement le meilleur moyen de ne jamais retrouver son entrée.
    remarque très pertinente, il y a un problème de conception ici.
    Effectivement utiliser un std :: map avec comme clé une variable de type float n'a pas de sens...
    on utilise en général une chaine de caractère car l'intérêt d'une std :: map est de fonctionner comme un dictionnaire.
    Citation Envoyé par dubis Voir le message
    Ou pourrais je trouver de la documentation pour faire le map et tableau de hachage en C++?
    utiliser une std :: map avec comme clé une valeur numérique n'a aucun sens...puisqu'une valeur numérique varie par définition.
    Contrairement à une chaîne de caractère ou un charactère par exemple si tu déclares une std :: map <std :: string, std :: string > tu peux faire un dictionnaire de données et associer "maison" à "house" en anglais.

    Pour des valeurs numériques à ce moment là utiliser un std :: vector ou bien voir dans boost s'il y a un conteneur plus pertinent avec des tableaux tridimensionnels pour stocker des vecteurs 3d.
    Citation Envoyé par dubis Voir le message
    J'ai l'erreur suivante :
    sur les 3 calculs d'angle.
    J'ai apparemment mal déclarer un objet mais je ne sais pas lequel.
    pour accéder un élément d'une std :: map on utilise des crochets comme pour un tableau.
    En utilisant des parenthèses le compilateur interprète cela comme instancier un objet de type mapy et fait appel au constructeur.
    Il faudrait revoir les bases du C++, comprendre la notion de constructeur /destructeur etc...il y a certainement de bons tutos sur DVP

    Si tu veux utiliser un std :: map pour stocker des acquisitions alors on peut utiliser par exemple la date/heure d'acquisition en concaténant les deux
    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
     
    class vector3d
    {private :
    float x;float y ; float z;
    public:
    vector3d();
    };
    std::map<std::string,vector3d> mpVectors3d;
    //.....acquisition des données
    std::string strTime=get_time();
    std::string strDate=get_date();
    std::string strKey=strDate + "-" + strTime;
    //puis appeler la méthode insert pour remplir le std::map
     
    }
    pour les fonctions du temps voir les fonctions standards du C ou C++

  12. #12
    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 Mat.M Voir le message
    utiliser une std :: map avec comme clé une valeur numérique n'a aucun sens...puisqu'une valeur numérique varie par définition.
    Euh.. Gni ?
    Avoir un entier en clé ne pose pas de problème, et est loin de n'avoir aucun sens.
    Quant à la variation d'une valeur numérique.. const int value = 12; ne va pas beaucoup varier, mais c'est pourtant une valeur numérique.
    Le vector c'est gentil, à condition d'avoir bien (quasi) tous les index utiles, et qu'ils soient pas trop gros. Si c'est pour stocker 1, 5, 156 et 198756, ça sert à rien.
    Le problème c'est bien le float, et dans une moindre mesure le double, à cause de toutes les approximations qu'on lui connait.
    Une map est un tableau associatif, le dictionnaire n'en est qu'un cas particulier, et certainement pas la seule utilisation.
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2007, 14h08
  2. comment declarer une variable de type date ?
    Par MAJIK_ENIS dans le forum JDBC
    Réponses: 1
    Dernier message: 26/05/2006, 00h02
  3. Comment declarer une fonction ou procedure globale
    Par manubrard dans le forum Langage
    Réponses: 8
    Dernier message: 21/02/2006, 14h21
  4. Réponses: 3
    Dernier message: 15/12/2005, 22h04
  5. Comment déclarer une variable globale
    Par davkick dans le forum C
    Réponses: 13
    Dernier message: 20/05/2005, 18h50

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