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

MFC Discussion :

[MFC] Comment créer un tableau CStringArray dynamique à 2 dim


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut [MFC] Comment créer un tableau CStringArray dynamique à 2 dim
    Bonjour,

    Je voudrais créer un tableau CStringArray qui contiennent plusieurs listes de mots.
    Mais je ne connais pas au début le nombre de mots de chaque liste et je ne connais pas non plus le nombre de listes.
    Comment donc créer ce tableau à 2 dimensions ?
    Exemple : pour créer un tableau de 8 listes de mots, c'est comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CStringArray* tab;
    tab = new CSortStringArray[8];
    Mais pour créer un tableau de n listes de mots ?

  2. #2
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    créé une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <list>
    ....
     
    list<CStringArray> tab;
    tab.push_back(new CStringArray()); // remplace new CStringArray par le CStringArray a ajouter
    ...

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Tu peux imbriquer les conteneurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CArray<CStringArray, CStringArray> m_array;
    //utilisation:
    CString str = m_array.GetAt(i).GetAt(j);
    Plus drôle encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<CStringList> m_array;
    //utilisation:
    m_array.at(i).GetAt(j);
    etc...

  4. #4
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    r0d, pour ta première solution, Comment on ajoute un élément à la place i , j du tableau ?

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    et pourquoi pas un vector de vector ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector< vector<CString> > artable;

  6. #6
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    lol pourquoi pas mois je propose carré mement un vector de vector de vector de caractère s

  7. #7
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    ouh là là, toutes ces solutions ... je ne sais pas quoi choisir ...
    Mais ce qui serait sympa, c'est que, pour chaque solution, vous m'écriviez le code pour écrire et lire dans le tableau, parceque moi je suis un peu perdu, surtout que j'ai jamais utilisé de vector

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Sinon, dans le genre compliqué (mais qui marche, j'ai testé ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CArray<CStringList*, CStringList*> m_array;
        m_array.Add(new CStringList());
        m_array.GetAt(0)->AddTail("toto");
        CString str = m_array.GetAt(0)->GetAt(m_array.GetAt(0)->FindIndex(0));
    // => str="toto"

  9. #9
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    J'aimerais un truc simple, du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CStringArray** tab;
    tab=new CStringArray();
     
    tab[0][0].Add("Julien");
    tab[1][0].Add("informaticien");
    tab[0][1].Add("Chirac");
    tab[1][1].Add("président");
     
     AfxMessageBox(tab.GetAt(0).GetAt(0)); // "julien"
     AfxMessageBox(tab.GetAt(1).GetAt(0)); // "informaticien"
    AfxMessageBox(tab.GetAt(0).GetAt(1)); // "chirac"
     AfxMessageBox(tab.GetAt(1).GetAt(1)); // "président"

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    En ce qui me concerne, la solution de farscape est ma préférée, mais elle n'utilise pas la mfc (on est tout de même sur un forum visualc++ que diantre)

    La classe vector est un conteneur de la stl (standard library), elle appartient donc au namespace std.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <vector>
    using namespace std;
    [...]
    vector <vector<std:string>> m_array;
     
    // pour le remplir
    m_array.at(0) = new vector<std::string>;
    m_array.at(0).push_back("toto");
    m_array.at(0).push_back("titi");
     
    //pour le lire:
    std::string str = m_array.at(0).at(0); //str = "toto"
    str = m_array.at(0).at(1); //str = "titi"
    Tu peux aussi utiliser un CString à la place de std::string, comme ça tu aura un peu de mfc

    Hope it helps.

  11. #11
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    bah quoi mes vector de vector de vector de caractères ne te plaisent pas ?!

    plus sérieusement on t'as donné la solution
    [quote=r0d]Tu peux imbriquer les conteneurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CArray<CStringArray, CStringArray> m_array;
    //utilisation:
    CString str = m_array.GetAt(i).GetAt(j);

  12. #12
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Bon et si on peut pas faire ce que je veux simplement, je ferais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CStringArray* tab;
    tab = new CSortStringArray[1000];
    au moins je suis sûr que j'aurais pas plus de 1000 listes !

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    [quote=hiko-seijuro]bah quoi mes vector de vector de vector de caractères ne te plaisent pas ?!

    plus sérieusement on t'as donné la solution
    Citation Envoyé par r0d
    Tu peux imbriquer les conteneurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CArray<CStringArray, CStringArray> m_array;
    //utilisation:
    CString str = m_array.GetAt(i).GetAt(j);
    Euh non, ma solution ne fonctionne pas En effet, CStringList n'a pas de constructeur de recopie... il faudrait utiliser un CStringList*

  14. #14
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    c'est pas un CStringList qui est utilisé la ?! (j'ai aps testé je suis sou linux au stage :s)

  15. #15
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    [quote=hiko-seijuro]bah quoi mes vector de vector de vector de caractères ne te plaisent pas ?!

    plus sérieusement on t'as donné la solution
    Citation Envoyé par r0d
    Tu peux imbriquer les conteneurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CArray<CStringArray, CStringArray> m_array;
    //utilisation:
    CString str = m_array.GetAt(i).GetAt(j);
    D'accord, alors par exemple pour ajouter un mot à la liste, tu fais

    mais pour ajouter une liste, tu fais comment ?
    (m_array.Add.Add ne marche pas)

  16. #16
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    [quote=julien.nasser]Bon et si on peut pas faire ce que je veux simplement, je ferais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CStringArray* tab;
    tab = new CSortStringArray[1000];
    [edit]j'ai écris n'importe quoi... je retourne bosser [/edit]

  17. #17
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    Pour la solution de farscape, j'ai undeclared identifier pour
    vector <vector<CString>> m_array;
    et j'ai bien mis le #include <vector>

  18. #18
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    rajoute ca en dessous de tes includes:

  19. #19
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    j'ai rajouté le using namespace std
    j'ai cette erreur toujours à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector <std::vector<CString>> montab;
    erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    syntax error : missing ',' before identifier 'montab'

  20. #20
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Bon, reprenons.

    en effet, le std::vector<std::vector<CString>> en fonctionne pas. Je ne sais pas pourquoi, je me renseignerais ultérieurement.

    Je pense que le plus simple est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CStringList*> montab;
    Pour écrire dedans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CStringList pList1 = new CStringList();
    pList1.AddTail("toto");
    pList1.AddTail("tata");
    montab.push_back(pList1);
    CStringList pList2 = new CStringList();
    pList2.AddTail("tutu");
    montab.push_back(pList2);
    Pour lire dedans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    str = montab[0].GetAt(montab[0].FindIndex(0)); // str = "toto";
    str = montab[0].GetAt(montab[0].FindIndex(1)); // str = "tata";
    str = montab[1].GetAt(montab[1].FindIndex(0)); // str = "tutu";
    Bon ce n'est pas terrible, mais cela fonctionne.

Discussions similaires

  1. [XL-2003] Comment créer un tableau croisé dynamique de 10 en 10 ?
    Par spacesheep dans le forum Conception
    Réponses: 1
    Dernier message: 25/06/2010, 09h28
  2. Comment créer un tableau dynamique ?
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 01/01/2009, 13h35
  3. MFC : comment créer dynamiquement des boutons?
    Par olator dans le forum Mobiles
    Réponses: 0
    Dernier message: 23/10/2008, 19h05
  4. Comment créer un tableau dynamique ?
    Par khokho dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/08/2007, 08h40
  5. Réponses: 9
    Dernier message: 22/06/2006, 20h06

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