Votre question

PB concaténation C++ et QT

Tags :
  • element
  • Programmation
Dernière réponse : dans Programmation
24 Février 2010 15:18:29

Bonjour,

je m'adresse à vous car j'ai un problème de concaténation en C++ sur QT...

Voici la partie du code qui pose problème:

  1. void MaFenetre::afficher1()
  2. {
  3. QString elementSelectionne1 = QFileDialog::getExistingDirectory(this);
  4. elementSelectionne1.replace('/', '\\');
  5. origine->setText("Elément d'origine: " + elementSelectionne1);
  6. select1 = elementSelectionne1.toStdString().c_str(); //converti elementSelectionne1 en const char
  7. }
  8.  
  9. void MaFenetre::afficher2()
  10. {
  11. QString elementSelectionne2 = QFileDialog::getExistingDirectory(this);
  12. elementSelectionne2.replace('/', '\\');
  13. destination->setText("Elément de destination: " + elementSelectionne2);
  14. select2 = elementSelectionne2.toStdString().c_str(); //converti elementSelectionne2 en const char
  15. }
  16.  
  17. void MaFenetre::synchro()
  18. {
  19. QString xcopy = "xcopy ";
  20. QString concat1;
  21. QString concat2;
  22. concat1 = xcopy + select1; //on concatène xcopy et select1. xcopy vaut donc xcopy select1
  23. concat2 = concat1 + select2; //on concatène concat1 et select2. concat2 vaut alors :xcopy select1 select2
  24. const char *d = concat2.toStdString().c_str(); //on converti concat2 en Const Char
  25. system(d); //on exécute concat2 (xcopy select1 select2)
  26.  
  27.  
  28. }


au moment de l'exécution de system(d) la console s'ouvre donc (oui je sais la console...) et le message est: fichier introuvable- 0 fichier copié(s).


J'ai essayé de tourner le code dans tous les sens, je n'y parvient pas. Une idée?

Merci!

Autres pages sur : concatenation

a b L Programmation
24 Février 2010 20:28:35

Tu n'as pas mis d'espace entre select1 et select2.
Sinon affiche concat2 pour voir ce qui ne va pas.
m
0
l
25 Février 2010 09:19:01

Après avoir un mis espace l'erreur est:
fichier introuvable - :) 
0 fichier(s) copie(s)

oui oui, l'émoticone apparait dans la console...

Je continue a chercher
m
0
l
Contenus similaires
Pas de réponse à votre question ? Demandez !
25 Février 2010 16:24:31

Bon, j'ai changé de tactique. Maintenant je demande directement a l'utilisateur de saisir la lettre d'origine et la lettre de destination puis un nom de dossier a synchroniser. Voici mon code:

  1. void MaFenetre::synchro()
  2. {
  3. QString xcopy; //variable xcopy
  4. QString xcopydeux; //2eme variable xcopy
  5. QString ifnotexist = "if not exist ";
  6. QString mkdir = "mkdir ";
  7. QString slash = "\\";
  8. QString cd;
  9. QString pts = ":";
  10. cd = "cd /" + "\n" + ifnotexist + " " + lettreD + pts + slash + dossier + "\n" + mkdir + lettreD + pts + slash + dossier + "\n";
  11.  
  12. system(cd);
  13. xcopy = "xcopy " + lettreO + slash + dossier + " " + lettreD + slash + dossier + " " + "/D /E /H /Y";
  14.  
  15. system(xcopy);
  16. xcopydeux = "xcopy " + lettreD + slash + dossier + " " + lettreO + slash + dossier + " " + "/D /E /H /Y";
  17.  
  18. system(xcopydeux);


J'ai 6 erreurs qui sont:

error: invalid operands of types 'const char[5]' and 'const char[2]' to binary 'operator+'
error: cannot convert 'QString' to 'const char*' for argument '1' to 'int system(const char*)'
error: invalid operands of types 'const char[7]' and 'QString*' to binary 'operator+'
error: cannot convert 'QString' to 'const char*' for argument '1' to 'int system(const char*)'
error: invalid operands of types 'const char[7]' and 'QString*' to binary 'operator+'
error: cannot convert 'QString' to 'const char*' for argument '1' to 'int system(const char*)'


Sachant que:
lettreO, lettreD et dossier sont des Qstring déclaré dans MaFenetre.h

J'ai bien essayé de déclarer un const char *select et d'en faire:

select = cd.toStdString().c_str();
select = cxcopy.toStdString().c_str();
select = xcopydeux.toStdString().c_str();

Mais le même type d'erreur apparait. Une idée?

Merci!
m
0
l
a b L Programmation
25 Février 2010 20:18:16

S'il y a le smiley, c'est que que select1 est foireux.

Lorsque tu fais un "cd /", c'est par défaut un (const char *). Si tu le mets directement dans un QString, il y a un cast implicite. Par contre si tu fait des concaténations de chaines, le cast se fera sur le premier type, donc il convertit tout en (const char *). Du coup, tu tentes d'additionner 2 pointeurs (2 adresse mémoire), d'où l'erreur.
Pour éviter ça, il te suffit de faire un cast explicite sur la première chaine, les suivant auront un cast implicite sur le premier. Donc:
  1. cd = QString("cd /") + "\n" + ...
m
0
l
26 Février 2010 08:46:40

Je te poste le code complet de MaFenetre.cpp:

  1. #include <string>
  2. #include "MaFenetre.h"
  3.  
  4. using namespace std;
  5.  
  6. MaFenetre::MaFenetre() : QWidget()
  7. {
  8. setWindowTitle("S1kronize"); //titre de la fenetre
  9. setWindowIcon(QIcon("synchro.png")); //icone de la fenetre
  10.  
  11.  
  12. m_apropos = new QPushButton("A propos", this); //déclare le bouton a propos
  13. m_quitter = new QPushButton("Quitter", this);
  14. boutonSelect1 = new QPushButton("Lettre d'origine");
  15. boutonSelect2 = new QPushButton("Lettre de destination");
  16. boutonSelect3 = new QPushButton("Dossier à synchroniser");
  17. m_synchroniser = new QPushButton("SYNCHRONISER", this);
  18. QGridLayout *vbox1 = new QGridLayout; //déclare le GridLayout vbox1
  19. origine = new QLabel(this); //déclare le label origine
  20. destination = new QLabel(this);
  21. lbldossier = new QLabel(this);
  22. groupbox = new QGroupBox("(Information) Disques reliés: ", this); //déclare le groupbox
  23. QDirModel *modele = new QDirModel; //liste les disques
  24. QTreeView *vue = new QTreeView; //déclare le style d'affichage du QDirModel
  25. vue->setModel(modele); //insère la liste des disques dans QTreeView
  26. vbox2 = new QVBoxLayout;
  27. vbox2->addWidget(vue); //ajoute le QTreeView au layout vbox2
  28. groupbox->setLayout(vbox2); //ajoute le layout vbox2 dans le groupbox
  29.  
  30. // Positionnement des widgets sur la fenetre
  31. vbox1->addWidget(boutonSelect1, 0, 0);
  32. vbox1->addWidget(origine, 0, 1);
  33. vbox1->addWidget(groupbox, 0, 2, 5, 1);
  34. vbox1->addWidget(boutonSelect2, 1, 0);
  35. vbox1->addWidget(destination, 1, 1);
  36. vbox1->addWidget(boutonSelect3, 2, 0);
  37. vbox1->addWidget(lbldossier, 2, 1);
  38. vbox1->addWidget(m_synchroniser, 3, 0, 1, 2);
  39. vbox1->addWidget(m_apropos, 4, 0);
  40. vbox1->addWidget(m_quitter, 4, 1);
  41.  
  42.  
  43. setLayout(vbox1); //insère le layout vbox1 dans la fenetre
  44.  
  45. //connexion des boutons
  46. QObject::connect(boutonSelect1, SIGNAL(clicked()), this, SLOT(afficher1()));
  47. QObject::connect(boutonSelect2, SIGNAL(clicked()), this, SLOT(afficher2()));
  48. QObject::connect(boutonSelect3, SIGNAL(clicked()), this, SLOT(afficher3()));
  49. QObject::connect(m_quitter, SIGNAL(clicked()), this, SLOT(ouvrir()));
  50. QObject::connect(m_apropos, SIGNAL(clicked()), this, SLOT(propos()));
  51. QObject::connect(m_synchroniser, SIGNAL(clicked()), this, SLOT(synchro()));
  52. }
  53.  
  54.  
  55. void MaFenetre::ouvrir()
  56. {
  57. int reponse = QMessageBox::warning(this, "Quitter", "Voulez-vous vraiment quitter?", QMessageBox::Yes | QMessageBox::No);
  58. if (reponse == QMessageBox::Yes)
  59. {
  60. QObject::connect(m_oui, SIGNAL(clicked()), qApp, SLOT(quit()));
  61. }
  62. else if (reponse == QMessageBox::No)
  63. {
  64. }
  65. }
  66.  
  67. void MaFenetre::propos()
  68. {
  69. QMessageBox::information(this, "A propos", "S1kronize a été développé par <strong>Tib</strong> à l'aide du <a href=\"<a href="http://www.siteduzero.com" rel="nofollow" target="_blank">http://www.siteduzero.com</a>\">Site du Zéro</a>.<br /> Ce programme permet de synchroniser 2 périphériques simultanément. <br />License: aucune (Peut être librement partagé).");
  70. }
  71.  
  72. void MaFenetre::afficher1()
  73. {
  74. bool ok = false;
  75. QString lettreO = QInputDialog::getText(this, "Lettre de disque d'origine", "Saisir la lettre du disque d'origine", QLineEdit::Normal, QString(), &ok);
  76. if (ok && !lettreO.isEmpty()) //vérifie que le champ n'est pas vide
  77. {
  78. origine->setText("Elément d'origine--> " + lettreO); //attribue cette valeur au label origine
  79. select1 = lettreO.toStdString().c_str(); //converti lettreO en const char
  80. }
  81. else
  82. {
  83. QMessageBox::warning(this, "Attention", "Aucune lettre n'a été saisie!"); //si champ vide, affiche ce message
  84. }
  85. }
  86.  
  87. void MaFenetre::afficher2()
  88. {
  89. bool ok = false;
  90. QString lettreD = QInputDialog::getText(this, "Lettre de disque de destination", "Saisir la lettre du disque de destination", QLineEdit::Normal, QString(), &ok);
  91. if (ok && !lettreD.isEmpty())
  92. {
  93. destination->setText("Elément de destination--> " + lettreD);
  94. select2 = lettreD.toStdString().c_str(); //converti lettreD en const char
  95. }
  96. else
  97. {
  98. QMessageBox::warning(this, "Attention", "Aucune lettre n'a été saisie!");
  99. }
  100. }
  101.  
  102. void MaFenetre::afficher3()
  103. {
  104. bool ok = false;
  105. QString dossier = QInputDialog::getText(this, "Dossier", "Saisir le nom du dossier à synchroniser", QLineEdit::Normal, QString(), &ok);
  106. if (ok && !dossier.isEmpty())
  107. {
  108. lbldossier->setText("Dossier--> " + dossier);
  109. select3 = dossier.toStdString().c_str(); //converti dossier en const char
  110. }
  111. else
  112. {
  113. QMessageBox::warning(this, "Attention", "Aucun nom de dossier n'a été saisi!");
  114. }
  115. }
  116.  
  117. void MaFenetre::synchro()
  118. {
  119. QString xcopy; //variable xcopy
  120. QString xcopydeux; //2eme variable xcopy
  121. QString ifnotexist = "if not exist ";
  122. QString mkdir = "mkdir ";
  123. QString slash = "\\";
  124. QString cd;
  125. QString pts = ":";
  126. cd = QString("cd /") + "\n" + ifnotexist + " " + lettreD + pts + slash + dossier + "\n" + mkdir + lettreD + pts + slash + dossier + "\n";
  127.  
  128. system(cd);
  129. xcopy = QString("xcopy ") + lettreO + slash + dossier + " " + lettreD + slash + dossier + " " + "/D /E /H /Y";
  130.  
  131. system(xcopy);
  132. xcopydeux = QString("xcopy ") + lettreD + slash + dossier + " " + lettreO + slash + dossier + " " + "/D /E /H /Y";
  133.  
  134. system(xcopydeux);
  135. }


Voici les erreurs:



L'erreur se déclenche aussi pour les lignes 131, 132 et 134 sachant que:

* une ligne d'erreur pour la 131
* 8 lignes pour 132
* une ligne pour 134.

Merci!

m
0
l
a b L Programmation
26 Février 2010 18:50:35

Tu as un problème avec un des paramètres, essaie de trouver lequel pose problème.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS