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 :

Fonction inline : vec[3] que je ne comprend pas


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 67
    Points : 29
    Points
    29
    Par défaut Fonction inline : vec[3] que je ne comprend pas
    Impossible de comprendre mon résultat présent et du livre qui donne ce code...

    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
     
     
    #include <cmath>
    #include <iostream>
     
    using namespace std;
     
    inline double norme (double vec[3]);
     
    int main()
    {
        double v1[3], v2[3];
        int i;
     
        for (i = 0; i < 3; i++)
        {
            v1[i] = i; // 0.1.2.3
            v2[i] = 2*i-1; // 2*0-1. 2*1-1. 2*2-1. 2*3-1.  //1 . 1 . 3 .5
        }
        cout <<"V1 : " << norme(v1) <<endl;
        cout <<"V2 : " << norme(v2) <<endl;
    }
    inline double norme (double vec[3])
    {
        int i;
        double s = 0;
     
        for (i = 0; i < 3; i ++)
        {
            s+= vec[i] * vec[i]; //
            return sqrt(s);      //racine carée de "s"
        }
    }

    Aide moi Svp car je ne comprends pas du tout cette fonction, et mon livre ne me donne pas la même réponse que mon compilateur ... ici la résultat est V1 = 0 et V2 = 1 ... dans mon livre c'est V1 = 2.23607 et V2 = 3.31662.
    Y aurait t'il un problème de traduction dans mon livre ?

    Les commentaires c'est moi qui les ait ajouté pour comprendre les étapes de ma fonction vu que je débute ...

    Merci d'avance pou vos réponse.

    Aigle-Royal

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Réfléchis un peu

    C'est ultra-normal (je n'ai pas compilé, testé au code) : ton return est mis dans la boucle, il faut le sortir.

    La norme est la somme des carrés, donc
    • si le return est mis dans la boucle, tu ne vas traiter que le premier élément - sqrt(0 * 0) = 0 et sqrt(-1 * -1) = 1
    • si le return est mis après la boucle, sqrt((0 * 0) + (1 * 1) + (2 * 2)) = sqrt(5) = 2.23607 et sqrt((-1 * -1) + (1 * 1) + (3 * 3)) = sqrt(11) = 3,31662



    Et au passage, tes commentaires ligne 17 et 18, sur ce que contient les 2 tableaux sont erronés

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Tu dois placer l'instruction return sqrt(s); en dehors de la boucle!!!

    L'idée est bien de travailler en deux temps:
    1- tu additionne le carré de chaque élément du vecteur pour obtenir s
    2- tu renvoie la racine carrée de la somme.

    Vu que ton instruction return sqrt(s); se trouve dans la portée (comprend: entre l'accolade ouvrante et l'accollade fermante) de ta boucle, ta fonction renvoie la racine carrée de la somme lors de la première exécution de la boucle (qui n'est que ... le carré du premier terme de ton vecteur).
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 67
    Points : 29
    Points
    29
    Par défaut Réponse à Koala et Foetus
    Ok merci à vous deux.

    Foetus Je ne vois pas ou est mon erreur dans les commentaires de la ligne 17 et 18 ... en effet pour le return j'ai compris mais vu que j'ai recopier le
    code du livre je n'avais pas réfléchi à cela et à vrais dire je n'y ait pas du tout pensée pour être tout à fait honnête et si j'y avais pensée j'aurai peut-être pas compris non plus ...

    Aigle-Royal.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Aigle-Royal Voir le message
    Foetus Je ne vois pas ou est mon erreur dans les commentaires de la ligne 17 et 18 ...
    Simple ton tableau
    1. v1 contient 3 valeurs: 0, 1 et 2. Et non pas 4 valeurs: 0, 1, 2 et 3
    2. v2 contient 3 valeurs: -1, 1 et 3. Et non pas 4 valeurs: 1, 1, 3 et 5



    Et je ne suis pas sûr que la notion inline soit pertinente que ce soit le code de la fonction et surtout l'appel dans un flux.

    Si tu veux faire une fonction inline qui soit réellement inline, il faut mieux la coder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inline double norme(double vec[3]) {
        return ( sqrt((vec[0] * vec[0]) + (vec[1] * vec[1]) + (vec[2] * vec[2])) );
    }

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 67
    Points : 29
    Points
    29
    Par défaut Réponse à Foetus.
    Merci pour ta réponse.

    Je vois pour les lignes mais je ne vois pas ou va tu chercher les -1 ...

    pour ce qui est de la fonction qui n'est pas pertinente c'est fort possible mais je ne peut rien dire la dessus je ne fait que suivre le livre que j'ai mais je prend note de ta réponse car tu en sait plus que moi lol merci

    Aigle-Royal.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Aigle-Royal Voir le message
    Je vois pour les lignes mais je ne vois pas ou va tu chercher les -1 ...
    Tu calcules ((2 * i) - 1) (ligne 18)

    1. Pour i = 0, ((2 * 0) - 1) = 0 - 1 = -1
    2. Pour i = 1, ((2 * 1) - 1) = 2 - 1 = 1
    3. Pour i = 2, ((2 * 2) - 1) = 4 - 1 = 2



    Citation Envoyé par Aigle-Royal Voir le message
    pour ce qui est de la fonction qui n'est pas pertinente
    La notion inline est une indication que tu demandes au compilateur pour remplacer l'appel d'une fonction/ méthode par le code de cette fonction/ méthode.
    C'est une optimisation : tu fais 1 appel en moins (pas de changement de contexte, ...) mais la taille de ton exécutable augmente.
    Mais comme c'est une indication, c'est le compilateur qui décidera si oui ou non il va faire le remplacement.
    Et dans sa décision il regarde notamment si le code de la fonction est simple ou pas (juste un return, pas de boucles, ...)
    Il me semble que pour certains cas, le compilateur le fait automatiquement. Par exemple, lorsque tu mets le code d'une méthode directement dans la déclaration d'une classe, cette méthode est inline.

    Et mets toi à la place du compilateur lorsqu'il compile ton code : dans la ligne cout <<"V1 : " << norme(v1) <<endl;, tu lui demandes si c'est possible de remplacer norme(v1) par son code, avec notamment une boucle.
    Tu crois sérieusement qu'il va le faire ? (<- )

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 67
    Points : 29
    Points
    29
    Par défaut Réponse à Foetus.
    Merci en effet la ligne tu as raison.

    J'ai eu un petit soucis de souvenir matheux lol.. J'ai fait 2*0 = 2 (j'en était convaincu) voila pourquoi je ne trouvais pas les -1
    Mais effectivement 2*0 = 0 lol...

    Ok pour le remplacement de code je pense avoir compris ...

    Encore merci à toi Foetus à bientôt pour de nouvelles aventures lol (car il y en aura sûrement) Rire...



    Aigle-Royal

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 67
    Points : 29
    Points
    29
    Par défaut Question à Foetus
    Et mets toi à la place du compilateur lorsqu'il compile ton code : dans la ligne cout <<"V1 : " << norme(v1) <<endl;, tu lui demandes si c'est possible de remplacer norme(v1) par son code, avec notamment une boucle.
    Je n'ai pas compris vraiment remplacer norme(V1) par son code par une boucle.. tu veux dire le code que j'ai écris dans la fonction ?
    Je n'arrive pas très bien à visualisé ce que tu veux dire et me mettre à sa place ....

    Merci

    Aigle-Royal

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Aigle-Royal Voir le message
    Je n'ai pas compris vraiment remplacer norme(V1) par son code par une boucle.. tu veux dire le code que j'ai écris dans la fonction ?
    En réalité , je pense que si le compilateur rend inline ta fonction, il va utiliser une variable temporaire (ou alors s'il est très fort, il va utiliser directement le retour sans variable temporaire)
    Tu peux lire le tutoriel developpez sur les fonctions inline

    En gros lorsque tu codes ceci et comme ta fonction norme est une fonction inline
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        cout <<"V1 : " << norme(v1) <<endl;
        cout <<"V2 : " << norme(v2) <<endl;
    alors le compilateur s'il décide de rendre inline ta fonction, va compiler ceci (aux optimisation près qu'il va faire)
    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
        double s1 = 0, result1;
     
        for (int i1=0; i1 < 3; i1++) {
            s1 += (vec[i1] * vec[i1]);
        }
     
        result1 = sqrt(s1);
     
        cout << "V1 : " << result1 << endl;
     
        double s2 = 0, result2;
     
        for (int i2=0; i2 < 3; i2++) {
            s2 += (vec[i2] * vec[i2]);
        }
     
        result2 = sqrt(s2);
     
        cout << "V2 : " << result2 << endl;

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2017
    Messages : 67
    Points : 29
    Points
    29
    Par défaut Réponse à Foetus.
    Bonsoir Foetus.

    Merci pour ta réponse je vois un peu ce que tu veux dire.. Donc du coup ma fonction inline sera surcharger
    si je comprends bien vu le code que tu me montre ...


    Oui je vais aller voir la fonction inline sur le lien de tuto que ma donner merci ...

    Passe une excellente soirée..

    Aigle-Royal

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

Discussions similaires

  1. une fonction recursive que je ne comprend pas
    Par Jcpan dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2009, 13h34
  2. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  3. [PostGreSQL] une erreur que je ne comprends pas
    Par flo78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2006, 10h18
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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