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 :

problème de typedef conditionnel.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut problème de typedef conditionnel.
    Salut les C++,

    j'essaie, enfin je bute sur le problème, de faire un typedef en fonction d'un argument de type int passé en paramètre a une fonction.

    Mais du code vaut mieux qu'un long discours:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    cv::Mat make_kernel(const string kernel_type, const int ksize, const char center_value, const float factor, const int datatypes) {
     
      cv::Mat kernel(ksize, ksize, datatypes, cv::Scalar(0)) ;
     
      typedef uint8_t matrix_type ;
     
      fprintf(stdout,"==> %d\n", datatypes) ;
     
      switch (datatypes) {
     
        /** to @BUGFIX: this don't work as expect */
     
        case 0 : {
          typedef uint8_t matrix_type ;
          break ;
        }
        case 1 : {
         typedef int8_t matrix_type ;
         break ;
        }
        case 2 : {
          typedef uint16_t matrix_type ;
          break ;
        }
        case 3 : {
          typedef int16_t matrix_type ;
          break ;
        }
        case 4 : {
          typedef int32_t matrix_type ;
          break ;
        }
        case 5 : {
          typedef float matrix_type ;
          break ;
        }
        case 6 : {
          typedef double matrix_type ;
          break  ;
        }
        default :
     
          fprintf(stdout,"Kernel matrix type not found\n") ;
          return cv::Mat() ;
      }
     
     
     
      fprintf(stdout,"-> %s\n", typeid(matrix_type).name()) ;
     
      matrix_type counter = 0 ;
     
      const matrix_type val = 1 * factor ;[/B]
     
      // ...
     
    }
    Sans le premier typedef ( a l'extérieur du switch() { }) le compilateur refuse de compiler mon code.

    Et sinon le type reste toujours le même: unint8_t... Selon cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(stdout,"-> %s\n", typeid(matrix_type).name()) ;
    qui dit toujours la même chose:
    -> h
    Si vous avez une solution je suis preneur car j'ai retourner le problème dans tous les sens, (#define conditionelle, ternaire a a gauche pour indiquer le type, etc...) je n'y arrive pas.

    Merci pour vos réponse éclairées.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    essaie avec les templates:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template <int i>
    struct special_int {};
     
    template <>
    struct special_int<1> {typedef int8_t type};
     
    template <>
    struct special_int<2> {typedef int16_t type};
     
    template<int i>
    using matrix_type = special_int<i>::type;

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    dans mon idée un typedef conditionnel était uniquement possible dans des directives pour le préprocesseur, pas dans des structures conditionnelles comme switch, if, etc.

    les templates sont une solution, mais:

    - il faut connaître datatype à la compilation, donc ce doit être soit un littéral, soit une constexpr
    - si c'est bien le cas, il paraît meilleur de paramétrer directement la classe Kernel, voire Mat. Ce sera nettement plus lisible. A moins que tu ne cherches autre chose?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Sinon, il y a boost::Variant ou les tagged union.

  5. #5
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Merci pour vos réponses,

    j'ai régler le problème grace a une fonction template.

    Je sais que typedef est une instruction du préprocesseur et apparemment conditionnellement ce n'est pas possible car la valeur doit être connus a la compilation, si je dit pas de bêtises...

    problème résolu.

    Merci a tous pour vos réponses.

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

Discussions similaires

  1. problème sur jointure conditionnelle
    Par dahno_fr dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 15/10/2009, 16h38
  2. Problème de somme conditionnelle dans un état
    Par Kento10 dans le forum Jasper
    Réponses: 0
    Dernier message: 02/09/2008, 14h02
  3. Problème de typedef avec template
    Par Kaelian dans le forum Langage
    Réponses: 6
    Dernier message: 21/07/2008, 23h04
  4. Réponses: 3
    Dernier message: 13/06/2008, 14h41
  5. problème de typedef ?
    Par omega67 dans le forum C
    Réponses: 7
    Dernier message: 15/02/2007, 13h40

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