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 :

[static_cast] Problème avec un exercice.


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut [static_cast] Problème avec un exercice.
    Salut,

    Je suis en train de lire le livre "Thinking in c++ 2nd, Vol. 1" et j'ai de la difficulté à comprendre un exercice. Voici l'énoncé, ça explique tout:
    Define an array of int. Take the starting address of that array
    and use static_cast to convert it into an void*. Write a
    function that takes a void*, a number (indicating a number of
    bytes), and a value (indicating the value to which each byte
    should be set) as arguments. The function should set each byte
    in the specified range to the specified value. Try out the
    function on your array of int.
    Je ne comprend pas exactement ce qu'ils veulent que je fasse. Enfin, j'en suis arrivé à ceci pour le moment:
    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
    #include <iostream>
    using namespace std;
     
    void unefonction( void* pletableau, int nboctets, int valeur);
     
    int main()
    {
        int montableau[10];
        int* p = montableau;
        void* pv = static_cast<void*>(p);
     
        unefonction( pv, sizeof(int), 10);
    }
     
    void unefonction( void* pletableau, int nboctets, int valeur)
    {
         // Aucune idée quoi faire ici.
    }
    Je ne sais même pas si je suis dans le bonne direction... Ça doit être dû à ma compréhension de l'anglais

    Quelqu'un peut me dire si je suis dans la bonne direction ou me dire ce que vous pensez qu'ils veulent que je fasse dans la fonction.

    Merci.

  2. #2
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    En gros, si j'ai bien compris, la traduction serai la suivante:
    Definissez un tableau de int. Prenez l'adresse de debut de ce tableau et utilisez static_cast pour le convertir en un void*. Ecrivez une fonction qui prend un void*, un nombre (indiquant un nombre d'octets) et une valeur (indiquant la valeur à laquelle chaque octets devront etre fixés) comme arguments. Cette fonction devrait mettre chaque octet de la plage spécifiée à la valeur spécifiée. Essayer cette fonction sur votre tableau de int
    Est ce que c'est plus clair pour toi?

    Un petit indice: tu n'es pas vraiment dans la bonne direction en ce qui concerne les valeurs de tes arguments...

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  3. #3
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    En gros, en reprenant ta fonction de depart, à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void unefonction( void* pletableau, int nboctets, int valeur)
    ta fonction unefonction doit fixer à la valeur valeur chaque elements de ton tableau pletableau compris dans la plage nboctets.

    Voili, voilou...

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    Est ce que c'est plus clair pour toi?
    Lol, ça doit être ma compréhension du concept qui flanche alors !... je ne comprends pas plus en français

    Qu'est-ce que tu veux dire par "tu n'es pas vraiment dans la bonne direction en ce qui concerne les valeurs de tes arguments..." ?

    Je vais récapituler dans ma tête...
    Je crois que mon tableau est correct... c'est assez simple, un tableau de int avec 10 positions...

    Pour l'adresse de début du tableau, "montableau" devrait contenir cette adresse (vrai?) et donc, je peux la passer à un pointeur de int. Enfin, je crois

    Je convertis ce pointeur en pointeur "void *" comme demandé (le pourquoi m'échappe encore, mais j'y travail ).

    Dans la fonction, je passe mon pointeur (void *). Le nombre d'octets, que je suppose être la grosseur d'un int étant donné que je travail avec des int... le pourquoi m'échappe aussi. Et, la valeur, je suppose qu'ils veulent que chaque position dans mon tableau de int prenne cette valeur.

    Donc, dans cette fonction, j'utilise le pointeur passé pour changer les valeurs à chaque position de mon tableau, c'est ça? Et je dois avoir besoin du nombre d'octets pour pouvoir sauter d'une position à l'autre (du genre "pletableau++"?... incrémenter le pointeur). Et puis, la valeur que je mets à la position en cours.

    Est-ce que tu penses que je trouve ça plus clair avec ce que je vois dans ma tête?

    Merci

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    ta fonction unefonction doit fixer à la valeur valeur chaque elements de ton tableau pletableau compris dans la plage nboctets.
    C'est justement cela que je n'arrive pas à visualiser... Je cherche comment faire prendre une valeur à mon tableau en passant par le pointeur, mais je ne vois pas comment...

    pletableau = valeur;?
    pletableau[?] = valeur;?

  6. #6
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Alors tout dabord, as tu vu mon dernier message?
    Ensuite, effectivement, je n'avais pas compris ton code de cette façon là... apres ton explication, un seul point cloche encore, c'est nboctets, cette variable t'indique seulement une plage d'action; c'est à dire, si nboctets vaut 2, alors, tu devras fixer seulement les 2 premiers elements de ton tableau à la valeur valeur.Pour resumer, seulement les nboctets premiers elements vaudront valeur.

    Mieux?

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    ta fonction unefonction doit fixer à la valeur valeur chaque elements de ton tableau pletableau compris dans la plage nboctets.
    Je viens de relire ta phrase. Ce que tu dis, c'est que je dois mettre des valeurs quelconques dans mon tableau. Dans la fonction, je mets chaque valeur contenu dans chaque position du tableau dans la variable valeur et je fais queqlue chose avec du genre l'afficher à l'écran, c'est bien ça?

  8. #8
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par sekiryou Voir le message
    C'est justement cela que je n'arrive pas à visualiser... Je cherche comment faire prendre une valeur à mon tableau en passant par le pointeur, mais je ne vois pas comment...

    pletableau = valeur;?
    pletableau[?] = valeur;?
    Desole je n'avais pas compris ton probleme.
    quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pletableau[n] = valeur;
    semble plutot correct
    World's greatest inventors: Franklin, Edison and this REESE guy.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    Pour resumer, seulement les nboctets premiers elements vaudront valeur.
    Ok... donc, si nboctet représente les positions du tableau, ça n'a rien à voir avec le nombre d'octets?

    C'est fou ce que les pointeurs et les casts me mêlent ! lol

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pletableau[n] = valeur;
    ..\main.cpp|29|error: pointer of type `void *' used in arithmetic|

  11. #11
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par sekiryou Voir le message
    Ok... donc, si nboctet représente les positions du tableau, ça n'a rien à voir avec le nombre d'octets?
    Moi j'aurais appeler cette variable un truc du genre nbDeCasesARemplir...


    Mais encore une fois, c'est ce que moi j'ai compris du texte; c'est à dire que je peux me tromper...
    World's greatest inventors: Franklin, Edison and this REESE guy.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    Moi j'aurais appeler cette variable un truc du genre nbDeCasesARemplir...


    Mais encore une fois, c'est ce que moi j'ai compris du texte; c'est à dire que je peux me tromper...
    Ouais, moi aussi c'est de cette façon que j'interprète l'exercice... parce que avec "Cette fonction devrait mettre chaque octet de la plage spécifiée à la valeur spécifiée" ça me mêle un peu. Un int ne vaut-il pas 4 octets? Ce qui voudrait dire que à chaque position de mon tableau, je dois faire prendre à chaque octet de cette position la valeur de la variable passée en argument? Ce qui est un peu stupide je crois. Donc, si je passe la valeur "8", chaque octet d'une position du tableau vaudra "8"... ce qui ne sert par à grand chose étant donné que ce fameux "8" perdra tout son sens lorsque qu'on voudra lire une position du tableau.

  13. #13
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Sachant qu'au depart ton tableau est un tableau de int, si dans une "case" tu met la valeur valeur, qui au passage, est un int, alors ta "case" sera pleine.
    Je pense qu'ils ont utilisé le mot "byte" pour ne pas compliquer les choses, mais à mon avis, ils entendaient par là: "case"

    May be...
    World's greatest inventors: Franklin, Edison and this REESE guy.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    Sachant qu'au depart ton tableau est un tableau de int, si dans une "case" tu met la valeur valeur, qui au passage, est un int, alors ta "case" sera pleine.
    Je pense qu'ils ont utilisé le mot "byte" pour ne pas compliquer les choses, mais à mon avis, ils entendaient par là: "case"

    May be...

    Peut-être... mais je ne sais toujours pas comment attribuer une valeur à partir du pointeur de la fonction...

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Bon, je viens de lire un peu sur les pointeurs "void" puis je me rend compte que, étant donné que ces pointeur n'ont pas de "grosseur" (Enfin, en C++ !), on ne peut pas les utiliser pour faire des affectations ou même de lecture (ce qui est normal étant donné qu'on ne connait pas le type de donné avec laquelle on travail). Cela veut-il dire que je dois reconvertir à chaque fois le pointeur void vers le type avec lequel je veux travailler?

  16. #16
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je dois avouer que j'ai du mal à trouver des cas où faire le genre de choses demandée par l'exercice a le moindre intérêt, voire simplement conduit à du code au comportement défini...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Je suis entièrement d'accord... comme j'ai lu plus haut dans le chapitre, l'auteur dit bien que ces exercices ne sont pas sensé être une bonne façon de coder, mais bien une façon de faire comprendre les concepts. Comme dans ce cas, l'exercice porte sur les pointeurs, les casts (static_cast plus précisément). Et comme ce sont des outils rarement utilisés, je comprends que ce soit très difficile pour eux de faire des exercices simples et concis surtout avec le peu de connaissances et d'expériences du lecteur rendu à cette étape (chapitre 3 dans le cas de cet exercice). Le chapitre 1 étant une grosse introduction au langage c++, chap.2 intro sur le compilateur, linkeur, etc... et les types de bases et finalement le chap.3 ou le vrai savoir commence. On pourrait quasiment dire que c'est le vrai chap.1 pour le langage c++ en tant que tel ^^. Donc, faire comprendre ce genre de concept à un néophite avec des codes hyper complexe serait futile à mon avis.

    J'ai presque terminé l'exercice, je poste le code aussitôt terminé.

    a+

  18. #18
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Bonjour,
    Desole hier j'etais un peu fatigué, suis parti me coucher.
    Je regarde de mon coté dans la journée et te tiens au courant...
    World's greatest inventors: Franklin, Edison and this REESE guy.

  19. #19
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Bonsoir,
    Desole de poster pour te dire ça, mais j'ai le meme soucis que toi à la compil, je me creuse la tete depuis une heure et je trouve pas.Je ne vois pas comment utiliser le tableau
    Je demande conseil à mes profs demain si ça t'interesse?
    World's greatest inventors: Franklin, Edison and this REESE guy.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    Bonsoir,
    Desole de poster pour te dire ça, mais j'ai le meme soucis que toi à la compil, je me creuse la tete depuis une heure et je trouve pas.Je ne vois pas comment utiliser le tableau
    En fait, de ce que j'ai compris des pointeurs "void*"... c'est qu'ils ne font que pointer vers une adresse et rien d'autre, tu ne peux pas "jouer" avec étant donné qu'ils n'ont pas de types sur lesquels basé leurs actions. Contrairement en C où les pointeurs "void*" sont en fait des "char*" camouflés. C'est pourquoi tu ne peux pas lire d'information ou écrire d'information à partir d'un "void*".

    Donc, ce que j'ai compris c'est qu'il faut refaire un cast sur un void* à chaque fois que tu veux manipuler l'endroit où il pointe. L'exercice dont je parle au début devient donc vraiment stupide... caster mon int* en void* pour le passer à la fonction puis le recaster en int* pour le manipuler ! Puis, à la place d'utiliser les positions de tableau, il faut incrémenter le pointeur de la grosseur d'un int (ou du type avec lequel on travail). Enfin, je me trompe sûrement, mais c'est où je suis rendu dans mon raisonnement.

    Si quelqu'un voit que je me trompe, vite, je vous en pris ! corrigez-moi !

    Citation Envoyé par mac&cheese Voir le message
    Je demande conseil à mes profs demain si ça t'interesse?
    J'accepte avec grand plaisir ta proposition et j'attends de tes nouvelles.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. problème avec un exercice en LDA
    Par djoufouf dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 07/01/2013, 01h31
  2. problème avec un exercice en C
    Par prikama dans le forum Débuter
    Réponses: 8
    Dernier message: 20/12/2011, 15h58
  3. Réponses: 1
    Dernier message: 12/12/2011, 10h42
  4. Réponses: 1
    Dernier message: 24/10/2011, 10h49
  5. [c++] second problème avec exercices du livre Big c++
    Par TERRIBLE dans le forum Contribuez
    Réponses: 6
    Dernier message: 06/11/2005, 21h07

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