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 de chaînes c-like


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Tableau de chaînes c-like
    Bonjour à tous.

    J'ai un soucis avec un duo d'applications que je code en C++. L'une des deux a pour rôle de lancer l'autre en lui envoyant des arguments paramétrés par l'utilisateur, en utilisant la fonction _execv (présente dans process.h).

    Seulement j'ai un problème juste avant d'arriver à cette étape.

    Si j'ai bien compris comment cela fonctionne, cette fonction prend deux paramètres, le premier est une chaîne de caractères (const char*) indiquant l'exécutable à lancer. Le second est un tableau de chaînes de caractères (const char* const*) contenant les argument à envoyer au programme, dont le premier doit être le nom absolu de l'exécutable, et le dernier doit être nul.

    Cela me pose plusieurs soucis. En premier lieu, si une de ces chaînes contient un espace, cela flanque tout par terre, car il considère les espaces comme séparateurs de chaînes. Et mettre mes chaînes entre double-quotes ne change rien. C'est une sérieux écueil car les chemins contiendrons forcément des espaces (ne serait-ce que le fameux Program Files pour l'exécutable).

    Deuxièmement, mon but est de paramétrer les arguments à envoyer. Pour cela, j'utilise une fenêtre d'interface (de la librairie Qt) pour récupérer les différentes chaînes de caractères à envoyer.

    Cela donne quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const char* arg[5];
    		arg[0] = formatedString(m_execFileAbsolute->text()).toLatin1().constData();
    		arg[1] = formatedString(m_dataFolder->text()).toLatin1().constData();
    		arg[2] = formatedString(m_prefsFile->text()).toLatin1().constData();
    		arg[3] = formatedString(m_historicFolder->text()).toLatin1().constData();
    		arg[4] = 0;
     
    _execv(formatedString(m_execFileAbsolute->text()).toLatin1().constData(), arg);
    Les objet m_xxx sont des QLineEdit, dont on récupère le contenu avec la fonction text() sous forme de QString.

    La fonction formatedString sert à ajouter des doubles-quotes et/ou à supprimer les espaces.

    Le couple toLatin1().constData() sert à obtenir de la QString une chaîne en (const char*).

    Le lancement argumenté de mon programme échoue car, lorsque j'examine le contenu du tableau arg, je découvre que les chaînes au-delà de la première ne correspondent plus à rien, et moins encore à ce qui a été paramétré quelques lignes plus haut.

    Cela fait un bon moment que je butte là-dessus, et mes tests de tâtonnage n'ont rien donné.

    Je tourne sous windows 7 (32 et 64 bits) et je compile avec MinGW.
    Dernière modification par Invité ; 05/11/2013 à 11h25.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il faut faire attention à la durée de vie des QByteArray retournés par la méthode QString::toLatin1().
    Plus de détails dans la FAQ Qt : Comment convertir un QString en chaîne C (char *) ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Effectivement, c'était ça.

    Mes conversions étaient effectuées dans des if, et la commande à la sortie.
    Je savais que c'était un truc tout con, merci beaucoup.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/03/2007, 12h09
  2. Réponses: 3
    Dernier message: 01/03/2007, 16h26
  3. Tableau de chaînes de caractères
    Par sone47 dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/02/2007, 14h54
  4. tableau de chaîne de caractères
    Par salseropom dans le forum C
    Réponses: 6
    Dernier message: 11/09/2006, 17h23
  5. Tableau de chaînes de caractères
    Par mac1 dans le forum Langage
    Réponses: 3
    Dernier message: 15/01/2006, 13h18

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