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 :

tableaux multidimentionnels en argument dans une fonction


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut tableaux multidimentionnels en argument dans une fonction
    Bonjour,
    j'ai créé un tableau multidimentionnel dans la fonction main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {...
    int** tableau=new int*[nbrcol];
    for (int i=0;i<nbrcol;i++)
    tableau[i]=new int[nbrlin]
    ...}
    j'aimerais à présent créer une fonction qui gère ce tableau (et qui est censée le faire à plusieurs reprises au cours du programme)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void remplicase(int col, int lin, int tableau[][])
    {...
    ...}
    Le compilateur n'a pas apprécié...
    si quelqu'un s'y connait ?...
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Ce n'est pas un tableau multidimensionnel que vous créez mais un "jagged array".
    Franchement, vous prenez pas la tête avec ces antiquités que sont les tableaux C.
    Utilisez de simples "std::array"
    http://fr.cppreference.com/w/cpp/container/array
    https://stackoverflow.com/questions/...ional-stdarray

  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,

    Ce code est fondamentalement buggé, et source de fuites mémoire potentielles: Il faut en effet savoir que new peut lancer une exception, si bien que le code de la fonction main réagirait de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {    ...
        /* pas de problème en cas d'exception: aucune allocation dynamique ne
         * semble avoir été effectuée ==>pas de fuite mémoire
         */
        int** tableau=new int*[nbrcol];
        for (int i=0;i<nbrcol;i++)
             /* oups: si exception, on perd l'accès à tableau et
              * à tous les tableau[x] ==> tableau[i-1]
              * ==>fuite mémoire "monstrueuse"
              */
             tableau[i]=new int[nbrlin]
    ...}
    De plus, il faut savoir que, quand tu essaye de créer un tableau à deux dimensions, de Lines lignes et de Cols colonnes, ce que tu cherches en réalité, c'est à pouvoir disposer de ... Lines * Cols éléments.

    L'idéal est donc de linéariser le tableau (voir à ce sujet ==>cette entrée dans la faq<== ... NOTE: il me semblait que l'on avait une entrée du style "linéarisé, plus performant ?", mais je ne l'ai pas retrouvée ) de manière à créer un tableau à une seule dimension contenant ces Lines * Cols éléments.

    L'idée pour accéder à un élément particulier étant d'utiliser la formule indice_element_recherche = indice_ligne * COLS + indice_colonne.

    NOTE: Cette entrée présente quelque chose de "roulé sous les aisselles"... L'idéal serait d'utiliser std::vector au lieu d'un pointeur (associé à l'allocation dynamique de la mémoire) pour data_
    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 actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut
    Bon alors pour être sûr d'avoir compris, ça veut dire que je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <vector>
    int main()
    {...
    vector <int> tableau (lin*col);
    ...}
    void remplicase (int col, int lin, vector<int> &tableau)
    {
    tableau[col*lin+lin]=....
    }
    et tout s'arrange ?

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut
    Ah voilà j'ai trouvé ça, qui m'explique bien où était la source mon problème :

    https://stackoverflow.com/questions/...=votes#tab-top

    Donc le plus simple est en effet de faire un tableau d'une seule dimension en utilisant lin*col+lin.

    Sinon pour ce qui est des éventuelles exeptions dues si j'ai bien compris à des risques de manque de mémoire, ne puis-je pas tout simplement mettre ça dans un bloc try ?

    Merci d'avance.

  6. #6
    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 Legro Voir le message
    Donc le plus simple est en effet de faire un tableau d'une seule dimension en utilisant lin*col+lin.
    Attention, c'est plus proche de ligne * MAXCOLONNES +colonne (ou ligne correspond à l'indice de la ligne qui t'intéresse, où colonne à l'indice de la colonne qui t'intéresse et où MAXCOLONNES correspond au nombre de colonnes que tu as dans ta matrice )
    Sinon pour ce qui est des éventuelles exeptions dues si j'ai bien compris à des risques de manque de mémoire, ne puis-je pas tout simplement mettre ça dans un bloc try ?
    Oh, si c'était aussi simple...

    Pour que cela fonctionne, il faudrait que tu récupère, au niveau du catch le nombre de fois où tableau[i] = new int [XXX] a effectivement fonctionné, pour que tu sois en mesure de libérer chacun des pointeurs qui ont été correctement alloués. Sans oublier de libérer correctement tableau (ton pointeur de pointurs)

    Pas de bol,voici à peu de chose près la situation dans laquelle tu risque de te trouver (les commentaires sont presque plus importants que le code ici )
    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
    int ** tableau = new int * [15];
    try{
        /* on essaye de réduire au maximum la portée des variable : le compteur de la boucle
         * n'est réellement intéressant... que dans la boucle
         */
        for(int i = 0; i<15; ++i){
            tableau[i]= new int[15];
       } // pas de bol, i n'existe plus à partir d'ici
    }catch( std::bad_alloc & e){
        /* pas de bol, i n'est pas accessible ici */
        for(int j=0; j<i; ++j){
            delete[] tableau[j];
        }
        delete[] tableau;
        throw(e);
    }
    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

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut
    Attention, c'est plus proche de ligne * MAXCOLONNES +colonne
    Oui merci, hier soir en mettant mon nouveau code à l'épreuve je me suis rendu compte de mon erreur en imprimant mon tableau sur la console ça me sortait un gros désordre mais j'ai fini par trouver la bonne formule

    Pour que cela fonctionne, il faudrait que tu récupère, au niveau du catch le nombre de fois où tableau[i] = new int [] a effectivement fonctionné, pour que tu sois en mesure de libérer chacun des pointeurs qui ont été correctement alloués.
    Ah oui merci, là je vois bien la galère, ça ne m'était pas du tout évident à première vue (ni après réflexion d'ailleurs ).

    Merci beaucoup pour votre aide !

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

Discussions similaires

  1. Arguments dans une fonction SI
    Par Ysandor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/08/2007, 17h04
  2. passage d'argument dans une fonction
    Par wadcyr8_197 dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2007, 09h41
  3. Généricité des Input Arguments dans une fonction
    Par RaphTIM dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/06/2007, 16h28
  4. Passer un tableau PHP en argument dans une fonction javascript ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 12h31
  5. Erreur d'argument dans une fonction
    Par rouliane dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/12/2006, 11h52

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