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

SL & STL C++ Discussion :

vector<vector<char> > Matrice;


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut vector<vector<char> > Matrice;
    bonjour à tous,
    voila mon problème
    j'essaye de faire une matrice de string

    vector<vector<char> >matrice;
    puis
    je veux mettre une chaine
    char c[20];
    matrice.push_back(c);
    il me renvoie

    error C2664: 'push_back' : cannot convert parameter 1 from 'char [20]' to 'const class std::vector<char,class std::allocator<char> > &'
    Reason: cannot convert from 'char [20]' to 'const class std::vector<char,class std::allocator<char> >'
    No constructor could take the source type, or constructor overload resolution was ambiguous


    en fait je veux pas faire une matrice mais plutot un vecteur qui contient des chaine de caractère,cependant je crois que la solution c'est dans la matrice
    comment je doit faire.
    merci

  2. #2
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    Citation Envoyé par fatjoe Voir le message
    vector<vector<char> >matrice;
    puis
    je veux mettre une chaine
    char c[20];
    matrice.push_back(c);
    il me renvoie

    error C2664: 'push_back' : cannot convert parameter 1 from 'char [20]' to 'const class std::vector<char,class std::allocator<char> > &'
    Reason: cannot convert from 'char [20]' to 'const class std::vector<char,class std::allocator<char> >'
    No constructor could take the source type, or constructor overload resolution was ambiguous
    C'est tout à fait normal, dans la mesure où tu as créé un vecteur de vecteurs de chars et que tu essayes de l'utiliser comme un vecteur de tableaux de chars... Ceci devrait mieux fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<char> c (20);
    matrice.push_back(c);
    en fait je veux pas faire une matrice mais plutot un vecteur qui contient des chaine de caractère,cependant je crois que la solution c'est dans la matrice
    comment je doit faire.
    Personnellement, je ferais plutôt quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <vector>
    #include <string>
     
    // ...
     
    std::vector<string> vChaine;
     
    // ...
     
    const std::string c = "Chaine test";
    vChaine.push_back(c);
    Cela dit, est-ce que ce que tu fais ne serait pas plutôt une liste de chaîne --- alors l'ajout en fin de la structure de données est plus performant, par contre l'accès à un élément arbitraire de la liste nécessite de parcourir toute la liste de son début à l'élément lui-même. Si tel est le cas, alors je ferais plutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <list>
    #include <string>
     
    // ...
     
    std::list<string> vChaine;
     
    // ...
     
    const std::string c = "Chaine test";
    vChaine.push_back(c);
    À bientôt.

    Le Farfadet Spatial

  3. #3
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    merci ,

    mais je veux pas utiliser std::vector<string> vChaine;
    car par la suite je doit envoyé ça avec MPI
    et il n'existe pas un type string en MPI
    il existe que MPI_CHAR

    et si je fait std::vector<char> vChaine;
    ça me convient pas car c'est un vecteur de caractères
    c'est à dire chaque case contient un seul caractère et non pas une chaine de caractère

    ça me bloque vraiment

  4. #4
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    Citation Envoyé par fatjoe Voir le message
    et si je fait std::vector<char> vChaine;
    ça me convient pas car c'est un vecteur de caractères
    c'est à dire chaque case contient un seul caractère et non pas une chaine de caractère
    Dans ce cas, fait un vecteur de chaînes de caractères de type C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <vector>
     
    // ...
     
    std::vector<char*> vChaine;
     
    // ...
     
    char c [20] = "Chaine test";
    vChaine.push_back(c);
    Qu'est-ce que cela donne ?

    À bientôt.

    Le Farfadet Spatial

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    Salut,

    Je te conseille egalement le vector<string> ou (list<string> selon l'utilisation)
    Dans MPI tu peux envoyer sans probleme un tableau de charactere avec le pointeur de depart et la taille, aussi, dans ton MPI_Send tu auras qqch comme ca ("str" etant la string de ton vecteur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MPI_Send(..., MPI_CHAR, ... , str.data(), .., str.length(), ...);
    Je mets des '...' partout car je ne me souviens plus de la place exacte des arguments de MPI_Send. En tous les cas les infos dont a besoin MPI au niveau des donnees transmises sont :
    - le type de donnees : MPI_CHAR,
    - le pointeur sur le premier element a envoyer : str.data()
    - le nombre d'element du type plus haut a envoyer a partir du premier : str.length().

    Bon courage

  6. #6
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    Je reviens à la charge : non, finalement, n'utilise pas de vecteur de chaînes de caractères de type C, ce n'est pas une bonne idée. D'abord pour les raisons que donnent Manpe, ensuite parce que les strings ont un autre champ, qui renvoie la chaîne de caractères sous forme de chaîne de type C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string uneChaine = "Une chaine";
    char c [11] = uneChaine.c_str();
    À bientôt.

    Le Farfadet Spatial

  7. #7
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    en fait
    si je fait ça vector<string> v;
    puis MPI_Send

    MPI_Send(&v, v.size(), MPI_CHAR, int dest,int tag, MPI_Comm comm );
    ça marche pas il me renvoi une erreur lors de l'exécution, mais pour la compilation il me renvoi pas d'erreurs.

  8. #8
    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,

    La raison qui pourrait t'inciter à éviter la classe std::string sous prétexte que tu utilise une bibliothèque n'acceptant que des char* (ou similaires: ici MPI_CHAR, car je mettrais presque ma main au feu qu'il s'agit simplement d'un typedef ou d'une définition proche de #define char MPI_CHAR ) est une aberration en elle-même.

    En effet, la classe std::string est la manière la plus facile de gérer les chaines de caractères que tu pourra trouver, et, pour récupérer ta chaine sous forme "C style" (tableau de caractères terminé par un '\0'), il te suffit d'utiliser la méthode c_str() sur ta std::string.

    Ainsi, un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<std::string> stab;
    /*ajout de chaines de caractères */
    std::string str="ma chaine de caracteres";
    stab.push_back(str);
    te permettra sans aucun problème, quand tu voudra récupérer les chaines C style pour les utiliser avec ta bibliothèque, de travailler sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(size_t i=0;i<stab.size();++i)
    {
        MPI_send(/*...*/, stab[i].c_str(), /*...*/,stab[i].size();,/*...*/);
    }
    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

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    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 290
    Billets dans le blog
    2
    Par défaut
    Sinon, si tu préfère utiliser une matrice, il y en a une ici:
    http://www.developpez.net/forums/sho...48&postcount=3

    Ou sinon, avec boost.

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    C'est sur qu'avec une matrice ce serait bien plus simple.
    Cependant ca doit etre jouable avec un vecteur de string.
    Quelle erreur te renvoie MPI ? Peut-etre (et c le plus souvent ce type d'erreur que l'on commet avec mpi) que les processus "receveurs" n'attendent pas les bonnes donnees (cad paires MPI_Send/MPI_Recv mal definies) ?

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    Regarde boost.mpi
    http://www.boost.org/doc/libs/1_35_0/doc/html/mpi.html

    Ils ont interfacés MPI en C++. Je pense que tu trouvera des solutions à tous tes problèmes.
    Tu pourra utiliser des stings, des vector, ...
    Tu pourra mettre transmettre tes propre class

  12. #12
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    bonjour,
    voila, c'est à propos du vecteur de char
    ça marche nickel, mais si je fait le meme travail dans mon application ça marche pas, dans le send ou le vecteur prends toujours la dernière chaine,
    en fait j'ai fait une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    vector<char> buffer;
    string leopard;
    for(int y=0;y<75;y++)
    {//leopard change ici à chaque itération
    std::copy(leopard.begin(),leopard.end(), std::back_inserter(buffer));
    buffer.push_back('\0');
    }
    donc à la fin du boucle je trouve que la dernière chaine et non pas toute.
    avez vous une idée de l'origine du problème?
    merci

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par fatjoe Voir le message
    donc à la fin du boucle je trouve que la dernière chaine et non pas toute.
    avez vous une idée de l'origine du problème?
    merci
    salut.
    j'ai pas compris ton problème...

  14. #14
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    en fait, à la fin du boucle normalement le vecteur doit contenir toute les chaines
    , mais dans mon cas, je trouve juste la dernière chaine inséré et non pas toutes les chaines

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par fatjoe Voir le message
    en fait, à la fin du boucle normalement le vecteur doit contenir toute les chaines
    , mais dans mon cas, je trouve juste la dernière chaine inséré et non pas toutes les chaines
    comment le verifie tu?
    que te donne buffefr.size()?

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/05/2007, 00h20
  2. Réponses: 8
    Dernier message: 22/12/2006, 22h36
  3. vector de vector
    Par Clark dans le forum SL & STL
    Réponses: 15
    Dernier message: 07/04/2006, 20h11
  4. [ Vector Fichier ] Vector dans fichier texte
    Par geegee dans le forum Langage
    Réponses: 5
    Dernier message: 21/05/2004, 13h56
  5. [Vector] classe Vector et exception
    Par Nanoua dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 23/04/2004, 12h37

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