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++Builder Discussion :

reinterpret_cast d'un TSmallPoint vers un int


Sujet :

C++Builder

  1. #1
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut reinterpret_cast d'un TSmallPoint vers un int
    Je m'interroge sur le cast du C++

    J'ai lu
    Cours C - II-B-12. Conversion de type (\cast" operator)
    FAQ C++ - Comment effectuer une conversion de type explicite (cast) ?

    Je me suis aperçu d'une complexité syntaxique du C++ lors de l'utilisation TSmallPoint est la méthode Delphi équivalent à la Macro MAKEPOINTS pour utiliser une message type WM_MOUSEMOVE, WM_LBUTTONUP ... via SendMessage avec le TSmallPoint dans lParam

    Voici un code d'exemple en C++
    Code c++ : 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
     
    {
      TSmallPoint SP;
      SP.x = 1;
      SP.y = 1;
      int i ;
     
      Perform(WM_MOUSEMOVE, 0, *((int*)(&SP))); // C'est Effrayant de complexité !
     
    //    i = SP; // Ne Compile pas ! Normal !
    //    i = (int)SP; // Ne Compile pas ! Pourquoi ?
    //    i = *((int*)(&SP)); // Compile et Fonctione ! Mais c'est illisible !
    //    i = reinterpret_cast<int>(SP); // Ne Compile pas ! Pourquoi ?
        i = reinterpret_cast<int&>(SP); // Compile et Fonctione ! Mais c'est long et pourquoi & ? Cela revient à écrire la ligne au dessus !
     
      ShowMessage(i);
     
      TPoint P;
      P.x = 1;
      P.y = 1;
      double D;
     
      // D = (Double)P; // Ne Compile pas ! Pourquoi ?
      D = *((double*)(&P)); // Compile et Fonctione ! Mais c'est illisible !
      ShowMessage(D);
     
      i = D + 1; // C++ converti le double en int sans broncher !
      ShowMessage(i);
    }

    Voici l'équivalent Delphi !
    Alors que Delphi est nettement plus strict au niveau des conversions entre entier et flottant ou la conversion vers une chaine, il accepte des transtypages sur des types de même longueur que n'accepte pas le C++ !

    Code Delphi : 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
    var
      SP: TSmallPoint;
      I: Integer;
      D: Double;
      P: TPoint;
    begin
      SP.x := 1;
      SP.y := 1;
     
      Perform(WM_MOUSEMOVE, 0, Integer(SP)); // Simple et Efficace
     
      I := Integer(SP);
      ShowMessage(IntToStr(I));
     
      P.x := 1;
      P.y := 1;
      // D := Double(SP); // E2089 Transtypage Incorrect - normal Double est sur 8 octets et TSmallPoint sur 4
     
      D := Double(P); // Même Taille ! Donc OK !
      ShowMessage(FloatToStr(D));
     
      // i := D + 1; // E2010 Types incompatibles - Double et Integer c'est pas la même chose !
      i := Trunc(D + 1); // Trunc, Floor, Ceil, on doit fournir une méthode de conversion explicite !
      ShowMessage(IntToStr(I));
     
    end;

    Je termine tout de même par une question :
    Existe-t-il quelque chose de plus concis que reinterpret_cast<int&>(SP) ou i = *((int*)(&SP)) ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut
    La syntaxe correcte dans le cas d'un cast de type et non de pointeur sur un type serait dans le cas de figure:
    pour autant que je souvienne en Delphi on travaille avec des références
    --> (integer) SP = en C++ (int&)SP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     Perform(WM_MOUSEMOVE, 0, (int&)SP)
     
    // et
    D = (double&)P;
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut ShaiLeTroll
    Voici un lien vers un tuto sur le sujet, j'espere que cela va pouvoir t'aider

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut
    Merci DjmSoftware !
    Tout simplement i = (int&)SP;, c'est vrai que reinterpret_cast se fait aussi sur int& et non sur int, je ne sais plus où j'ai trouvé l'idée de l'écrire comme cela !

    en Delphi, les types simples comme int ou double, c'est une allocation statique normal, il n'y a pas de référence,
    il est juste capable de transtyper de deux types de la même taille !
    Par contre, les TObject sont implicitement des références
    Obj: TObject correspond à TObject* Obj,
    Obj: ^TObject correspond à TObject** Obj.
    Le type string aussi est assez subtile dans sa gestion interne

    @blondelle, dommage, je l'ai lu aussi celui là !

    The syntax is:

    reinterpret_cast < type-name > (expression)
    Quand je lit ça, j'écris naturellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reinterpret_cast < int > (expression)
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reinterpret_cast < int & > (expression)
    Citation Envoyé par Embarcadeor
    Dans l'instruction reinterpret_cast< T > (arg), T doit être un pointeur, une référence, un type arithmétique, un pointeur de fonction ou un pointeur de membre.
    un type arithmétique ? int c'est pas le type arithmétique par excellence ?

    J'ai trouvé d'autres documentations

    The reinterpret_cast operator allows any pointer to be converted into any other pointer type. It also allows any integral type to be converted into any pointer type and vice versa. Misuse of the reinterpret_cast operator can easily be unsafe. Unless the desired conversion is inherently low-level, you should use one of the other cast operators.
    Je n'avais pas pigé la subtilité de cette phrase !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Convertion char vers int
    Par barthelv dans le forum C
    Réponses: 8
    Dernier message: 08/10/2011, 21h45
  2. [PIC 18F87J11] 2 char vers 1 int
    Par SuperWax dans le forum MPLAB
    Réponses: 2
    Dernier message: 22/07/2011, 04h07
  3. Byte[4] vers un int, et vice-versa
    Par anubis_1001 dans le forum Langage
    Réponses: 2
    Dernier message: 14/05/2010, 11h04
  4. Convertion d'un string 'binaire' vers un int
    Par Hokage dans le forum Débuter
    Réponses: 14
    Dernier message: 28/09/2007, 11h51
  5. Conversion d'un byte[] vers un int[]
    Par ludosoft dans le forum Langage
    Réponses: 10
    Dernier message: 11/01/2007, 16h10

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