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 :

passage de tableaux à deux dimensions


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut passage de tableaux à deux dimensions
    salut,

    est ce qu'il y a une méthode pour passer un tableaux à deux dimensions en paramétre d'une fonction sans spécifié les dimensions ???

    merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Avec une fonction template oui, ça ne pose aucun problème.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Si, par "tableau deux dimensions" tu entend "tableau C style deux dimensions", oui, effectivement, c'est faisable.

    Cela se fait en passant un pointeur de pointeur sur le type contenu dans ton tableau.

    Cependant, il s'agira de fournir deux informations supplémentaires à la fonction: la taille de chacune des dimensions envisagée.

    Au final, ta fonction pourrait ressembler à (adaptée ici à l'utilisation d'un tableau deux dimensions contenant des entiers)
    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
     
    /* fonction qui travaille sur un tableau d'entiers à deux dimensions
     * \in : int ** tab2D : pointeur sur le tableau en question
     *      size_t col : nombre de colonnes du tableau
     *      size_t row : nombre de lignes du tableau
     */
    void fonction(int **tab2D, size_t col, size_t row)
    {
        for(size_t ligne = 0;ligne<row;++i)
        {
            for(size_t colonne = 0; colonne < col; ++i)
            {
                cout<<tab2D[ligne][colonne]<" ";
            }
            cout<< endl;
        }
    }
    Ceci dit, il est très facile de remplacer un tableau à deux dimensions par un tableau à une seule: créer un tableau de dimension unique composé de lignes * colonnes éléments.

    Plutôt que d'accéder au tableau sous la forme de tab[ligne][colonne], on y accède sous la forme de tab[ligne*colonne_max + colonne]

    L'avantage, c'est que l'on ne doit pas commencer à jouer avec des pointeurs de pointeurs quand il s'agit de passer ce tableau comme paramètre à des fonctions

    Enfin, il est aussi possible d'utiliser la classe qui fournit tous les comportement d'un tableau: la classe vector, disponible dans l'espace de noms std par inclusion du fichier d'en-tête <vector>.

    Tu Le raisonnement précédent (celui de considérer ton tableau comme contenant lignes * colonnes élément) est toujours envisageable, mais tu peux aussi envisager de créer un vecteur de... vecteurs du type à contenir sous une forme proche (pour des entiers ici) de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::vector<int> > tab2D;//remarque l'espace entre les deux >
    mais cette manière de faire est souvent plus "ardue" à mettre en oeuvre

    [EDIT]Et j'ai failli oublié: il existe certaines bibliothèques qui fournissent des classes "matrice", qui pourraient également remplacer assez avantageusement les tableaux à deux dimensions
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    salut,

    oui ,c'est bien ça ce que je cherche. Manipuler des matrices (les passées en parmétres à des fonctions...)

    tu peux m'expliquer de plus sur ces matrices ou même me donné un lien??


    merci pour les réponses

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Matrice au sens mathématique de la chose ou au sens tableau 2 dimensions ?
    1er : boost::ublas
    2eme: boost::multi_array.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    koala1, un pointeur vers un pointeur n'a rien à voir avec un tableau de tableaux.

    Voici donc la solution dont j'ai parlé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T, std::size_t N, std::size_t M>
    void foo(T (&tab)[N][M])
    {
    }
    La fonction générique foo prend donc n'importe quel tableau de tableaux de n'importe quel type, avec tailles détectées automatiquement.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par loufoque Voir le message
    koala1, un pointeur vers un pointeur n'a rien à voir avec un tableau de tableaux.
    Dans l'absolu, ne ne dis pas... mais dans la triste réalité, il n'est pas rare de constater un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    letype ** mat;
    mat = new letype[nombre_ligne];
    for(int i=0; i<nombre_llgne;++i)
    {
        mat[i]= new letype[nombre_colonne];
        for(int j=0;j<nombre_colonne;++j)
        {
            mat[i][j] = blabla (avec la logique permettant de donner une valeur cohérente) ;
        }
    lorsque les gens veulent implémenter un tableau à deux dimensions ...

    Dés lors, il semble cohérent de transmettre ce genre de tableau sous la forme de pointeurs de pointeurs

    En outre, je ne nie pas l'utilité des fonctions template, mais, encore une fois, il reste malgré tout *relativement* rare qu'une personne qui pose une question aussi "basique" (soit dit sans offence à l'adresse de afnane) n'ait besoin de manipuler des quantités énorme de tableaux deux dimensions dont les objets sont de types différents
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. decalaration dynamique tableaux deux dimensions et TRI
    Par Alex35 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/12/2007, 13h48
  2. [Problème]Tableaux deux dimensions
    Par maloute80 dans le forum Langage
    Réponses: 4
    Dernier message: 14/12/2007, 14h31
  3. Passage de tableau à deux dimensions dans une session
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 28/11/2006, 18h42
  4. [Tableaux] Gerer des tableaux à deux dimensions
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2005, 15h20

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