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 :

char[50] et std::vector<>


Sujet :

SL & STL C++

  1. #1
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut char[50] et std::vector<>
    bonjour,
    la déclaration suivante me donne des erreurs dans les fichiers d'inclusion de la STL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef char EventStringLogFile[50];
    std::vector<EventStringLogFile> m_EventStringLogFile;
    J'essaye de déclarer un type qui soit un tableau de 50 char (ligne 1) puis de créer un vector de ce type.
    J'utilise un char[50] et non pas std::string pour des raisons de conception : écriture dans un fichier de bloc de 50 octets.
    J'utilise Visual C++ 6.0 sous WinXP.

  2. #2
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Points : 638
    Points
    638
    Par défaut
    le code suivant ne provoque aucune erreur de compile avec DevC++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <vector>
    typedef char EventStringLogFile[50];
    std::vector<EventStringLogFile> m_EventStringLogFile;
    int main () {
        return 0;
    }

  3. #3
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    eh bien tu as de la chance, parce que sous Visual, ça ne passe pas.
    Les versions de la STL ne doivent pas être les mêmes...
    bon, je vais contourner le problème, mais je trouve ça dommage.
    Merci quand même.

  4. #4
    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 : 40
    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
    Apparemment il n'y a aucune erreur lors de la déclaration, mais ça se corse après pour utiliser le vecteur.
    Je ne pense pas que ce soit une bonne idée de stocker des tableaux statiques dans un vecteur, notamment car ceux-ci ne sont pas copiables comme les variables "normales" (tu ne peux pas faire MonTypeTableau a = b). Tu devrais plutôt stocker une structure qui contiendrait ton tableau, je pense.

  5. #5
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <vector>
    typedef char EventStringLogFile[50];
    std::vector<EventStringLogF
    int main () {
        return 0;
    }
    Ce code a beau compiler, il n'est pas valide.
    Un simple push_back montre le problème.
    Un array[] n'est pas 'Assignable'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char t1[50] = "CHAINE";
    char t2[50];
    t2 = t1; // non valide.

  6. #6
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    oui, effectivement, c'est ce qu'à dit Loulou24.
    @Loulou24 : tu me conseilles de stocker le tableau dans une structure. Très bien. A priori, dans ce cas-là, on devrait être capable d'utiliser un vecteur avec mes tableaux, puisque normalement, l'opérateur "=" défini par défaut fait de la recopie champs à champs. Et au pire, si ça marche pas, je peux implémenter une surcharge de l'opérateur =.
    MAIS, comment se fait-il que l'on soit capable de copier un tableau dans le contexte d'une copie d'objet, alors que ce n'est pas autorisé dans le cas de variables locales, par exemple ?

  7. #7
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Points : 638
    Points
    638
    Par défaut
    Citation Envoyé par tut
    J'utilise un char[50] et non pas std::string pour des raisons de
    conception : écriture dans un fichier de bloc de 50 octets.
    rien ne vous empêche de manipuler des std::vector<std::string>

    puis de faire avant écriture fichier

    strcpy(monchar50,monstring.data());

  8. #8
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    c'est ce que j'ai fait pour contourner le problème.
    Mais la solution de Loulou me semble plus élégante.

  9. #9
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    MAIS, comment se fait-il que l'on soit capable de copier un tableau dans le contexte d'une copie d'objet, alors que ce n'est pas autorisé dans le cas de variables locales, par exemple ?
    C'est justement dans le contexte d'une copie d'objet que c'est valide
    ( cf 12.8 paragraphe 8 ).


    Par contre, je ne vois pas pourquoi tu n'utilises pas directement std::string quitte à formatter sur 50 caractères ( fill, et substr par exempl )ensuite dans ton flux.

  10. #10
    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 : 40
    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
    [Hors-sujet]

    Citation Envoyé par HRS
    strcpy(monchar50,monstring.data());
    Attention, ce code risque fort de planter : seul monstring.c_str() renverra à coup sûr une chaîne terminée par '\0', ce qu'attend strcpy. Et dans la foulée mieux vaut utiliser strncpy si on veut limiter à 50 caractères.

    [/Hors-sujet]

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

Discussions similaires

  1. Libération de pointeurs dans un std::vector
    Par G dans le forum SL & STL
    Réponses: 17
    Dernier message: 06/04/2005, 23h37
  2. std::vector : dynamique ou statique, pile et tas
    Par salseropom dans le forum SL & STL
    Réponses: 7
    Dernier message: 24/01/2005, 14h22
  3. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 20h15
  4. Réponses: 8
    Dernier message: 26/08/2004, 19h59
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 14h30

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