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 :

Comportement de cast


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut Comportement de cast
    Bonsoir à tous,

    Je me suis retrouvé face à une ligne de code dont j'ai du mal à comprendre le fonctionnement.

    Ainsi je serais reconnaissant si vous pouviez m'apporter vos lumières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cv::Mat depthMat(Size(640,480),CV_16UC1)
    uint16_t* depth = static_cast<uint16_t*>(_depth);
    depthMat.data = (uchar*) depth;
    La ligne que j'ai du mal à comprendre concerne le cast suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    depthMat.data = (uchar*) depth;
    Cela modifie-t-il quoi que ce soit ? Le sizeof(uchar*) est de 4bytes, celui du uint16_t de même.

    Je serais ravi d'entendre vos avis sur ce sujet !

    Bien cordialement

    Al_th

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Quelque soit le type du pointeur, un pointeur est un pointeur donc il aura toujours la même taille (4 octets sur système 32bits, 8 octets sur système 64bits).

    Mais le type pointé est différent.
    Donc en déréférençant le pointeur (directement ou en l'utilisant comme un tableau), tu interprétera les données différemment. Comme des uchar et non plus des uint16_t.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    data est un attribut publique de depthMat, qui contient l'adresse désignant l'emplacement mémoire des données d'une matrice cv::Mat. Une affectation modifie cet attribut en remplaçant son contenu par celui de depth, qui est aussi celui de _depth. Les casts ligne 2 et 3 semblent être des tentatives maladroites de faire coïncider les types de pointeur de depth et data (sans quoi le compilo râle).

    A première vue, il s'agit là d'un code de gougnafier qui va provoquer des fuites mémoire (que devient la valeur originale de .data ? Elle est perdue, donc son contenu ne sera pas désalloué).

    Un strict équivalent, la fuite mémoire en moins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    depthMat = cv::Mat(640, 480, CV_16UC1, _depth);
    Cf la doc pour voir que les données désignées par _depth ne seront dupliquées ni par l'appel du constructeur, ni par l'affectation sur depthMat.

    PS: Ce serait bien de préciser « j'utilise OpenCV X.Y.Z » dans ton message ; tout le monde n'est pas censé deviner d'où provient le type cv::Mat.

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut
    Effectivement mea culpa. J'utilise OpenCv (2.4.2 si je ne m'abuse).

    Pour le code, il s'agit du wrapper OpenCv disponible sur le site OpenKinect (http://openkinect.org/wiki/C%2B%2BOpenCvExample).


    Donc en déréférençant le pointeur (directement ou en l'utilisant comme un tableau), tu interprétera les données différemment. Comme des uchar et non plus des uint16_t.
    C'était mon sentiment premier mais comme il les affecte directement à un conteneur de type CV_16UC1, les données sont à nouveau interprétées comme êtant sur 2 octets, et non pas comme un uchar (1octet). Bref, c'était assez étonnant.

    @Cob59 : C'est bien noté, merci du conseil

Discussions similaires

  1. Toad 9.5 CAST (F5/F9) pas le même comportement
    Par CUCARACHA dans le forum Débuter
    Réponses: 2
    Dernier message: 17/05/2010, 16h10
  2. Réponses: 2
    Dernier message: 22/09/2003, 11h23
  3. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 15h00
  4. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 12h07
  5. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49

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