error: invalid operands of types 'const char [15]' and 'short ..

error: invalid operands of types 'const char [15]' and 'short .. - C++ - Programmation

Marsh Posté le 23-07-2005 à 23:27:39    

Hello world ;)
 
je débute (comme tous les ans :o ) en C++
J'ai écrit un petit script bash, et je le retranscris en C++.
 
J'ai déclaré 2 variables. J'ai choisi short car le nombre rentré ne devrait jamais être supérieur à 20)
 

Code :
  1. unsigned short pause = 0, what = 0;


 
Je demande les valeurs à l'utilisateur :

Code :
  1. cin >> pause;
  2. cin >> what;


 
Et en fonction de la valeur de what, j'exécute...
 

Code :
  1. if (what == 1)    //desktop
  2. system("import -pause " << pause << " -quality 90 -window root ~/shotdesktop-date-heure.png" );
  3. else if (what == 2)   //window or area
  4. system("import -pause " << pause << " -quality 90 -frame ~/shotarea-date-heure.png" );
  5. else if (what == 3)  //mplayer
  6. system("import -pause " << pause << " -quality 90 -window Mplayer ~/shotmplayer-date-heure.png" );
  7. else
  8. cout << "Mauvais choix ! Bye bye";
  9. return 0;


 
Mon problème, c'est d'intégrer la valeur de la variable 'pause', entrée par l'utilisateur, à la chaîne de system.
Il faut convertir pause en string ?
 
J'ai ca comme erreurs - Forcément, on retrouve la même à chaque fois ligne où il y a "pause" dans le if :

Citation :

g++ -o hello hello.cpp  
hello.cpp: In function 'int main()':
hello.cpp:26: error: invalid operands of types 'const char [15]' and 'short unsigned int' to binary 'operator<<'
hello.cpp:28: error: invalid operands of types 'const char [15]' and 'short unsigned int' to binary 'operator<<'
hello.cpp:30: error: invalid operands of types 'const char [15]' and 'short unsigned int' to binary 'operator<<'


Message édité par Profil supprimé le 23-07-2005 à 23:29:03
Reply

Marsh Posté le 23-07-2005 à 23:27:39   

Reply

Marsh Posté le 23-07-2005 à 23:36:04    

Salut,
 
Dans l'erreur il te dit que tu ne possédes pas d'opérateur <<(const char*, short)
Donc, tu dois passer par une string temporaire, ce qui n'est pas un mal vu que la première moitié de ta string se répète.
 
Deux petites remarques:
- tu peux chainer les saisies,
- tu peux utiliser un switch pour les suites de if...else if...else if...

Reply

Marsh Posté le 23-07-2005 à 23:54:53    

merci de ta réponse.
 
String temporaire pour pause ?
 
-chainer les saisies, ca veut dire quoi ?
-pour la condition, j'ai fait comme je savais, je regarderai pour l'optimiser avec un switch merci ;)
 
J'ai changé 'if' par 'switch' :)  
 

Code :
  1. switch (what) {
  2. case '1':    //desktop
  3. system("import -pause " << pause << " -quality 90 -window root ~/shotdesktop-x.png" );
  4. break;
  5. case '2':    //window or area
  6. system("import -pause " << pause << " -quality 90 -frame ~/shotdesktop-x.png" );
  7. break;
  8. case '3':   //mplayer
  9. system("import -pause " << pause << " -quality 90 -window Mplayer ~/shotdesktop-x.png" );
  10. break;
  11. default:   //aucun des 3 choix possibles
  12. cout << "Mauvais choix ! Bye bye";
  13. break;
  14. return 0; }
  15. }


Message édité par Profil supprimé le 24-07-2005 à 00:03:15
Reply

Marsh Posté le 24-07-2005 à 00:12:24    

bah tu fais une recherche sur le forum sur comment passer un int en std::string

Reply

Marsh Posté le 24-07-2005 à 08:44:42    

indice :
 
#include <sstream>

Reply

Marsh Posté le 24-07-2005 à 09:12:50    

j'ai avancé si on peut dire :/
D'ailleurs, y a t-il un glossaire avec la définition pour chaque "error" ?
 

Citation :

shot.cpp: In function 'int main()':
shot.cpp:35: error: no match for 'operator<<' in '"import -pause " << pause'
shot.cpp:38: error: no match for 'operator<<' in '"import -pause " << pause'
shot.cpp:41: error: no match for 'operator<<' in '"import -pause " << pause'


 
Les 2 bouts de codes en rapport.

Code :
  1. cin >> p;
  2. // créer un flux de sortie
  3.     ostringstream buffer;
  4.      // écrire un nombre dans le flux
  5.      buffer << p;
  6.      // récupérer une chaîne de caractères
  7.      string pause = buffer.str();


 
//un cout << pause; ici m'affiche bien la valeur de p..
 

Code :
  1. switch (what) {
  2. case '1':    //desktop
  3. system("import -pause " << pause << " -quality 90 -window root ~/shotdesktop-x.png" );
  4. break;


Message édité par Profil supprimé le 24-07-2005 à 09:14:08
Reply

Marsh Posté le 24-07-2005 à 09:20:01    

arrete le C++ ?

Reply

Marsh Posté le 24-07-2005 à 09:22:49    

avec l'aide de cette catégorie, je crois bien.

Reply

Marsh Posté le 24-07-2005 à 09:26:48    

bah que veux tu qu'on te dises ... pourtant t'es dans le haut du panier vu que tu as trouvé un morceau de code qui fonctionne. Mais t'as pas du  lire le reste. Tu vas nulle part vu que :
- tu comprends pas la notion de type
- ton compilateur te dit que les opérandes sont pas valides. Prend un dictionnaire si tu sais pas ce qu'est une opérande.
 
Y a aucune magie, c'est pas en mélangeant les lignes que ça va finir par marcher.

Reply

Marsh Posté le 24-07-2005 à 10:36:04    

Code :
  1. cin >> p;
  2. ostringstream buffer;
  3. buffer << "import -" << p << " -quality 90 -window root ~/shotdesktop-x.png";
  4. string toto= buffer.str();
  5. switch (what) {
  6. case '1':    //desktop
  7. system(toto.c_str());
  8. break;


 
 
ET c'est bien parce que c'est dimanche :o

Reply

Marsh Posté le 24-07-2005 à 10:36:04   

Reply

Marsh Posté le 25-07-2005 à 00:00:30    

merci beaucoup Joel F  :jap:  
Le programme fonctionne maintenant.
Voici le code. Je suis sur que c'est mal écrit, alors j'attends vos reproches.
 
Donc pour la conversion, il faut passer à "buffer", toute la chaîne, et pas seulement le nombre à convertir... c'est pas ce que j'avais compris avec la solution de http://c.developpez.com/faq/cpp/?p [...] S_numtostr
 

Code :
  1. int main()
  2. {
  3. unsigned short p = 0, what = 0;
  4. cout << "Entrez un nombre en secondes avant le déclenchement du screenshot" << endl;
  5. cin >> p;
  6.     ostringstream buffer1, buffer2, buffer3;
  7. buffer1 << "import -pause " << p << " -quality 90 -window root ~/shotdesktop-x.png";
  8. buffer2 << "import -pause " << p << " -quality 90 -frame ~/shotarea-x.png";
  9. buffer3 << "import -pause " << p << " -quality 90 -window Mplayer ~/shotmplayer-x.png";
  10. string pause1=buffer1.str();
  11. string pause2=buffer2.str();
  12. string pause3=buffer3.str();
  13. cout << "Que voulez-vous capturer ?" << endl;
  14. cout << "1) Bureau entier" << endl;
  15. cout << "2) Fenêtre ou zone à sélectionner" << endl;
  16. cout << "3) Mplayer" << endl;
  17. cout << "Entrez un N°" << endl;
  18. cin >> what;
  19. switch (what) {
  20. case 1:    //desktop
  21. system(pause1.c_str());
  22. break;
  23. case 2:    //window or area
  24. system(pause2.c_str());
  25. break;
  26. case 3:   //mplayer
  27. system(pause2.c_str());
  28. break;
  29. default:   //aucun des 3 choix possibles
  30. cout << "Mauvais choix ! Bye bye";
  31. break;
  32. return 0; }
  33. }


Message édité par Profil supprimé le 25-07-2005 à 00:05:26
Reply

Marsh Posté le 25-07-2005 à 00:59:46    

remplace  
 
cin >> p;
 
 
par
 
if(not (cin >> p)) { cout << "pas bon"; return 1; }

Reply

Marsh Posté le 25-07-2005 à 01:47:28    

ok, merci Taz

Reply

Marsh Posté le 25-07-2005 à 18:25:48    

le if(no..) c'était bien pour dire pas bon et fermer si la personne ne répond pas à la question pour 'p' ?
Car si je ne réponds pas (si je tape ENTREE sans entrer de valeur), ca ne fait rien de particulier... ca fait comme s'il n'y avait pas le if.

Reply

Marsh Posté le 25-07-2005 à 18:31:44    

fais un Control-Z puis entrée et tu verras, j'imagine ...

Reply

Marsh Posté le 25-07-2005 à 18:33:29    

Citation :

./shot
Entrez un nombre en secondes avant le déclenchement du screenshot
 
[1]+  Stopped                 ./shot


 
je suis sous Linux...


Message édité par Profil supprimé le 25-07-2005 à 18:35:55
Reply

Marsh Posté le 25-07-2005 à 18:45:06    

dans ce cas, ctrl+D :o

Reply

Marsh Posté le 25-07-2005 à 18:55:28    

ok, donc le msg du if s'affiche si on quitte le programme... je vois pas trop l'utilité qd meme puisque si on quitte c'est qu'on veut pas continuer..

Reply

Marsh Posté le 25-07-2005 à 18:59:53    

c'est si tu as un problème de flux d'entrée, que le message sort ... une fin de flux inattendue est un cas problématique à traiter, normalement :o
 
ctrl-D n'a jamais été un raccourci pour "quitter" quoi que ce soit

Reply

Marsh Posté le 25-07-2005 à 19:02:52    

d'accord. Oui, sauf pour se délogguer en vitesse ;)

Reply

Marsh Posté le 25-07-2005 à 19:22:46    


t'as que tapper du texte à la place d'un entier pour voir ...

Reply

Marsh Posté le 25-07-2005 à 20:10:13    

en effet ! je crois que c'est le plus parlant.
Merci.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed