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++

  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
    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.

  9. #9
    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) ?

  10. #10
    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

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    Au temps pour moi, l'erreur est dans le code que tu as envoye :

    vector<string> v
    MPI_Send(&v, v.size(), MPI_CHAR, int dest,int tag, MPI_Comm comm );
    &v n'est en aucun cas l'adresse d'une string ! Encore moins celle d'un tableau de carateres!

    Je verrai plutot un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string str = v.at(position);
    MPI_Send(str .data(), str.length(), MPI_CHAR, int dest,int tag, MPI_Comm comm );
    ou str.c_str() comme le disait Farfadet au lieu de str.data().
    Dans ton code tu essayai d'envoyer le vecteur en entier :
    &v : adresse du vecteur
    v.size() : taille du vecteur

  12. #12
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    oui je voudrais envoyé un vecteur de string et non pas un simple string

    pour le recv je fait:

    MPI_Recv(&vChaine, vChaine.size(), MPI_CHAR , MPI_SOURCE,MPI_TAG, MPI_COMM_WORLD,&status);

    il me renvoi l'erreur message truncated

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    hmn ... tout envoyer d'un coup : difficile avec une structure de vecteur. En effet, si tu veux TOUT envoyer avec une seule commande Send tu devra concatener toutes tes chaines les une a la suite des autres avec les bons separateurs pour decoder tout ca a l'arrivee ... bref, HORRIBLE !
    Tu dois faire une boucle comme l'a dit koala01.
    Sinon, pour ton Recv, aucune chance que ca marche :
    MPI_Recv(&v, v.size(), MPI_CHAR , MPI_SOURCE,MPI_TAG, MPI_COMM_WORLD,&status);
    Comment est defini v pour le processus receveur ? Comment peux-tu connaitre la taille de la chaine recue v.size() (dans le cas ou v est la chaine) sans l'avoir recue ?
    La methode dans ce cas est de definir un buffer au niveau du processus receveur, de taille definie et qui limite la taille d'envoi des donnes :
    par exemple !
    si ta string est plus courte que 100 caracteres, ca fonctionnera. Si elle est plus longue elle sera tronquee lors de la reception.
    Je te conseille de te plonger dans la doc MPI pour bien en comprendre les mecanismes qui ne sont pas si intuitifs qu'ils n'y parait !

    Bon coruage

  14. #14
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    1- dans le cas ou vector<int> ça marche nickel
    je peux l'envoyé d'un seul fois sans boucle
    2- pour la taille de vector il est simple
    je peux le définir avant l'envoi et avan la réception
    vector<char* >V(50);
    mais c'est pas ça le problème
    3- si &v n'est pas une adresse alors c'est quoi?

  15. #15
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par défaut
    &v n'est en aucun cas l'adresse d'une string
    c'est une adresse oui, mais c'est celle de ton vecteur qui n'est pas forcement celle d'une string ou alors celle de la premiere uniquement.
    Tu sembles confondre 2 chose : ton vecteur et ses elements.
    v.size() te donne le nombre de chaines de caracteres que tu as dans ton vecteur. Ca n'a rien a voir avec leur longueur !
    Donc
    vector<char* >V(50);
    ne te donne aucune info sur la longueur des chaines dans ton vecteur.
    1- dans le cas ou vector<int> ça marche nickel
    je peux l'envoyé d'un seul fois sans boucle
    C'est parce que dans tes cases memoires contigues (et je pense que tu as du simplement ajouter des elements int a la suite les uns des autres sans faire de delete ou insert ...). Dans le cas de tableau de caracteres les differentes chaines ne seront pas forcement stockees dans des cases memoires contigues, donc MPI ne pourra pas les envoyer en une seule fois !
    Peut-etre peux-tu nous poster le code du master et celui des slaves pour cette operation specifique pour voir ce qui cloche ?
    Neanmoins je pense que tout ce dont tu as besoin a ete dit dans ce topic.

  16. #16
    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
    Bonjour fatjoe.
    Dans la plus part de tes anciens poste, tout ceci t'avais déjà été plus ou moins expliqué.
    Tu devrait prendre un peu de temps pour te remettre à niveau en C++ car tu mélange une peu tout. Tu semble vouloir faire du C avec du C++.
    Regarde ces parties du site
    http://cpp.developpez.com/cours/
    http://cpp.developpez.com/livres/
    http://cpp.developpez.com/faq/

    Tu trouvera beaucoup de chose. Et bien sur utilise le forum comme complément

    Yan

  17. #17
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    non, j'ai rien confondu,
    je sais que &v c'est l'adresse du vecteur, c'est pas moi qui a dit "c'est pas une adresse"
    puis pour la taille je la confond pas
    je sais que c'est la taille du vecteur, c'est vous qui m'as dit comment initialisé la taille du vecteur
    ma question est juste comment envoyé un tableau de string avec mpi
    jusqu'ici personne ne m'as donné une idée pour la faire
    et je craint que ça ce fait pas.
    merci pour tous

  18. #18
    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
    ma question est juste comment envoyé un tableau de string avec mpi
    jusqu'ici personne ne m'as donné une idée pour la faire
    ????? tu plaisante???
    Pourtant tu as des solutions.

    et je craint que ça ce fait pas.
    Pas tel qu'elle.
    Tu envoie tes string sous forme de char* (myStr.c_str() ) qui seront recu et reconvertie en string.

    Ne prend pas mal mes remarques.
    Ce ne sont que des constatations et je dit ça pour toi.

    Monter le code d'envoie et de reception que tu as fait. On pourra te dire ce qui va et ne va pas

  19. #19
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    en fait ce que vous m'avez dis, c'est l'envoi d'un seul string
    je l'ai fait depuis longtemps, et ça marche
    et je veux pas faire une boucle pour envoyé mes string

  20. #20
    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 ce que vous m'avez dis, c'est l'envoi d'un seul string
    je l'ai fait depuis longtemps, et ça marche
    et je veux pas faire une boucle pour envoyé mes string
    ben fait toi un buffer où tu sérialise toutes tes string et envoie ce buffer.
    Ensuite a la reception, désérialise tes string du buffer reçu

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