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 :

Generiques et operateurs de calcul


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    Par défaut Generiques et operateurs de calcul
    Bonjour,

    Je débute en C#.
    J'ai voulu me faire rapidement une classe "Vecteur" permettant de faire des calculs, mais je rencontre qq soucis :

    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
        struct Vector2<T> where T : struct
        {
            public T A;
            public T B;
     
            public Vector2(T NewA, T NewB)
            {
                A = NewA;
                B = NewB;
            }
     
            public static Vector2<T> operator +(Vector2<T> a, Vector2<T> b)
            {
                Vector2<T> Ret = new Vector2<T>();
                Ret.A = a.A + b.A;
                Ret.B = a.B + b.B;
                return Ret;
            }
    }
    A la compilation, on me dit que "l'opérateur '+' ne peut être appliqué aux opérandes de type 'T'.
    Donc, je me dis qu'il faudrait que je place une interface bien sentie dans le where du générique, mais dans les types de base, je ne vois aucune interface qui définisse les opérateurs de calcul...

    Quelqu'un peut-il me dire ce qui cloche dans mon raisonnement, et comment écrire une telle classe pour qu'elle fonctionne avec les types de base ?

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Euh, ton X et Y il sortent d'où ? Soit tu as coupé du code pour l'exemple, soit il y a un problème parce que ce sont les additions entre X et Y qui posent problème je suppose, mais comme ils n'apparaissent nul part on ne peut que supposer ^^

    Mais si on suit le message d'erreur le problème vient effectivement du fait que tu réalises à un moment une addition entre 2 valeurs de type T et le compilateur ne sait pas le gérer, ce qui est normal.

    Après tu peux effectivement indiquer que T doit être d'un type donné avec les contraintes, et tu redéfinis ensuite les opérateurs dans la classe de base et les classes enfants.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Euh, ton X et Y il sortent d'où ? Soit tu as coupé du code pour l'exemple, soit il y a un problème parce que ce sont les additions entre X et Y qui posent problème je suppose, mais comme ils n'apparaissent nul part on ne peut que supposer ^^
    Désolé, j'ai trop simplifié le code, je corrige.

    Citation Envoyé par StormimOn Voir le message
    Mais si on suit le message d'erreur le problème vient effectivement du fait que tu réalises à un moment une addition entre 2 valeurs de type T et le compilateur ne sait pas le gérer, ce qui est normal.

    Après tu peux effectivement indiquer que T doit être d'un type donné avec les contraintes, et tu redéfinis ensuite les opérateurs dans la classe de base et les classes enfants.
    Donc comme les types de base ne dérivent pas d'interface déclarant les opérateurs arithmétiques, je l'ai dans le baba, c'est ça ? Parceque mon intention était de travailler principalement sur les types de base... Ca me parait énorme, mais bon je vais chercher une autre manière de faire...

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par saragaglia Voir le message
    Donc comme les types de base ne dérivent pas d'interface déclarant les opérateurs arithmétiques, je l'ai dans le baba, c'est ça ?
    Les types de base c'est à dire ? Comme je vois que tu indiques une struct dans les contraintes et histoire de bien comprendre, tu cherches à faire Vector2<int>, Vector2<double>, ... en utilisant les types numériques existants, c'est bien ça lorsque tu parles de type de base ?

    J'avais vu un article là dessus je crois, mais çà date un peu. L'idée c'est de faire une classe qui va gérer les opérations pour chaque type de base, mais avec une interface pour chapeauter le tout.

    Pour l'exemple je me limite à l'addition, à toi de voir ce dont tu as besoin après
    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
    interface ICalcul<T> where T : struct
    {
        T Additionne(T a, T b);
    }
     
    // De mémoire il vallait mieux faire des types valeur à ce niveau 
    // Si je retrouve l'article je pourrais peut être me rappeler pourquoi ^^
    struct CalculInt32 : ICalcul<int>
    {
        public int Additionne(int a, int b)
        {
            return a + b;
        }
    }
     
    // Après CalculInt16, CalculDouble, ...
    Ensuite, modifie ta classe Vector ainsi
    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
    struct Vector2<T, C>
        where T : struct
        where C : ICalcul<T>, new()
    {
        private static C calcul = new C();
        public T A;    
        public T B;
     
        public Vector2(T NewA, T NewB)
        {
            A = NewA;
            B = NewB;
        }
     
        public static Vector2<T, C> operator +(Vector2<T, C> a, Vector2<T, C> b)
        {
            Vector2<T, C> Ret = new Vector2<T, C>();
            Ret.A = calcul.Additionne(a.A, b.A);
            Ret.B = calcul.Additionne(a.B, b.B);
            return Ret;
        }
    }
    On utilise un second paramètre qui sert à indiquer le type de la classe utilisée pour faire les opérations. C'est tout bête, mais il fallait y penser.

    Ensuite à l'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Vector2<int, CalculInt32> v1 = new Vector2<int, CalculInt32>(2, 3);
    Vector2<int, CalculInt32> v2 = new Vector2<int, CalculInt32>(4, 6);
    Vector2<int, CalculInt32> v3 = v1 + v2;
    Ou encore, en définissant un alias afin de rendre la chose plus claire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    using VecteurEntier = Vector2<int, CalculInt32>;
    ...
    VecteurEntier v1 = new VecteurEntier(2, 3);
    VecteurEntier v2 = new VecteurEntier(4, 6);
    VecteurEntier v3 = v1 + v2;
    Ca fonctionne bien et le principe est assez simple à comprendre, en espérant que cela t'aide. Sinon, pense à virer tes champs public (A et B), mets les en privé et passe par des propriétés pour les accès

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    Par défaut
    Merci, c'est exactement ce qu'il me fallait.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/10/2010, 05h22
  2. Calculer le modulo sans utiliser l'operateur %
    Par candidson dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/06/2007, 18h35
  3. Réponses: 4
    Dernier message: 28/05/2006, 19h00
  4. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

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