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 :

Question sur la syntaxe *(double *) x;


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Question sur la syntaxe *(double *) x;
    Comment lire la syntaxe:
    dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double f1 (double x, void* params) {
      double alpha = *(double *) params ;
      return (exp(x*alpha)/log(x) ) ;
    }
    Faut il le lire comme ceci?
    params est un pointeur sur void.
    ensuite, on le transforme en pointeur sur double grâce à (double*)
    ensuite, on le trasnforme en double grâce à l'opérateur de déférencement.
    ???

    Que ce passe t il si params est un char ou un string?

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Comment lire la syntaxe:
    *(double *) params ;
    <snip>
    params est un pointeur sur void.
    ensuite, on le transforme en pointeur sur double grâce à (double*)
    ensuite, on le trasnforme en double grâce à l'opérateur de déférencement.
    Exactement.

    ???

    Que ce passe t il si params est un char ou un string?
    Bah tu cast un char en double, ce qui va encore (char est un entier entre 0 et 255), par contre caster un std::string en double, je sais pas si ca beaucoup de sens. Pour ma part, je pense à un UB amsi je ne suis sûr de rien.

    Question auxillaire : pourquoi utiliser un pointeur de type void et pas une fonction template à la place ?

    EDIT: Pour confirmer mon UB:
    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
    #include <string>
    #include <iostream>
     
    void foo(void *p)
    {
        double *ptr=static_cast<double*>(p);
        std::cout<<*ptr<<std::endl;
    }
     
    int main(int argc, char const *argv)
    {
        std::string s("5");
        foo(static_cast<void*>(&s));
     
        return 0;
    }
    qui donne chez moi : 4.8606e-270

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Question auxillaire : pourquoi utiliser un pointeur de type void et pas une fonction template à la place ?
    Parce que je ne sais pas utiliser les templates
    Mais si tu me donnes un exemple et montre comment tu l'utilises ici, je suis pres a le prendre

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Bah tu cast un char en double, ce qui va encore (char est un entier entre 0 et 255)
    Attention, ce code ne caste pas UN char en double, mais caste sizeof(double) chars en double. C'est un cast de pointeur...

    Le cast C++ correspondant est static_cast<>, parce qu'on part d'un pointeur générique. Pour caster directement un pointeur sur char en pointeur sur double, il faudrait utiliser reinterpret_cast<>.

  5. #5
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Bah tu cast un char en double, ce qui va encore (char est un entier entre 0 et 255), par contre caster un std::string en double, je sais pas si ca beaucoup de sens.
    Je ne suis même pas sûr que cela aille vraiment ! Il ne se peux pas que tu te prennes un SIGSEGV ou SIGBUS ?
    En effet le char peut ne pas être aligné et même si il l'est, il ne fait pas la taille d'un double !

Discussions similaires

  1. Question sur la syntaxe ?
    Par bond70 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 15/03/2009, 19h53
  2. Questions sur la syntaxe des sélecteurs
    Par pierre24 dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 22/04/2008, 13h17
  3. [PHP-JS] Question sur la syntaxe entre PHP et HTML
    Par Diabless6 dans le forum Langage
    Réponses: 8
    Dernier message: 13/04/2007, 14h08
  4. [C#] quelques questions sur la syntaxe de base en C#
    Par DonJR dans le forum Windows Forms
    Réponses: 14
    Dernier message: 06/12/2006, 15h01
  5. [Tableaux] QUestion sur la syntaxe
    Par clementphp dans le forum Langage
    Réponses: 8
    Dernier message: 21/09/2006, 03h37

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