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 :

comprends ce qui est dit


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2003
    Messages : 26
    Points : 18
    Points
    18
    Par défaut comprends ce qui est dit
    Salut,

    J'essaie de comprendre une ligne de code en C++ mais là j'ai du mal
    Voici ma ligne
    Les données: n et p sont des pointeurs sur des unsigned char
    Mais comme il s'agit de paramètres d'une fonction je crois qu'il s'agit de pointeurs sur le 1ier élément d'un tableau d'unsigned char.

    D'après ce que je sais quand il y a un ? on vérifie si la condition placée avant lui est vraie si oui le résultat est 0 sinon le résultat est 1.
    Problème, ici il n'y a pas de test??? moi j'aurais écris un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (*n == *p) ? 0 : 1;
    Voilà, est ce que qqu'un comprend?

  2. #2
    Membre régulier Avatar de gelam
    Profil pro
    Inscrit en
    novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : novembre 2003
    Messages : 69
    Points : 74
    Points
    74
    Par défaut
    Voilà du code qu'il est beau...
    S'il faut se predre la tête pour ce genre de chose, il est clair que la programmation est réservée à une élite.

    Dans ton cas il y utilisation de l'opérateur ternaire dont la sysntaxe est la suivante :

    expression_bool ? res_si_vrai : res_si_faux
    Ce code peut donc être traduit par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if( *p )
       *n = 0 ;
    else
       *n = 1 ;
    D'autre part l'état false est représenté par un zéro. Donc si ce qui est pointé par p vaut zéro ce qui est pointé par n sera affecté avec 1...
    Avez-vous remarqué les progrès que fait l'ignorance?
    [Tristan Bernard ]

  3. #3
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : juillet 2002
    Messages : 373
    Points : 382
    Points
    382
    Par défaut
    j'ai toujours du mal avec le "C_Men" qui se prennent pour des cadors à écrire des trucs illisibles de ce style, sous le prétexte (souvent faux) que ça fait du code plus efficace.

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Juste des parenthèses aurais suffit à expliciter le code

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : mai 2004
    Messages : 1 028
    Points : 1 121
    Points
    1 121
    Par défaut
    Il est clair que non commenté c'est une faute de goût.

    Cependant c'est plus efficace que l'équivalent if. Pourquoi : L'intégralité de l'instruction est préfécthé dans le pipeline du processeur en un seul coup. De plus, c'est un branchement cours, ça ne peut pas devenir un branchement long, donc deux fois plus rapide.

    Cependant, c'est surtout utile pour de portions de codes nécessitant de la rapidité (compression de données, très grands fichiers à traiter, automates embarqués ...)

    Citation Envoyé par tut
    j'ai toujours du mal avec le "C_Men" qui se prennent pour des cadors à écrire des trucs illisibles de ce style, sous le prétexte (souvent faux) que ça fait du code plus efficace.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2003
    Messages : 247
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par Caine
    Cependant c'est plus efficace que l'équivalent if. Pourquoi : L'intégralité de l'instruction est préfécthé dans le pipeline du processeur en un seul coup. De plus, c'est un branchement cours, ça ne peut pas devenir un branchement long, donc deux fois plus rapide.

    Un gros mouarf pour toi ;-) :


    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
    void set1 ( int* a, int* b )
    {
     
    	if( *b != 0 ) 
    00401420  mov         ecx,dword ptr [esp+8] 
    00401424  mov         edx,dword ptr [esp+4] 
    00401428  xor         eax,eax 
    0040142A  cmp         dword ptr [ecx],eax 
    0040142C  sete        al   
    0040142F  mov         dword ptr [edx],eax 
    		*a = 0 ; 
    	else 
    		*a = 1 ;
     
    }
    00401431  ret   
     
     
     
     
    void set2 ( int* a, int* b )
    {
    	*a = *b ? 0 : 1 ;
    00401440  mov         ecx,dword ptr [esp+8] 
    00401444  mov         edx,dword ptr [esp+4] 
    00401448  xor         eax,eax 
    0040144A  cmp         dword ptr [ecx],eax 
    0040144C  sete        al   
    0040144F  mov         dword ptr [edx],eax 
    }
    00401451  ret

    Faut arrèter de croire qu'un compilateur est une brèle.

  7. #7
    Membre du Club
    Inscrit en
    mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 99
    Points : 66
    Points
    66
    Par défaut
    Economie de ligne : Moins ya de ligne moins ya d erreur

    autrement ya pas d interet

    ca c est la base

  8. #8
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 356
    Points : 347
    Points
    347
    Par défaut
    Economie de ligne : Moins ya de ligne moins ya d erreur
    Va faire un tour sur http://www.ioccc.org, tu y trouveras ton bonheur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main(v,c)char**c;{for(v[c++]="Hello, world!\n)";(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+!!c,!c));**c=!c)write(!!*c,*c,!!**c);}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int _,O,__??('}'??);main(){while(O?gets((rand()%O++?':':_)+__)||puts(&__??(_??))&_:srand(time((O+++_)))||O);}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main(a,b){while((a=getchar())+1)putchar((b=64^a&223)&&b<27?a&96|(b+12)%26+1:a);}
    c'est quand même la classe
    And still we will be here, standing like statues ...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2003
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    ok, merci pour vos réponses.

    Mais j' ai encore un petit pb d'une ligne que je comprends pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void UneMegaFct(float tab[])
    {
      float* g = tab;
      *g++ = 0.0;
     
      for (int k=1;k<9;k++)
        {
           *g++ = trucbidule;
        }
    }
    En sachant que :
    De ce que je comprends, la variable g pointe sur le 1ier élément de tab.
    Donc quand on fait *g++ = 0.0 ça veut dire qu'on met la valeur 0.0 dans la case d'indice 1 de tab.
    Mais avec ce raisonnement ya un pb avec la boucle for
    quand k=1 on remplit la case d'indice 2
    quand k=8 on remplit la case d'indice 9 qui n'existe pas
    Donc il y a une err ds mon raisonnement mais où???

  10. #10
    Membre régulier
    Inscrit en
    avril 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 97
    Points : 91
    Points
    91
    Par défaut
    le premier indice d'un tableau est 0 et non 1 ... g++=postincrémentation

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2003
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    ok super

  12. #12
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Idem il aimait pas les parenthèses lui


  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2003
    Messages
    5 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : août 2003
    Messages : 5 273
    Points : 10 827
    Points
    10 827
    Par défaut
    *p++ est quand même un classique que l'on finit par savoir lire sans plus réfléchir. Mais de toutes façons, ce genre de trucs est limite à réserver à l'implémentation de fonctions assez bas niveau comme std::copy, std::fill, std::for_each, ...

    Pour ce qui est de l'opérateur ternaire, j'ai envie de dire que tout dépend de ce qui est important, dans l'algo mis en oeuvre. S'il s'agit de l'affectation, alors l'opérateur est fort pratique -- utiliser des parenthèses n'est pas forcément un luxe. Si ce qui est important c'est le test, alors un if-else est définitivement préférable.

    Soit j'aime bien écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void f(std::string const& p) {
        // option, mise à "defaut" si non initialisée
        std::string option = p.empty() ? "defaut" : p;
     
        // algo suffisament compliqué (plus de 3 lignes)
        ...
    (Je dois avouer que j'utilise plus ce genre de choses en VimL qu'en C++ (pas vraiment l'occasion de traiter des paramètres en C++))
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  14. #14
    Membre du Club
    Inscrit en
    mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 99
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par bigquick
    Economie de ligne : Moins ya de ligne moins ya d erreur
    Va faire un tour sur http://www.ioccc.org, tu y trouveras ton bonheur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main(v,c)char**c;{for(v[c++]="Hello, world!\n)";(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+!!c,!c));**c=!c)write(!!*c,*c,!!**c);}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int _,O,__??('}'??);main(){while(O?gets((rand()%O++?':':_)+__)||puts(&__??(_??))&_:srand(time((O+++_)))||O);}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main(a,b){while((a=getchar())+1)putchar((b=64^a&223)&&b<27?a&96|(b+12)%26+1:a);}
    c'est quand même la classe
    Moué mais faut pas non plus tomber dans la connerie ca sert pas a grand chose en plus. Je disais juste que moins ya de ligne moins il y a d'erreur mais pour bien comprendre il en faut quand meme un minimum

  15. #15
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 356
    Points : 347
    Points
    347
    Par défaut
    hé fallait pas mal le prendre
    c'est juste que ton post m'a fait penser à ce truc que j'avais vu il y a un moment il qui m'avait fait halluciner!
    And still we will be here, standing like statues ...

  16. #16
    Membre du Club
    Inscrit en
    mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 99
    Points : 66
    Points
    66
    Par défaut
    a je le prend vraiment pas mal ca ma fit beaucoup rire


    il y a des personnes qui n'ont rien d'autre a foutre que ca

    Allez je vais me faire un petit helloworld en une ligne

  17. #17
    Membre régulier
    Inscrit en
    avril 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 97
    Points : 91
    Points
    91
    Par défaut
    y a des bases de données qui explosent avec ce genrede discussions lol

  18. #18
    Membre éprouvé Avatar de Caine
    Inscrit en
    mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : mai 2004
    Messages : 1 028
    Points : 1 121
    Points
    1 121
    Par défaut
    Je n'ai jamais dit que tous les compilateurs étaient des brèles Donc Mouarf pour toi aussi
    Mais dit toi que si ton compilateur actuel traduit de cette façon, ce n'était pas évident sans optimisation de compilation il y a dix ans

    Hé oui, les choses se sont bien amélioré depuis. De plus, si le code assembleur est le même, la version en opérateur ternaire est préfecthée en une seule opération.

    Une fois encore, ce petit détail était utile avant le 386, premier processeur capable d'un préfetch en parallèle de code.

    C'est sûr qu'avec les proc hyper scalaire de nos jours...on s'en fout un peu.

    Mais, c'est bien pour cette raison, que l'opérateur ternaire à vu le jour à une certaine époque, où les algorithme d'optimisation de compilation n'était pas courant (comme l'optimisation SSA), ou un processeur devait fetcher les opcodes avant chaque exécution...

    Citation Envoyé par Selenite
    Citation Envoyé par Caine
    Cependant c'est plus efficace que l'équivalent if. Pourquoi : L'intégralité de l'instruction est préfécthé dans le pipeline du processeur en un seul coup. De plus, c'est un branchement cours, ça ne peut pas devenir un branchement long, donc deux fois plus rapide.

    Un gros mouarf pour toi ;-) :


    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
    void set1 ( int* a, int* b )
    {
     
    	if( *b != 0 ) 
    00401420  mov         ecx,dword ptr [esp+8] 
    00401424  mov         edx,dword ptr [esp+4] 
    00401428  xor         eax,eax 
    0040142A  cmp         dword ptr [ecx],eax 
    0040142C  sete        al   
    0040142F  mov         dword ptr [edx],eax 
    		*a = 0 ; 
    	else 
    		*a = 1 ;
     
    }
    00401431  ret   
     
     
     
     
    void set2 ( int* a, int* b )
    {
    	*a = *b ? 0 : 1 ;
    00401440  mov         ecx,dword ptr [esp+8] 
    00401444  mov         edx,dword ptr [esp+4] 
    00401448  xor         eax,eax 
    0040144A  cmp         dword ptr [ecx],eax 
    0040144C  sete        al   
    0040144F  mov         dword ptr [edx],eax 
    }
    00401451  ret

    Faut arrèter de croire qu'un compilateur est une brèle.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/10/2009, 23h03
  2. "Les Beatles sont plus populaires que Jesus" : c'est Google qui le dit !
    Par Katleen Erna dans le forum Humour Informatique
    Réponses: 3
    Dernier message: 24/09/2009, 13h12
  3. Réponses: 0
    Dernier message: 23/09/2009, 03h59
  4. Réponses: 4
    Dernier message: 17/10/2006, 09h46
  5. Réponses: 5
    Dernier message: 24/05/2006, 21h22

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