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 :

Tableau semi dynamique a 3 dimensions de types differents


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut Tableau semi dynamique a 3 dimensions de types differents
    Bonjour a tous,

    Voila je me remet tranquillement dans le c++ et la je bute sur une declaration de tableau :

    Est il possible de declarer un tableau a 3 dimensions sachant que la premiere dimension est de type string, que la 2 et la 3 sont de type int et que les dimensions 1 & 2 sont dynamiques ?
    En clair je souhaite creer un tableau t[string][int][int] de taille t[n][k][128] par exemple. Dois je passer par un vector ? tableau ? ... ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par ZeRiL
    Bonjour a tous,

    Voila je me remet tranquillement dans le c++ et la je bute sur une declaration de tableau :

    Est il possible de declarer un tableau a 3 dimensions sachant que la premiere dimension est de type string, que la 2 et la 3 sont de type int et que les dimensions 1 & 2 sont dynamiques ?
    En clair je souhaite creer un tableau t[string][int][int] de taille t[n][k][128] par exemple. Dois je passer par un vector ? tableau ? ... ?

    Merci d'avance.

    Moi je conseillerai le vector, mais si tu gère bien les tableaux à 3 dimensions, vas-y, c'est aussi bien, mais tu n'as pas intérêt de faire une erreur, et ca vient rapidement.

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Je n'ai pas de preference... vector, tableau ou autre peu importe... Mais puisque apparement il est possible de declarer un tel tableau/vector, c'est la declaration en elle meme du tableau/vector qui m'embete dans l'ímmediat apres l'utilisation j'vais me debrouiller

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Pour la première dimension, comme l'index est de type string, il faut passer par quelque chose comme std::map. Example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef std::vector<int> Tab1D;
    typedef std::vector<Tab1D> Tab2D;
    typedef std::map<std::string, Tab2D> Tab3D;
     
    Tab3D t;
    // ...
    t["toto"][4][2] = 10;

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Merci de ta reponse, a premiere vue cela me semble effectivement correspondre a mon besoin. Je teste

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par Sylvain Togni
    Pour la première dimension, comme l'index est de type string, il faut passer par quelque chose comme std::map. Example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef std::vector<int> Tab1D;
    typedef std::vector<Tab1D> Tab2D;
    typedef std::map<std::string, Tab2D> Tab3D;
     
    Tab3D t;
    // ...
    t["toto"][4][2] = 10;
    Intéressante ta solution.

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Par défaut
    Ha yes, j'avais presque abandonné les vector 3 dimensions hier car j'avais toujours des erreurs lors de la compilation. Je vais retester avec cette syntaxe.

  8. #8
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Bonjour,

    desole j'etais sur un autre probleme hier et je n'ai pas eu le temps de tester. La j'suis dessus mais j'ai des soucis pour l'insersion de donnees.
    En fait je suis oblige de passer par un tableau Tab2D avant d'attribuer celui ci a une ligne de Tab3D.
    Mes questions sont donc les suivantes :
    - Comment inserer un int dans Tab2D ?
    - Comment attribuer un Tab2D a Tab3D["toto"] ?

    Merci d'avance

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par ZeRiL
    Bonjour,

    desole j'etais sur un autre probleme hier et je n'ai pas eu le temps de tester. La j'suis dessus mais j'ai des soucis pour l'insersion de donnees.
    En fait je suis oblige de passer par un tableau Tab2D avant d'attribuer celui ci a une ligne de Tab3D.
    Mes questions sont donc les suivantes :
    - Comment inserer un int dans Tab2D ?
    - Comment attribuer un Tab2D a Tab3D["toto"] ?

    Merci d'avance
    int i;
    t2D.pushBack(i);
    t3D.pushBack(t2D);
    Je pense que ca marche

  10. #10
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Hmm sauf erreur de ma part, ta solution insere des elements un peu n'importe ou. En fait je veux inserer dans Tab2D a un endroit precis. je recupere des int dans un fichier que je dois stocker a la position Tab2D[i][j], i & j s'incrementant. Ensuite pour chaque fichier que je parcours, je veux attribuer le tab2D a tab3D[nom_du_fichier]. J'espere avoir ete clair.

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par ZeRiL
    Hmm sauf erreur de ma part, ta solution insere des elements un peu n'importe ou. En fait je veux inserer dans Tab2D a un endroit precis. je recupere des int dans un fichier que je dois stocker a la position Tab2D[i][j], i & j s'incrementant. Ensuite pour chaque fichier que je parcours, je veux attribuer le tab2D a tab3D[nom_du_fichier]. J'espere avoir ete clair.
    Oui, en dernière position, mais ma soluce est utile si tu ne fixe pas de taille à ton "tableau", alors que toi, la taille est fixée, donc...

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Si tu connais les dimensions du tableau à l'avance, tu peux faire quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tab2D tab2D(k, Tab1D(128)); // crée un Tab2D de taille [k][128]
    // remplissage des valeurs tab2D[i][j]
    tab3D[nom_du_fichier] = tab2D; // affectation

  13. #13
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Bon je vais la refaire

    Ce que je connais avant de lancer mon prog c`est le nombre de flotants (float ou int peu importe) sur une ligne. ceci est fixe : 132 (et non pas 128, mais idem c pas le plus important). Par contre je ne connais pas le nombre de lignes d'un fichier ni le nombre de fichiers passes en parametre du prog.

    Voici un exemple d'une ligne d'un fichier si ca peut vous aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    497.81 113.45 1.01 4.700 27 0 0 4 168 2 0 0 168 2 0 0 23 0 0 3 80 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 34 2 0 22 168 1 0 0 168 8 0 2 24 0 0 3 98 4 1 0 0 0 0 6 1 0 0
     0 0 0 1 1 38 0 15 101 162 0 0 5 168 1 0 3 14 0 0 25 95 1 0 0 0 1 2 9 2 0 0 0 0 0 0 0 19 0 18 37 7 1 80 41 168 3 0 0 0 0 16 91 59 6 1 1 0 1 0 6 0 0 2 0 0 0 0
     0
    Voici ce que doit faire ma fonction : je lui passe un fichier en parametre, je recupere chaque ligne, je la parse ensuite pour recuperer chaque float et je souhaite l'inserer dans un tableau 2 dimensions. La position de chaque float est importante, c'est pourquoi je souhaite inserer a une position tab2D[ligne][position_sur_la_ligne]. Ensuite, une fois que j'ai fini de parser le fichier, la fonction renvoie mon tab2D ainsi construit.
    J'attribue le tab2D renvoye a tab3D[nom_du_fichier] dans mon main et je recommence ainsi pour chaque fichier.
    C'est plus clair ?

  14. #14
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Citation Envoyé par Sylvain Togni
    Si tu connais les dimensions du tableau à l'avance, tu peux faire quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tab2D tab2D(k, Tab1D(128)); // crée un Tab2D de taille [k][128]
    // remplissage des valeurs tab2D[i][j]
    tab3D[nom_du_fichier] = tab2D; // affectation
    Ah j'avais pas vu ta reponse, desole. Apres avoir lu mon precedent post, penses tu que cela convienne si je recupere le nombre de lignes du fichier dans k ?

  15. #15
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef std::vector<std::vector<float> > Array2D;
    std::map<std::string, Array2D> Files;
     
    std::ifstream File("toto.txt");
    while (File)
    {
        std::vector<float> Line(132);
        for (int i = 0; i < 132 && File; ++i)
            File >> Line[i];
     
        Files["toto.txt"].push_back(Line);
    }
    Là j'ai fait au plus simple, si tu as des temps de chargement trop longs il y a moyen d'optimiser certains trucs.

  16. #16
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    2 mots : "Oaw" et "Merci"

    Ca marche du feu de dieu.
    Pour le temps d'execution, dans la mesure ou je fait appel auparavant a l'algo SIFT et ensuite a K-Means, ce n'est pas un probleme puisque de toutes facons le prog sera lent mais l'interet n'est pas la.

    Encore merci a tous de vos reponses.

  17. #17
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Citation Envoyé par Laurent Gomila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef std::vector<std::vector<float> > Array2D;
    std::map<std::string, Array2D> Files;
     
    std::ifstream File("toto.txt");
    while (File)
    {
        std::vector<float> Line(132);
        for (int i = 0; i < 132 && File; ++i)
            File >> Line[i];
     
        Files["toto.txt"].push_back(Line);
    }
    Là j'ai fait au plus simple, si tu as des temps de chargement trop longs il y a moyen d'optimiser certains trucs.
    Bonjour

    Je re-ouvre le post pour une autre petite question :

    Comment faire pour tester si Files["toto.txt"] existe avec la solution a Laurent ? Je ne connais pas du tout les map et je ne trouve pas la liste des fonctions accessibles.

    Merci.

  18. #18
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Resolu, il suffisait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if ( Files.find("toto.txt") == Files.end())
    {
    	//Erreur
    } 
    else
    {
            //Ok
    }

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

Discussions similaires

  1. Tableau semi dynamique n lignes, 2 colonnes
    Par paf26 dans le forum C++
    Réponses: 8
    Dernier message: 05/08/2014, 20h22
  2. Réponses: 0
    Dernier message: 18/03/2010, 15h27
  3. [XL-2003] Liste déroulante type tableau croisé dynamique
    Par zaza78 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/06/2009, 11h35
  4. tableau dynamique de deux dimensions
    Par lecamer dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 31/07/2008, 15h36
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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