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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 émérite

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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

  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 émérite

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    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
    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
    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.

  7. #7
    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.)

  8. #8
    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
    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.

  9. #9
    Membre émérite

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    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

  10. #10
    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. :/)

  11. #11
    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
    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.

  12. #12
    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.

  13. #13
    Membre émérite

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    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.

  14. #14
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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".

+ 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