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 dynamiques


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut tableaux dynamiques
    Bonjour,

    j'aimerais que quelqu'un m'explique comment je puisse faire pour avoir un tableau dynamique qui soit une variable membre d'une classe.

    En gros que j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class toto
    {
    public:
             int *tab = new int[longueur][largeur];
    ...};
    Sachant que longueur et largeur ne sont pas des constantes, ce sont des variables défini dans le constructeur :/ Plz je sais ke je suis pas klr, mais c ke j'ai un ptit soucy! Merci à vous


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  2. #2
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    plutôt que d'utiliser des tableaux je te conseille les "vectors"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <vector>
    using namespace std;
    class toto
    {
        vector<vector<int> > tab;
    public:
        toto(int longueur, int largeur)
        {
            tab.resize(longueur);
            for(int i=0 ; i<longueur ; i++) tab[i].resize(largeur);
        }
        ...
    };
    a++ jmv
    PS : j'ai pas testé

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    c'est bon
    juste quelques remarques

    - il faut éviter using namespace dans les .h, ça enlève l'intérêt des namespace. vaut mieux using std::vector.

    - si un jour on décide de changer le nom de la variable 'longueur' ça suppose dasn ton code de faire la modif partout. autant remplacer quand on peut par tab.size().

    - si on veut un constructeur sans paramètre, il suffit de donner une valeur par défaut aux dimensions du tableau

    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
    #include <vector>
    using std::vector;
     
    class toto
    {
       private:
         vector<vector<int> > tab;
     
       public:
         toto(int longueur = 0, int largeur = 0)
         {
            tab.resize(longueur);
            for(int i=0 ; i<tab.size(); i++) tab[i].resize(largeur);
        }
        ...
    };


    et conseils pour Mynautor:
    - la question des tableaux dynamiques est abordée
    - règles du forum : le style SMS dans les posts est en principe interdit, toléré avec parcimonie. ça rebute les gens qui voudraient t'aider.

    bonne nuit

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    J'ai pas trop envie de m'enbarker dans la stl, mais ce que tu me dis semble marcher! Tu aurais pas une solutions avec un simple tableau?
    Ou est ce que tu me le conseils pake ce ke je souhaite faire nest pas possible?

  5. #5
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    si c'est possible, si tu y tiens vraiment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class toto
    {
        int **tab;
    public:
        toto(int longueur = 0, int largeur = 0)
        {
            tab = new (int*)[longueur];
            for(int i=0 ; i<longueur ; i++)
                 tab[i] = new int[largeur];
        }
        ....
    };
    toujours pas testé, dsl

    bigboomshakala >> +1 pour tes remarques

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    Ouai ok double pointeur c pas très sexy tout sa! ;D
    je vais faire pro et utiliser la classe vector mais eu ....... comment ke je déclare un tableau à double entré avec ce fameux vector!
    Pardon pardon pardon pour ces questions, mais tellement de truc a faire en 2 heures
    merci encore

  7. #7
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    avec un tableau style tab[...] tu es obligé de donner la dimension dans l'implémentation. il faut connaître de suite la place à allouer.

    ou alors tu peux utiliser des pointeurs.

    sinon le plus simple (dès qu'on commence à l'utiliser) c'est le vector.
    en plus c'est le seul tableau dont tu peux récupérer la valeur (tab.size()), si tu utilises autres chose (int ** tab, int tab[][]) tu dois sauvegarder la taille quelquepart si tu en as besoin).
    avec le vector tu peux également ajouter des éléments si la taille donnée n'est pas suffisante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private:
       int ** tab;
     
    public:
       toto(int x,int y)
       {
          tab = new int*[x];
          for (int i=0;i<x;i++) tab[x] = new int[y];
       }
     
    // ne pas oublier les delete dans le destructeur !!

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    ha ha il a été plus rapide à répondre

  9. #9
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par Mynautor
    comment ke je déclare un tableau à double entré avec ce fameux vector!
    pour la déclaration, c'est dans la classe !!!

    je suppose que tu voulais parler de l'utilisation :
    ça marche comme les tableaux :

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    ok! Merci pour votre précieuse aide!
    Put1 faudrait que je me plonge dans la STL un de c 4.
    bonne nuit

    #include <nuit>
    ok je vais me coucher ;D

  11. #11
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    bigboomshakala >> encore +1 pour tes remarques donc :

    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
    class toto 
    { 
        int **tab; 
        int lng, larg;
    public: 
        toto(int longueur = 0, int largeur = 0) : lng(longueur), larg(largeur)
        { 
            tab = new (int*)[lng]; 
            for(int i=0 ; i<lng ; i++) 
                 tab[i] = new int[larg]; 
        } 
        ~toto()
        {
            for(int i=0 ; i<lng ; i++) delete [] tab[i];
            delete [] tab;
        }
        .... 
    };
    reste encore à tester longeur et largeur (ça serait génant qu'il soient négatifs )

  12. #12
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    J'ai une erreur de compilation plutôt incongru

    jai déclaré un tableau dynamique "toto" de type vector. Dans le constructeur je l'allou de taille n!
    toto.resize(n);

    Dans une autre fonction je fais seulement une attribution de valeur (de type toto[1] = 1 et j'obtiens alors l'erreur suivante a la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2679: '=' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'int' (ou il n'existe pas de conversion acceptable)
    une explication rationnelle?

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    jmv, ce code est incorrect. La solution correcte (du genre à vacciner contre les new[] et delete[]) est normalement traitée dans la FAQ.

    Mynautor, il faudrait voir le code exact qui te provoque cette erreur (déclaration du vecteur + l'affectation). A priori je dirais que tu n'as pas un vecteur d'entiers.

    Sinon, pour les tableau de dimension > 1, il y a des classes dédiées (non standard) qui sont bien plusadpatées (à mon goût) que les vecteurs de vecteurs (-> boost.multi_array, blitz++.array, boost.ublas.array, ......)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  15. #15
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Sinon, pour les tableau de dimension > 1, il y a des classes dédiées (non standard) qui sont bien plusadpatées (à mon goût) que les vecteurs de vecteurs (-> boost.multi_array, blitz++.array, boost.ublas.array, ......)
    : ne vaut-il pas mieux qu'il commence doucement avec le STL?
    il débute en C++ je pense, et le perdre dans la jungle des bibliothèques risque de le dégoûter

  16. #16
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par Luc Hermitte
    jmv, ce code est incorrect.
    oui effectivement la ligne tab = new (int*)[lng]; ne passe pas, il faut enlever les parenthèses. Mais à part ça je vois rien d'autre.

    Donc code corrigé :
    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
    class toto 
    { 
        int **tab; 
        int lng, larg; 
    public: 
        toto(int longueur = 0, int largeur = 0) : lng(longueur), larg(largeur) 
        { 
            tab = new int*[lng]; 
            for(int i=0 ; i<lng ; i++) 
                 tab[i] = new int[larg]; 
        } 
        ~toto() 
        { 
            for(int i=0 ; i<lng ; i++) delete [] tab[i]; 
            delete [] tab; 
        } 
        ...
    };
    désolé, je n'avais pas la possibilité de tester hier, j'avais prévenu.

    Mynautor >> tab[1] n'est pas un entier mais un pointeur d'entier, c'est bien un tableau à 2 dimensions que tu voulais faire ? tu dois écrire quelque chose comme ça : Je pense que tu devrais te mettre à la STL, les pointeurs de pointeurs c'est de l'acrobatie sans filet !
    [EDIT] n'importe quoi, j'ai mal lu ton poste [/EDIT]

    Comment tu déclare ton vector toto ?

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par jmv
    Citation Envoyé par Luc Hermitte
    jmv, ce code est incorrect.
    oui effectivement la ligne tab = new (int*)[lng]; ne passe pas, il faut enlever les parenthèses. Mais à part ça je vois rien d'autre.
    Apparemment tu n'as pas consulté la FAQ comme il te l'avait suggéré.

    http://c.developpez.com/faq/cpp/?pag..._new_array_dim

    C'est là qu'on voit l'interêt d'utiliser une classe qui fait tout ça pour nous.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    mon tableau je le déclare comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<int> > openList;
    Puis dans le constructeur, je le rempli dynamiquement d'une taille longueur*largeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openList.resize(longueur*largeur);
    Ensuite dans une autre fonction je fais un simple:

    Le programme se compile, mais il me génère l'erreur de génération :/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2679: '=' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'int' (ou il n'existe pas de conversion acceptable)
    [/code]

  19. #19
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2679: '=' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'int' (ou il n'existe pas de conversion acceptable)
    openList[1] est un vector, pas un entier.

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 37
    Points
    37
    Par défaut
    oui donc que dois je faire?

Discussions similaires

  1. [D2005]Problème de tableaux dynamique
    Par Laurent Dardenne dans le forum Delphi .NET
    Réponses: 8
    Dernier message: 26/07/2005, 11h56
  2. Tableaux dynamiques
    Par sebduth dans le forum Fortran
    Réponses: 5
    Dernier message: 05/07/2005, 15h36
  3. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2004, 23h23
  4. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 22h00
  5. [Kylix] Tableaux dynamiques sour Kylix2
    Par Krän dans le forum EDI
    Réponses: 6
    Dernier message: 07/10/2003, 14h31

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