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 :

Convert.objet vers tableau Double ou Short en fonct.type objet


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut Convert.objet vers tableau Double ou Short en fonct.type objet
    Bonjour,

    j'ai 1 fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     static int MaFonctionShort(objet monTb)
    short[] tab = (short[])monTb;
    ...travail sur tab
    et une 2ème fonction qui fait la même chose sauf que l'objet est de type double au lieu de Short.

    est-il possible de créer un tableau "tab" du type de "monTb" afin d'avoir 1 fonction unique.
    Je sais récuperer le type de l'objet avec monTb.GetType() mais je ne sais pas créer un tableau de ce type et y récuperer le contenu de "monTb".
    J'ai regardé du côté de typeof mais je ne m'en sort pas (je suis débutant).

    merci pour votre aide.

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Connais-tu les generics ? Elles permettent d'écrire des méthodes qui peuvent s'appliquer à tout type.

    Dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static int TaFonction<T>(object monTB) // T est un type : short, string, Control, ...
    {
      T[] tab = (T[])monTb;
    ...
    }
     
    int machin = taFonction<short>(untruc);

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Connais-tu les generics ? Elles permettent d'écrire des méthodes qui peuvent s'appliquer à tout type.

    Dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static int TaFonction<T>(object monTB) // T est un type : short, string, Control, ...
    {
      T[] tab = (T[])monTb;
    ...
    }
     
    int machin = taFonction<short>(untruc);
    Euh tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static int TaFonction<T>(T[] monTB)

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    il semble que ce soit la bonne méthode mais j'ai 1 erreur sur la suite...

    if (tab[i] == 0)...provoque l'erreur "l'opérateur '==' ne peut pas être appliqué aux opérandes de type 'T' et 'int'

    merci pour votre aide.

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Ta fonction n'est faite que pour manipuler des types numériques ? Si c'est le cas, tu peux remplacer "0" par default(T).

    Petite explication de l'erreur que tu vois : la fonction générique que l'on t'a présentée peut fonctionner avec toute classe ou struct. 0 n'est comparable qu'aux types numériques : le compilore fuse donc.

    default(T) est la valeur par défaut du type T : dans le cas de int, c'est 0, pour les doubles, c'est 0.0, etc.

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    je commence à comprendre...

    les 2 types que j'attends sont Double ou short...
    Je veut passer en revue ts les éléments du tb et compter combien sont <>0.
    j'ai essayé
    if (tab[pos] == default(T)) mais ça j'ai l'erreur "l'opérateur == ne peut pas être appliqué aux opérandes de type 'T'

    une dernière touche d'aide pour en finir sera la bienvenue...

    est-ce que je pourrais tester avec default de tableaux de Date ?

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    j'ai trouvé 2 solutions, mais je ne sais pas laquelle utiliser :

    if (tab[i].Equals(default(T))) est accepté par le compilo.
    mais un forum dit que ca plantera si l'objet T est de type reference

    un autre forum parle de "IEquatable<T>" ou "IComparable<T>"

    une idée pour m'aider ?

  8. #8
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    En l'occurence, un tab[i].Equals(0) suffit peut être. Equals est une fonction de la classe object, elle est donc disponible par TOUS les objets, y compris les int, les double, ...

  9. #9
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    décidément ce sujet est bien complexe...

    le compilo refuse maintenant la syntaxe d'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonInt = MaFonction(monObjet, 8);
    ...
    MaFonction<T>(object o, int UnInt)
    j'ai l'erreur "les arguments de type pour la méthode MaFonction<T>(object, int) ne peuvent pas être déduits à partir de l'utilisation. Essayez de spécifier les arguments de type de façon explicite"

    j'ai aussi essayé avec ..(T[] o, int UnInt)...meme punition.

    ???
    AU SECOURS..!!!

  10. #10
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    quand t'aura deux minutes, lis un tuto sur les generics

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonInt = MaFonction<int>(monObjet, 8);
    MonInt = MaFonction<short>(monObjet, 8);

  11. #11
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Si tu veux comparer tes valeurs avec une certaine valeur par exemple un autre truc que 0 tu peux eventuellement passer à ta fonction la valeur avec laquelle comparer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static int TaFonction<T>(T[] monTB, T acompareravec)
    {
       if(T[3] == acompareravec)...
    }

  12. #12
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Eh non, ça ne marche pas, l'opérateur == n'est pas défini au niveau de object, d'où le besoin de passer par Equals

  13. #13
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Eh non, ça ne marche pas, l'opérateur == n'est pas défini au niveau de object, d'où le besoin de passer par Equals
    Oui mais je voulais juste parler du principe de passer la valeur à comparer en paramètre. Le principe est le même avec le Equals.

  14. #14
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut
    merci Guulh et Skyrunner.

    pour ce qui est des tutos sur les generics, c'est pas facile à trouver et ils sont souvent tres legers sur le sujet : j'en ai trouvé aucun qui parle des opérateurs par exemple.
    J'ai passé 2 journées entières à fouiller les forums pour trouver qq infos.

    Je résume la solution :
    L'appel de la Fonction se fait par :
    pour 1 tb de doubles : testeTbGen(Of Double)("Dbles", TblDble, 0)
    pour 1 tb de DateTime : testeTbGen(Of DateTime)("Date", TblDt, DateTime.MinValue)

    Le SUB :
    Sub testeTbGen(Of TypeGen)(ByVal NomTb As String, ByVal pMonTb() As TypeGen, ByVal ValATester As TypeGen)

    Le Test ds le SUB :
    If pMonTb(i).Equals(ValATester) Then nbVides += 1

    on ne peut pas tester .Equals(0) car ça ne marche pas avec les doubles (et biensûr encore moins avec les dates).
    Dans mon cas, on pouvait initilaliser ValATester ds la fn avec "Dim ValATester as TypeGen" qui vaudra la valeur par défaut de al variable (0...0,0...01/01/01...)
    Ca ne marche pas pour les string à cause de Equals qui plante avec nothing.
    dans ce cas, il faudra tester :
    "If pMonTb(i) Is Nothing OrElse pMonTb(i).Equals(ValDef) Then

    Avec les Generics, c'est 2 à 3 fois plus lent qu'en passant par 1 méthode propre à chaque type...mais faut avoir de grosses boucles pour que ce soit significatif.

    merci pour votre aide.

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

Discussions similaires

  1. Connaitre type objet, héritage tableau
    Par zeracoa dans le forum C++/CLI
    Réponses: 1
    Dernier message: 06/04/2013, 22h06
  2. convertion contour vers tableau ordonné ?
    Par shokotoreiki dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 11/05/2011, 18h59
  3. Récuperer objet dans tableau en fonction du champ d'un objet
    Par mowegan dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/10/2010, 17h04
  4. convertir un objet vers un tableau de byte
    Par zerocoolyoussef dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 19/02/2008, 23h11
  5. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34

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