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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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 :
                  ....
         }
    }
     
    ....

  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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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
    Membre confirmé
    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
    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.

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

+ 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