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 :

Multiplier deux std::chrono::high_resolution_clock::duration ne compile pas. :/


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut Multiplier deux std::chrono::high_resolution_clock::duration ne compile pas. :/
    Tout est dans le titre :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Time operator* (Time left, Time right) {
            Time time;
            time.time = std::chrono::high_resolution_clock::time_point(left.time.time_since_epoch() * right.time.time_since_epoch());
            return time;
    }

    Peut être devrais-je essayer de modifier et recompiler la STL..., car, tout n'est peut être pas encore implémenté...

    Pourtant dans le doc il est mit que cet opérateur existe.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    Peut être devrais-je essayer de modifier et recompiler la STL..., car, tout n'est peut être pas encore implémenté...

    Pourtant dans le doc il est mit que cet opérateur existe.
    Relis la doc : multiplication entre duration et un nombre, pas entre 2 durations (ce qui n'aurait pas de sens)

  3. #3
    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
    analogie géographique?
    3m * 3m = 9 m², ce n'est plus une distance
    "Cathédrale Notre Dame, Paris, France" * "Cathédrale Notre Dame, Paris, France" n'a même pas de sens.

    Seul 2 * 3m = 6m a un sens.

    D'un point de vue mathématique (parce que j'ai donné la physique dans ton autre question): il faut distinguer le vecteur du point, et comprendre quelles sont les seuls opérations valides.
    • point + vecteur = point
    • vecteur + vecteur = vecteur
    • vecteur - vecteur = vecteur
    • vecteur * réel = vecteur
    • vecteur / réel = vecteur
    • point - point = vecteur
    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

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ha ok.

    J'ai compris! Merci!

    PS : ça date de tellement loin la physique.

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    PS : ça date de tellement loin la physique.
    Citation Envoyé par Lolilolight Voir le message
    Un étudiant je ne suis pas sûr qu'il aie une maîtrise totale des mathématiques, de la physique, et de la programmation comme moi.
    No comment...

  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 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    Peut être devrais-je essayer de modifier et recompiler la STL..., car, tout n'est peut être pas encore implémenté...
    Je comprends même pas pourquoi tu perds encore du temps à faire du C++ en fait. Puisque c'est toujours la faute du langage ou du compilo quand tu as un problème, inventes ton propre langage et ton propre compilo à ce stade..

    Citation Envoyé par Lolilolight Voir le message
    Pourtant dans le doc il est mit que cet opérateur existe.
    La doc n'indique aucune multiplication entre 2 std::chrono::duration.
    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
    Invité
    Invité(e)
    Par défaut
    Par contre il n'y a pas de surcharge de cet opérateur pour un nombre réel. (un float)

    Je ne répondrai pas au reste, je ne comprend pas pourquoi vous perdez votre temps à me harceler.

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    C'est pas une surcharge, c'est un argument de template.
    La doc dit bien :
    arithmetic type representing the number of ticks
    Comment tu representes un nombre de ticks avec un nombre a virgule ?
    Donc cela n'a pas de sens d'avoir un opérateur * entre un float et un std::duration

    Et je ne t'ai pas harcelé, j'ai juste citer tes propres paroles. C'est pas ma faute si tu te contredit toi même.

  9. #9
    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
    Cette physique-la, ca ne remonte pas à si loin, c'est du bon sens normal.
    Demande toi ce que signifie "deux fois midi" ou encore "midi fois minuit".
    deux même "deux heures fois trois secondes".
    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

  10. #10
    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 518
    Points
    41 518
    Par défaut
    Citation Envoyé par leternel Voir le message
    analogie géographique?
    3m * 3m = 9 m², ce n'est plus une distance
    "Cathédrale Notre Dame, Paris, France" * "Cathédrale Notre Dame, Paris, France" n'a même pas de sens.

    Seul 2 * 3m = 6m a un sens.

    D'un point de vue mathématique (parce que j'ai donné la physique dans ton autre question): il faut distinguer le vecteur du point, et comprendre quelles sont les seuls opérations valides.
    • point + vecteur = point
    • vecteur + vecteur = vecteur
    • vecteur - vecteur = vecteur
    • vecteur * réel = vecteur
    • vecteur / réel = vecteur
    • point - point = vecteur
    J'ai été tenté de te moinsser, car bien que ce que tu dis soit parfaitement vrai (ce qui m'a poussé à te plussoyer, finalement), ce n'est pas pertinent à la question actuelle: Une duration est un vecteur, non un point.

    Le problème est lié au fait que multiplier deux durées est un concept qui n'a pas d'équivalent dans la vie réelle (du moins, pas celle de tous les jours):
    • longueur * longueur = aire
    • longueur / durée = vitesse
    • durée * durée = ?
    • (prixDeVente - prixDeRevient) * quantité = profit!





    Citation Envoyé par mintho carmo Voir le message
    Comment tu representes un nombre de ticks avec un nombre a virgule ?
    Donc cela n'a pas de sens d'avoir un opérateur * entre un float et un std::duration
    Ah?
    Cela n'a pas de sens de chercher à multiplier un nombre entier par, disons, 1.5? Une opération dont le résultat est, une fois sur deux, lui-même un nombre entier?
    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.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je voulais plutôt faire ceci en parlant de multiplication/division. (temps écoulé (en microsecondes) divisé par temps total)

    Mais apparemment ce n'est pas possible de le faire directement avec std::chrono::duration, même chose pour la multiplication.

    Bref j'utilise ce calcul pour effectuer des interpolations de positions dans le temps.

    De plus je ne sais pas ce qu'est un time point ni ce que ça encapsule, est ce un nombre réel ?

    Même chose en ce qui concerne la duration, j'ai essayé de convertir la duration en nombre de ticks, d'effectuer le calcul et de recréer un time_point mais le soucis c'est que à ce moment là il ne me donne la bonne durée que avec asMicroseconds().

    Bref, je m'y perd un peu, je trouve que SFML est plus simple... (même si elle est moins précise)

    PS : ou bien devrais je utiliser un double plutôt que un time_point dans ma classe Time. (Car le constructeur de time_point de high_resolution_clock n'accepte que des entiers.)

  12. #12
    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 518
    Points
    41 518
    Par défaut
    Si j'en crois cppreference, tu dois pouvoir diviser deux duration et obtenir un nombre sans unité. C'est la multiplication entre deux qui ne passe pas.
    • durée / durée = ratio
    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.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Non, ce code ne passe pas. :/

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Time operator/ (Time left, Time right) {
            Time time;
            time.time = std::chrono::high_resolution_clock::time_point(left.time.time_since_epoch() / right.time.time_since_epoch());
            return time;
    }

    Peut être devrais je déclaré time en tant que std::duration<double> ici dans ma classe Time :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::chrono::high_resolution_clock::time_point time;

    Et faire des casts. (en microseconds, en milliseconds, etc...)

    Plutôt que de faire ça :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sf::Int32 Time::asMilliseconds() {
            const std::chrono::high_resolution_clock::duration since_epoch = time.time_since_epoch();
            return std::chrono::duration_cast<std::chrono::milliseconds>(since_epoch).count();
    }

    Qui me semble pas être une si bonne idée finalement.

    Il faut voir maintenant si je pourrai convertir une unité de temps en une autre unité de temps. (microsecondes en secondes par exemple)

  14. #14
    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 518
    Points
    41 518
    Par défaut
    Attends, pourquoi cherches-tu à mettre le résultat dans un time_point? Le ratio entre deux durées n'est ni une durée, ni une date...
    En fait, même ta signature Time operator/ (Time left, Time right) bouleverse les théories communément admises, tant dans le domaine de la physique thermonucléaire que dans celui de la gynécologie dans l'espace...
    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.

  15. #15
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Cela n'a pas de sens de chercher à multiplier un nombre entier par, disons, 1.5? Une opération dont le résultat est, une fois sur deux, lui-même un nombre entier?
    Cela a un sens de multiplier un reel par 1.5, on obtient un reel ("1.5f * 3 = 4.5f" => float)
    Multiplier un dénombrable par 1.5 n'a pas forcement de sens (compte 3.5 doigts sur ta main...). Cela peut en avoir un si on définie un arrondi (c'est ce qui se passe en C++ avec "3 * 1.5f = 4" = int)
    Ici, on parle d'un nombre de "ticks" (donc ce n'est pas un nombre abstrait entier, mais bien un dénombrable), cela n'existe pas de "demi-tick", donc cela n'a pas de sens.

    Par contre, rien n'interdit de convertir un std::duration en entier ou reel et de faire ensuite la multiplication avec un reel

  16. #16
    Invité
    Invité(e)
    Par défaut
    Ok, je ferai donc la multiplication avec un réel par la suite car ma vitesse de déplacement est un nombre réel.

    Le retour de ma fonction était mauvais en effet.

    De toute façon pour passer d'une unité à une autre il suffise que je divise ou que je multiplie par 1000 pour par exemple passer de secondes (type float) en millisecondes. (type entier)

    Mais je ne pense pas que je vais faire cela et ne travailler que avec des entiers sauf pour la vitesse ou là il faut que je multiplie par un réel car les microsecondes sont des grands entier, si je ne multiplie pas par un réel pour la vitesse, je me retrouve avec un personnage qui se déplace beaucoup trop vite.

    Donc soit je retourne un nombre de secondes en convertissant le nombre de ticks renvoyer en microsecondes en nombre réel, ou bien je retourne un nombre de microsecondes que je multiplie par un réel. (Sinon la vitesse est trop élevée. :/)

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/04/2015, 20h30
  2. [PHP 5.3] multiplier deux valeurs issues d'un fichier CSV
    Par ikuzar dans le forum Langage
    Réponses: 3
    Dernier message: 05/07/2012, 16h11
  3. std::this_thread::sleep_for : erreur de compilation
    Par victor_gasgas dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2012, 15h27
  4. Multiplier deux champs
    Par diop18 dans le forum Jasper
    Réponses: 6
    Dernier message: 09/05/2009, 11h14
  5. Réponses: 1
    Dernier message: 29/03/2007, 19h17

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