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 :

Création d'un tableau


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut Création d'un tableau
    Bonjour,

    Je me pose une question:
    Actuellement, quand je veut utiliser une tableau (mono-dimension), je faisais comme ci dessous:
    Dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double* table;
     unsigned int lenght;
    Dans le constructeur du .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double* buffer = new double[lenght];
    table = buffer;
    Mais quand je veut faire un tableau double dimension, cela ne fonctionne plus en faisant comme ci dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double* buffer = new double[lenght][lenghtbis];
    table = buffer;
    Il y a t'il une manière plus intelligente de créer des tableaux ?

  2. #2
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Salut,

    Oui, c'est normal, tu ne peux pas instancier un tableau dynamique à 2 dim de cette façon.
    Penses à la logique des pointers qui est dernière. Un tableau de double à 2 dim est en fait un 1ier tableau de pointer sur double, où chaque cellule pointe sur un tableau de double.
    Pour instancier il faut donc le faire en deux fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      double** buffer = new double*[lenght];
      for(int i=0; i<lenght; ++i)
      {
        buffer [i] = new double[lenghtbis];
      }
    Plus généralement en C/C++ on évite les tableau à 2 dim en faisant un tableau a 1 dim et jouant sur le calcul :
    index_cellule = index_ligne * taille_ligne + index_col.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double *buffer = new double[lenght*lenghtbis];
    [...]
    // Index ligne 3 -- col 4
    double val = buffer[3*lenght+4];

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Peux-tu nous en dire un peu plus sur ton tableau ?
    L'une de ses dimensions est-elle fixe, ou susceptible de changer de taille ?
    S'agit-il d'une matrice, ou contient-il des données de natures hétérogènes ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Alors c'est une matrice dont les dimensions sont pas constante, et qui n'est pas carrée.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Pour les matrices, il vaut mieux utiliser une lib du genre d'OpenCV (ou Eigen++, mais il en existe d'autres) pour allouer/redimensionner/désallouer tes matrices sans fuites mémoires, et faciliter les opérations matricielles. On a souvent tort de réinventer la roue, en particulier pour la gestion de matrices en C++.

    Mais si tu avais eu un tableau avec une dim fixe (des coordonnées [X;Y;Z] par exemple) je t'aurais seulement conseillé de gérer un tableau 1D d'éléments struct Point { int x,y,z; }, d'où ma question.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Pour les matrices, il vaut mieux utiliser une lib du genre d'OpenCV (ou Eigen++, mais il en existe d'autres) pour allouer/redimensionner/désallouer tes matrices sans fuites mémoires, et faciliter les opérations matricielles. On a souvent tort de réinventer la roue, en particulier pour la gestion de matrices en C++.
    Oui ^^ Sauf quand un gentil professeur le désire =)

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Ah, je vois.
    Dans ce cas il vaut mieux partir sur l'un des exemples de djuju, si possible encapsulé dans un objet :

    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
     
    // Exemple grandement améliorable
    class Matrix {
    private:
      double* buffer;
      int width, height;
     
    public:
      Matrix() : buffer(nullptr), width(0), height(0) {}
      Matrix(int w, int h) : buffer(new double [w*h]), width(w), height(h) {}
      ~Matrix() { delete[] buffer; }
      double& at(int i, int j) { return buffer[i*width + j]; }
      void fill(double value) { std::fill(buffer, buffer+width*height, value); }
      void resize (int newwidth, int newheight) { /* code pas forcément trivial*/ }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // On crée une matrice de 20 par 30
    Matrix m(20,30);
    // On la remplit de uns
    m.fill(1.0);
    // On affiche un élément
    cout << m.at(10,20) << endl;

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

Discussions similaires

  1. Création d'un tableau d'objet
    Par chronos7 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 3
    Dernier message: 03/05/2006, 12h05
  2. Création d'un tableau dynamique avec XSL-FO
    Par lionelbrizuela dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/01/2006, 11h04
  3. [Tableaux] création d'un tableau arborescant
    Par peppena dans le forum Langage
    Réponses: 23
    Dernier message: 30/01/2006, 14h13
  4. Création dynamique de tableau.
    Par Yux dans le forum C
    Réponses: 6
    Dernier message: 05/11/2005, 16h24
  5. Création d'un tableau composé de TComboBox
    Par gilles641 dans le forum Langage
    Réponses: 1
    Dernier message: 26/07/2005, 10h30

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