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 :

Surcharge de constructeur - tableaux multidimensions


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut Surcharge de constructeur - tableaux multidimensions
    Bonjour !

    Je suis un petit nouveau de deux jours en C# alors pardonnez mon ignorance.

    Je cherche à construire une petite classe toute simple. Cette classe me retourne un tableau de nombres aléatoires, elle instancie l'interface IEnumerable et IEnumerator pour pouvoir passer le tableau de la classe comme argument à MSChart.
    La classe que j'ai construite fonctionne très bien, mais pour l'instant mon constructeur ne me retourne qu'un tableau à 1 dimension :

    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
     
    private class NbAleaUnif : IEnumerable
            {
                private double[] tab_alea; //tableau des nombres aléatoires
                private int dimension; //dimension du tableau
     
                public NbAleaUnif(int dim) //constructeur
                {
                    dimension = dim;
                    tab_alea = new double[dim];
                    Random alea = new Random(); //générateur de nombres aléatoires
                    for (int i = 0; i < dim; i++)
                    {
                        tab_alea[i] = alea.NextDouble();
                    }
                }
     
                public IEnumerator GetEnumerator()
                {
                    return new nombreAleatoireEnumerator(tab_alea);
                }
     
                private class nombreAleatoireEnumerator : IEnumerator
                {
                    private int _index;
                    private double[] _alea;
     
                    public nombreAleatoireEnumerator(double[] numbers)
                    {
                        _alea = numbers;
                        _index = -1;
                    }
     
                    public void Reset()
                    {
                        _index = -1;
                    }
     
                    public bool MoveNext()
                    {
                        _index++;
                        return _index < _alea.Length;
                    }
     
                    public object Current
                    {
                        get { if(this._index < _alea.Length)
                                  return _alea[_index];
                              else throw new IndexOutOfRangeException();
                        }
                    }
                }
            }
    J'aurais aimé avoir un second constructeur mais qui cette fois prenne deux arguments, disons dimL et dimC pour me retourner une matrice de nombres aléatoires. Je sais comment surcharger un constructeur, mais là en plus il faudrait que le type de l'objet retourné soit différent, là est mon problème. De plus, j'imagine qu'il va y avoir un problème avec l'itérateur et l'indexeur, alors comment est-ce que je peux "dealer" avec ça ?

    Merci pour vos réponses éclairées !!

  2. #2
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Pour ce faire, il faut faire un tableau à n d ou jagged
    je ne suis jamais allé au delà de 2d, mais je pense que c'est possible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[,] monTab = new int(2,3);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int [][] monJaggedTab = new int[2][3];
    accessoirement est ton ami : msdn te donne toutes les infos. Tu as même des explications en suivant les liens.


    Edit : désolé, je n'avais pas bien lu la question, je pense.

  3. #3
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Merci pour la réponse...

    Je sais comment déclarer/instancier un tableau de plusieurs dimensions, ce n'est pas le souci. Ma question était plutôt est-il possible et comment déclarer quelque chose du style :

    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
    private class NbAleaUnif
            {
                private ??? tab_alea; //tableau des nombres aléatoires de dimension non définie?
     
                public NbAleaUnif(int dim) //constructeur
                {
                    tab_alea = new double[dim];
                }
    
                public NbAleaUnif(int dimL, int dimC) //constructeur
                {
                    tab_alea = new double[dimL,dimC];
                }
    }
    Je sais pertinemment que ce code est on ne peut plus faux, mais je cherche un moyen de faire ce genre de choses. En gros, je voudrais pouvoir faire une classe qui fonctionne comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //dans le main
    NbAleaUnif tableauAleatoire = new NbAleaUnif(100); //tableau de 100 nombres aléatoires
    NbAleaUnif matriceAleatoire = new NbAleaUnif(100,100); //matrice de 100x100 nombres aléatoires

    Une dernière question qui pourrait en fait résoudre mon problème maintenant que j'y pense.... Est-ce que le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double[,] tab = new double[100,1];
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double[] tab = new double[100];
    ??

  4. #4
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    bon j'ai ma réponse pour la dernière partie de la question, évidemment les déclarations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double[] tab = new double[n];
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double[,] tab = new double[n,1];
    ne sont pas équivalentes et on ne peut pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double[,] tab = new double[n,1];
    tab[5]=5;
    ce qui est bien dommage puisque j'aurais réglé mon problème...

  5. #5
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    pourquoi ne pas utiliser le polymorphisme ?
    une classe de base, avec ses méthodes abstraites, virtuelles etc.
    des classe héritée embarquant le bon tableau, et hop !

    Mon idée est peut-être saugrenue, mais elle pourrait te rendre service, couplée au pattern strategy.

  6. #6
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Au lieu d'un constructeur, qui n'a pas de sens pour des objets différents, pourquoi ne pas simplement faire :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public double[] CreateAleaUnif(int dim)
                {
                    return  new double[dim];
                }
     
    public double[,] CreateAleaUnif(int dimL, int dimC)
                {
                    return new double[dimL,dimC];
                }

    Sinon, passer par une factory ? Mais si tu débutes ça risque d'être un peu compliqué à implémenter...

  7. #7
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Ou alors tu mets tab_alea comme type object...
    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
     
    class Program
    	{
     
    		public object tab_alea;
     
     
    		public Program(int dim)
    		{
    			tab_alea =  new double[dim];
    		}
     
    		public Program(int dimc, int diml)
    		{		
    			tab_alea = new double[dimc,diml];
    		}
    		public static void Main(string[] args)
    		{
     
    			Program p =new Program(100);
     
    			Program p2 = new Program(100,100);
     
     
    		}
     
    	}
    Par contre pour l'exploitation cela va être autre chose, il faudra à priori user de transtypage et/ou créer des getters/indexeurs...

  8. #8
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Citation Envoyé par Er3van Voir le message
    Au lieu d'un constructeur, qui n'a pas de sens pour des objets différents, pourquoi ne pas simplement faire :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public double[] CreateAleaUnif(int dim)
                {
                    return  new double[dim];
                }
     
    public double[,] CreateAleaUnif(int dimL, int dimC)
                {
                    return new double[dimL,dimC];
                }


    Sinon, passer par une factory ? Mais si tu débutes ça risque d'être un peu compliqué à implémenter...
    ça serait en effet une solution intéressante si je ne voulais pas d'une classe et ses méthodes...

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

Discussions similaires

  1. Surcharger un constructeur de classe
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/11/2006, 10h17
  2. [POO] Surcharge de constructeur
    Par loganblack dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2006, 12h26
  3. Réponses: 19
    Dernier message: 19/04/2006, 10h16
  4. [POO] surcharger le constructeur
    Par wdionysos dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 15h42
  5. Surcharge de constructeur???
    Par Sunsawe dans le forum Général Python
    Réponses: 3
    Dernier message: 14/03/2006, 17h26

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