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

Langage C++ Discussion :

Pointeur sur tableau 2D


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Pointeur sur tableau 2D
    Bonjour,
    Comme vous avez pu le voir mon problème provient du fait que je souhaite réaliser un pointeur sur un tableau 2 dimensions.
    Et là ça bug impossible de le faire fonctionner :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    error: cannot convert `int (*)[5][1]' to `int**' in initialization

    et voici mon code complet :
    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
    #include <iostream>
     
    using namespace std;
    void fonction(int ** adresse);
    int test = 6;
    int * ptest = &test;
    int tableau[5][1];
    int ** ptableau = &tableau;
    int ** ptabl;
    int ** ptable;
     
    int main()
    {
        tableau[1][1] = 2;
        cout << "valeur par action direct : " << test <<endl;
        cout << "adresse : " << ptest << endl;
        cout << "valeur par pointeur : " << *ptest <<endl;
        cout << "Tableu normal : " << tableau[1][1]<<endl;
        cout << "adresse tableau : " << ptableau <<endl;
        cout << "valeur tableau : "<< ptableau[1][1] <<endl;
        ptabl = ptableau;
        cout << "adresse tableau par tbl : " << ptabl <<endl;
        cout << "valeur tableau par tbl : " << ptabl[1][1] <<endl;
        cout << "appelle fonction"<<endl;
        fonction(ptableau);
        return 0;
    }
     
    void fonction(int ** adresse)
    {
        cout << "dans la fonction" << endl;
        ptable = adresse;
        cout << "adresse table : " << adresse <<endl;
        cout << "valeur table : "<< adresse[1][1] <<endl;
    }

    Merci pour d'avance votre réponse.

  2. #2
    Expert éminent sénior
    Vous utilisez déjà la STL, donc utilisez la class template vector.
    Ca sera bien plus simple.

  3. #3
    Membre actif
    Attention! Le premier élément d'un tableau se trouve à l'indice 0 et non 1.

    Donc :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    tableau[1][1] = 2;

    devrait être au moins
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    tableau[1][0] = 2;

    mais je suppose que c'est
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    tableau[0][0] = 2;

    que tu voudrais.

  4. #4
    Membre confirmé
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    int **ptableau = &tableau;


    Un pointeur sur un pointeur n'est pas un pointeur sur un tableau
    On ne peu accéder aux tableaux 2D de la sorte.

  5. #5
    Nouveau membre du Club
    Merci pour vos réponse
    Mon code étant donc complètement faux, auriez vous une solution pour appeler un tableau 2D dans une fonction, jusqu'à la cela semble simple mais je souhaite pouvoir changer le tableau que j’appelle (c'est pas clair )
    code faux juste pour la compréhension du problème :
    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
     
    #include <iostream>
     
    using namespace std;
    void fonction(int tableau);
    int tableau1[5][1];
    int tableau2[5][1];
    int tableau3[5][1];
    int choixuti;
     
    int main()
    {
       cout << "Choisissez votre tableau : " <<endl;
       cin >> choixuti;
       switch (choixuti)
       {
            case 1:
            fonction(tableau1);
            break;
            case 2:
            fonction(tableau2);
            break;
            case 3:
            fonction(tableau3);
            break;
       }
    }
     
    void fonction(int tableau)
    {
        //Partie complètement fausse puisqu'on ne peut appeler un tableau avec une variable
        cout << tableau[1][0] <<endl;
        //'tableau' n'est pas le nom d'un tableau mais celui de la variable que je fais entrer dans la fonction, variable dont le contenu est le tableau choisi par l’utilisateur 
    }

    Merci d'avance pour votre aide

  6. #6
    Membre expert
    Tu peus utiliser les template pour matcher le paramètre avec un tableau à 2 dimensions, ca te permet de récupérer les tailles :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<size_t N, size_t M>
    void foo(int (&tab)[N][M]) {}
    "We can solve any problem by introducing an extra level of indirection" Butler Lampson

    "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre)

  7. #7
    Membre confirmé
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    void fonction(int tableau[][1]);



    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void fonction(int tableau[][1])
    {
        cout << tableau[1][0] <<endl;    
    }


    Code valable que pour des tableaux de tableaux de dimension 1
    Attention à ne pas sortir des bornes du tableau (passer sa dimension comme paramètre à la fonction)

  8. #8
    Invité
    Invité(e)
    Bonjour,
    Les 3 lignes suivantes
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    int tableau1[5][1];
    int tableau2[5][1];
    int tableau3[5][1];
    veulent dire :"Je déclare 3 objets nommé tableau1, tableau2 et tableau3. Ces objets sont des tableaux. Chaque tableau contient 5 éléments. Chacun de ces 5 élément contient une valeur. Donc l'espace occupé par un tableau sera 5 * sizeof(int)
    La représentation pourrait être décrite ainsi
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tableau[0][0] 
    tableau[1][0] 
    tableau[2][0] 
    tableau[3][0] 
    tableau[4][0] 
    //Cela serait la même chose que
    int TAB[5];
    TAB[0] TAB[1] TAB[2] TAB[3] TAB[4]

  9. #9
    Rédacteur

    Regarde du coté de 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)

###raw>template_hook.ano_emploi###