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 confirm�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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

  3. #3
    Membre confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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
    semble plutot correct

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par d�faut
    Citation Envoy� par mac&cheese Voir le message
    ..\main.cpp|29|error: pointer of type `void *' used in arithmetic|

  11. #11
    Membre confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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...

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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...

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 : 51
    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
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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 confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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...

  19. #19
    Membre confirm�
    Avatar de mac&cheese
    Profil pro
    �tudiant
    Inscrit en
    Mars 2008
    Messages
    98
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    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?

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    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