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 :

Exercice tordu sur l'arithmétique des pointeurs


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Septembre 2009
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Septembre 2009
    Messages : 458
    Points : 237
    Points
    237
    Par défaut Exercice tordu sur l'arithmétique des pointeurs
    Bonjour à tous,

    Voilà j'ai un exercice vraiment tordu du professeur et je n'arrive pas à comprendre où il veut en venir...

    Citation Envoyé par Le prof
    Quelle est la valeur affichée par l'expression suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d\n", (PE = 97767, K = PE / 10, --PE - --K % 9407));
    Si PE est un entier codé sur 24 bits, et que K est une variable de type entier: 97398
    SI PE est un pointeur d'entiers codés sur 24 bits et que K est une variable de type entier : ERREUR

    Voici mon raisonnement !
    1) 24 / 8 = 3 octets
    2) 97767-3 = 97764
    3) on fait le modulo de 97397%9407= 3327 ????????? je suis pas sûr du résultat !
    4) 3327 * 3 = 9981
    5) je ne comprends pas K = PE / 10 ?????

    Merci pour vos explications

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    c'est tellement tordu que j'ai pas compris l’énoncé ni où était la question pour ma part

    Citation Envoyé par Tamzoro Voir le message
    je n'arrive pas à comprendre où il veut en venir...
    à réfléchir sur la précédence des opérations peut-être ?

    si PE est un pointeur ça ne compilera pas (c'est ce que tu entends pas ERREUR j'imagine ?)
    si les deux sont des int en dépliant ça nous donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        int PE = 97767;
        int K = PE / 10;        # K = 9776
        --PE;                   # PE = 97766
        --K;                    # K  = 9775
        K %= 9407;              # K = 368
        printf("%d\n", PE - K); # PE - K = 97398

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tamzoro Voir le message
    Voilà j'ai un exercice vraiment tordu du professeur et je n'arrive pas à comprendre où il veut en venir...
    Bonjour
    Probablement il veut t'apprendre à connaitre les opérateurs et la façon de les utiliser...


    Citation Envoyé par Tamzoro Voir le message
    Voici mon raisonnement !
    1) 24 / 8 = 3 octets
    2) 97767-3 = 97764
    4) 3327 * 3 = 9981
    Où as-tu vu "97767 - 3" et/ou une multiplication par 3 dans l'expression ???

    Citation Envoyé par Tamzoro Voir le message
    5) je ne comprends pas K = PE / 10 ?????
    Tu ne comprends pas qu'on puisse stocker le résultat de "PE / 10"dans une variable "K" ???

    Citation Envoyé par Tamzoro Voir le message
    Merci pour vos explications
    Ben rappelle-toi que l'opérateur "virgule" est un opérateur séquentiel. Les opérations s'exécutent de la gauche vers la droite. Mis à part ça, il n'y a aucune difficulté dans ces opérations...

    Citation Envoyé par BufferBob Voir le message
    si PE est un pointeur ça ne compilera pas (c'est ce que tu entends pas ERREUR j'imagine ?)
    Absolument pas. T'as tout à fait le droit d'écrire int *PE=97767. J'ai un petit doute sur ce que donne PE/10 dans ce cas (le processeur va-t-il utiliser l'arithmétique des pointeurs pour cette division ou bien étant donné que cette arithmétique ne s'applique que sur les additions et soustractions il va effectuer une simple division classique ?) mais ça compilera sans soucis...

    Citation Envoyé par BufferBob Voir le message
    Attention, il n'y a pas d'affectation. Mais ça ne change rien au résultat
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    la virgule détermine des opération séquentielle, sauf que les --PE et --K sont prioritaire au sein de LEUR expression

    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
    	// 97398, ça c'est le résultat
    	long PE;
    	long K;
    	long R = (PE = 97767, K = PE / 10, --PE - --K % 9407);
    	//printf("%d\n", (PE = 97767, K = PE / 10, --PE - --K % 9407));
    	printf("%d\n", R);
     
    	PE = 97767; // premiere partie affectation de 97767 à PE
    	K = PE / 10; // 2eme partie on met PE / 10 dans K
    	R = --PE - --K % 9407; // 3"me partie
    	//   1   |  1  |                    les operateurs de pre decrementation passent en premier
    	//       |     2                     le modulo est évalué (priorité supérieure à la soustraction
    	//       3                           la soustraction est faite
    	printf("%d\n", R);
    	return 0;
    bon perso, je pense pas que ce soit la meilleure façon d'apprendre le c++, si l'objectif est de vous transformer en développeur haïssable, il est en bonne voix !
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pascalCH Voir le message
    bon perso, je pense pas que ce soit la meilleure façon d'apprendre le c++, si l'objectif est de vous transformer en développeur haïssable, il est en bonne voix !
    Moi je ne pense pas. Rien ne vaut l'expérience perso. S'il se rend compte de la difficulté à lire ce genre d'expression, nul doute qu'il ne s'amusera jamais à en écrire de similaires...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par Sve@r Voir le message
    T'as tout à fait le droit d'écrire int *PE=97767
    oui évidement, mais l'expression donnée est printf("%d\n", (PE = 97767, K = PE / 10, --PE - --K % 9407));, si on la conserve telle qu'elle est donnée dans l’énoncé le compilateur lèvera une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: invalid operands to binary / (have ‘int *’ andint)
    et si on effectue le changement jusqu'au bout ça compilera bien mais on aura un warning pour nous signaler que le pointeur n'a pas été initialisé, et génèrera un code machine dans lequel il essaye de faire rentrer une valeur dans l'adresse pointée par un registre qui vaut zéro, ce qui va segfault (bien avant la division donc)
    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
        int *PE;
        int K;
        printf("%d\n", (*PE = 97767, K = *PE / 10, --*PE - --K % 9407));
    ---------------------------------------------------------------------------
    warning: ‘PE’ is used uninitialized in this function [-Wuninitialized]
    ---------------------------------------------------------------------------
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000400539 in main ()
    (gdb) info registers rax
    rax            0x0      0
    (gdb) disassemble main
    Dump of assembler code for function main:
       0x000000000040052d <+0>:     push   %rbp
       0x000000000040052e <+1>:     mov    %rsp,%rbp
       0x0000000000400531 <+4>:     sub    $0x10,%rsp
       0x0000000000400535 <+8>:     mov    -0x8(%rbp),%rax
    => 0x0000000000400539 <+12>:    movl   $0x17de7,(%rax)      // "int *PE = 97767;"
       0x000000000040053f <+18>:    mov    -0x8(%rbp),%rax
    Citation Envoyé par Sve@r Voir le message
    Attention, il n'y a pas d'affectation. Mais ça ne change rien au résultat
    ni au code machine généré, c'est rigoureusement le même ^^

Discussions similaires

  1. Arithmétique des pointeurs
    Par Tamzoro dans le forum Débuter
    Réponses: 9
    Dernier message: 24/08/2014, 23h48
  2. quetion toute bête sur le type des pointeurs
    Par Invité dans le forum Débuter
    Réponses: 6
    Dernier message: 20/11/2010, 13h10
  3. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  4. Transtypages sur des pointeurs de fonction
    Par gege2061 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 05/01/2007, 15h01
  5. pointeurs sur les arguments des fonctions?
    Par brunoP dans le forum C
    Réponses: 3
    Dernier message: 14/05/2006, 18h11

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