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 :

Conversion wchar_t ** vers char**


Sujet :

C++

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Conversion wchar_t ** vers char**
    Bonjour à tous et toutes !
    J'ai un code, dans lequel mes arguments de la ligne de commande (argv) sont déclarés :
    Mais le truc, c'est que derrière, j'ai un tas de fonctions qui utilisent argv mais déclaré :
    Du coup, j'aimerais bien convertir une seule fois toute la ligne, et pas aller dans chaque fonction et rajouter une série de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef 
    ...
    #else 
    ...
    #endif
    J'ai essayé d'utiliser wcstombs(), mais je galère.
    Je suis sûr que c'est assez simple, mais je n'y arrive pas.

    Merci d'avance !

  2. #2
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Deja wchar_t *argv[] c'est pareil que wchar_t **argv
    Si tu veut les modifier tu dois faire une boucle sur le nombre d'argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char stringOut[MAX_SIZE];
    for (int i=0; i<argc; i++ )
        wcstombs( stringOut, argv[i], wcslen(argv[i]));

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Dans ce cas, l'appel à la fonction doit être différent, car j'ai une fonction qui prend :
    Or, stringout est de type char*, non ?

  4. #4
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Bon, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *argi[10]={"","","","","","","","","",""};
      size_t copied;
      size_t len;
      for (int i=0 ; i < argc ; i++)
      {
    	  len = wcslen(argv[i]);
    	  copied = wcstombs(argi[i], argv[i], len);
      }
    Mais ça ne fonctionne pas. Exemple de ce qu'il se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    argv[0]="c:\test\test.exe"
    argv[1] = "argument"
    En sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    argi[0]="c:\test\test.exe"
    argi[1]="argumenttest.exe"
    On voit qu'il y a un soucis...

    J'aimerais bien utiliser new[] pour argi, mais je n'y arrive pas.
    La solution est surement simple, si vous pouvez me montrer mon erreur ??

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    OK, j'ai résolu mon problème, j'ai oublié d'ajouter 1 à la longueur de la chaine à convertir...

  6. #6
    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
    Ce que tu fais est dangereux, car les éléments de argi pointent sur des chaînes constantes où tu n'as pas le droit d'écrire en théorie. Donc en gros, ça ne plante pas parce que tu as de la chance.

  7. #7
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    OK, comment j'évite ce problème alors... ?

  8. #8
    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
    Tu utilises des tableaux de caractères (std::vector<char>) avec suffisamment d'espace alloué pour contenir le résultat.

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Dans mon contexte, je ne vois pas trop comment y arriver...

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::vector<char> argi[10];
    size_t copied;
    size_t len;
    for (int i = 0 ; i < argc ; i++)
    {
        len = wcslen(argv[i]);
        argi[i].resize(len);
        copied = wcstombs(&argi[i][0], argv[i], len);
    }

  11. #11
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    C'est tout ?
    Je vais essayer de ce pas .

  12. #12
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Euh, sans doute parceque c'est pour une plateforme mobile, mais j'obtiens :
    'vector' : is not a member of 'std'

  13. #13
    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
    Ne pas oublier :

  14. #14
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Oups .
    Ceci dit, la fonction qui prend argi en entrée attend un char **.
    Et là...

  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 : 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
    Ah... Dans ce cas on peut se la faire style C, en moins optimisé / sûr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char argi[10][MAX_SIZE];
    size_t copied;
    size_t len;
    for (int i = 0 ; i < argc ; i++)
    {
        len = wcslen(argv[i]);
        copied = wcstombs(argi[i], argv[i], len);
    }
    Ou avec des allocations dynamiques si on ne veut pas de risque d'overflow ou de gaspillage de mémoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    char* argi[10];
    size_t copied;
    size_t len;
    for (int i = 0 ; i < argc ; i++)
    {
        len = wcslen(argv[i]);
        argi[i] = new char[len];
        copied = wcstombs(argi[i], argv[i], len);
    }
     
    // Utilisation de argi
    ...
     
    for (int i = 0; i < 10; ++i)
        delete[] argi[i];
    EDIT : tu peux oublier la première solution en fait, char[][] et char** ne sont pas compatibles...

  16. #16
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    [MODE J'aime les Smileys]

    [/MODE J'aime les Smileys]

  17. #17
    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
    ?

  18. #18
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Finalement, j'enlève le résolu, j'ai le problème inverse .
    Enfin, presque...

    Pour ouvrir un fichier, j'utilise l'API windows, et pour cela, j'utilise CreateFile().
    Le nom du fichier est de type LPCWSTR, autrement dit : CONST WCHAR *.

    Or, en entrée, le nom de mon fichier est de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::string& rcFilename
    Comment convertir correctement ?

    Je sais que je suis un peu ch*** mais ça peut servir à d'autres .

  19. #19
    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
    Mais est-ce que tu as besoin de manipuler de l'unicode quelque part, ou bien tu te fais ch*** à faire des tas de conversions pour rien ?

  20. #20
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Oui, j'en ai besoin entre les deux...
    Mais je ne parviens pas à convertir facilement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Conversion wchar_t * vers char *
    Par didierll dans le forum C++
    Réponses: 5
    Dernier message: 16/04/2007, 17h28
  2. Conversion wxString vers char* bizarre.
    Par bustaja dans le forum wxWidgets
    Réponses: 9
    Dernier message: 13/04/2007, 17h52
  3. Conversion String vers char
    Par benwit dans le forum Langage
    Réponses: 27
    Dernier message: 30/03/2007, 15h01
  4. conversion gchar vers char
    Par shito dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 16/01/2007, 21h09
  5. [MFC] Problème de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    Réponses: 10
    Dernier message: 02/12/2005, 15h42

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