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 :

Conseil ; créer un type de données


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 199
    Points : 96
    Points
    96
    Par défaut Conseil ; créer un type de données
    Bonjour,

    Dans le cadre d'un projet j'ai besoin de créer un nouveau type de données : Truth. Ce dernier est en fait un float dans le domaine de définition est [0, 1].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef float truth;
    J’ai créé une batterie de fonction qui aura pour rôle de se charger de vérifier si la valeur qu'on veut affecter à une variable de type truth appartient au domaine [0, 1]. Leurs protos sont les suivants ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    truth int_to_truth(int value);
    truth uint_to_truth(unsigned int value);
    truth sint_to_truth(signed int value);
    truth shint_to_truth(short int value);
    truth lint_to_truth(long int value);
    truth luint_to_truth(long unsigned int value);
    truth lsint_to_truth(long signed int value);
    truth shuint_to_truth(short unsigned int value);
    truth shsint_to_truth(short signed int value);
    truth float_to_truth(float value);
    truth double_to_truth(double value);
    truth ldouble_to_truth(long double value);
    donc si je veut affecter une valeur à une variable de type truth, j'aurais qlq chose comme sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    truth t = XXXX_to_truth(valeur);
    C’est un peu artificiel de dire ça, mais je trouve ça une peu moche.

    J’aimerai faire en sorte que lorsque l'utilisateur affecte une valeur à une variable de truth un contrôle systématique soit fait afin de s'assurer qu'elle est effectivement entre 0 et 1. dans le monde de l'objet ça serait un événement qui sera déclenché à chaque fois qu'on fait appel à l'opérateur = et ça ne serait pas un problème de surcharger l'opérateur = sous C++.

    pour obtenir une écriture plus élégante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    truth t = valeur ;
    Le problème c'est que le C ne supporte ni la surcharge de fonction, encore moins la surcharge d'opérateur ou les événements.

    Auriez-vous une astuce ou un conseil au sujet afin d'implémenter ce mécanisme ?

    Merci d'avance.

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Un peu plus transparent pour l'utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define TYPE_FLOAT 1
    typedef float truth;
     
    truth* to_truth(void *my, int type)
    {
    	switch(type)
    	{
    		case TYPE_FLOAT:
    			return (float*)(my);
    	}
     
    }
    main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float a = 1;
    truth*b;
     
    b = to_truth(&a, TYPE_FLOAT);

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ou même idée mais encore plus simple

    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
    #define FLOAT      0
    #define DOUBLE    1
    #define INT          2
    #define LONG_INT 3
    #define CHAR        4
    ......
     
     
    float to_truth ( void *toto, int type )
    {
       float ftoto = (float *)toto ;
       double dtoto = (double *)toto ;
       int itoto = (int *)toto ;
       char ctoto = (char *)toto ;
     
       switch ( type )
         {
            case FLOAT :
                  ....
         }
    }
     
    ....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Scorpi0
    Invité(e)
    Par défaut
    Oui, je sais pas pourquoi j'ai voulu retourner un pointeur ^^

    J'ai un truc de ce gout là au final :

    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
    #define TYPE_DOUBLE 1
    typedef float truth;
     
    truth to_truth(void *my, int type)
    {
    	truth borneInf = 0.0;
    	truth borneSup = 1.0;
     
    	switch(type)
    	{
    		case TYPE_DOUBLE:
    			if(*(double*)(my) < 0)
    			{
    				return borneInf;
    			}
    			else if(*(double*)(my) > 1 )
    			{
    				return borneSup;
    			}
    			else
    			{
    				return (truth)(*(double*)my);
    			}
    	}
     
    }
    main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
     
    	double a = 0.5, b = -0.5, c = 1.5;
    	truth my_truth;
     
    	my_truth = to_truth(&a, TYPE_DOUBLE);
    	my_truth = to_truth(&b, TYPE_DOUBLE);
    	my_truth = to_truth(&c, TYPE_DOUBLE);
    }

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Légère correction :
    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
    30
    31
    32
    33
    #define TYPE_DOUBLE 1
    typedef float truth;
     
    truth to_truth(void const *my, int type)
    {
    	truth borneInf = 0.0;
    	truth borneSup = 1.0;
     
    	switch(type)
    	{
    	case TYPE_DOUBLE:
    		{
    		double const * pcValue = my;
    		double value = *pcValue;
    		if(value < borneInf)
    		{
    			return borneInf;
    		}
    		else if(value > borneSup)
    		{
    			return borneSup;
    		}
    		else
    		{
    			return (truth)value;
    		}
    		}
    		break;
    	case TYPE_INT :
    		...
    	}
     
    }
    C'est quand même plus facile à comprendre, et en plus c'est const-correct.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Scorpi0
    Invité(e)
    Par défaut
    Les const je veux bien, mais la déclaration de variable dans le bloc switch, ça m'étonnerait que ça compile

    On chipote on chipote..

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Scorpi0 Voir le message
    Les const je veux bien, mais la déclaration de variable dans le bloc switch, ça m'étonnerait que ça compile

    On chipote on chipote..
    conforme à la norme
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 199
    Points : 96
    Points
    96
    Par défaut
    C’est vrai que c'est tellement plus compact et clair.

    Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.

    J’en profite pour poser une question. vous l'aurez Déja remarqué je ne suis pas un expert en C.

    y'a t'il une différence entre ces différentes écritures :
    1. void* value
    2. void * value
    3. void *value


    c'est la même chose je pense (j'en suis pas sur à 100%).

    merci d'avance.

  9. #9
    Scorpi0
    Invité(e)
    Par défaut
    Techniquement aucune différence non.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 199
    Points : 96
    Points
    96
    Par défaut
    oki ,

    merci pour votre aide.

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Scorpi0 Voir le message
    Les const je veux bien, mais la déclaration de variable dans le bloc switch, ça m'étonnerait que ça compile
    Peu importe que ça t'étonne ou pas, c'est conforme.
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Points : 222
    Points
    222
    Par défaut
    J’en profite pour poser une question. vous l'aurez Déja remarqué je ne suis pas un expert en C.

    y'a t'il une différence entre ces différentes écritures :

    1. void* value
    2. void * value
    3. void *value
    Oui, une très grosse différence, void *value c'est mieux
    Enfin, si cela t'arrive de déclarer quelques variables d'un coup, du même type. Tu auras le bon réflexe automatiquement, void *value,*cost,*topay etc ..
    C'est en forgeant que l'on devient forgeron et c'est en sciant que Leonard de Vinci ...

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

Discussions similaires

  1. Créer son type de données
    Par shayw dans le forum VB.NET
    Réponses: 1
    Dernier message: 08/03/2015, 23h04
  2. Créer un type de donnée numérique
    Par BastienCil dans le forum C#
    Réponses: 1
    Dernier message: 14/03/2014, 01h20
  3. [Débutant] Comment créer un type de donnée ?
    Par xingjing910 dans le forum VB.NET
    Réponses: 11
    Dernier message: 28/03/2012, 16h19
  4. créer un nouveau type de donnée
    Par noussa_nouha dans le forum Langage
    Réponses: 5
    Dernier message: 05/09/2006, 11h29
  5. Créer son type de donnée
    Par progfou dans le forum Général Python
    Réponses: 5
    Dernier message: 14/12/2005, 09h31

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