Programme de Coloration syntaxique

Programme de Coloration syntaxique - C++ - Programmation

Marsh Posté le 31-07-2008 à 16:52:11    

Bonjour,
Je suis novice en C++, enfin j'ai lût et globalement compris "Le langage C++", par Bjarne Stroustrup, ça fait 3 ans que je pratique PHP5, et j'ai atteint un niveau correcte. Voilà vous savez tout de moi  :)  
 
Je viens ici car actuellement je code un Script de Coloration syntaxique pour pouvoir me passer de pygment, et pour avoir une plus grande vitesse.
 
Je compte utiliser l'entête <boost/regex>, et j'aimerais votre avis sur le travail que j'ai déjà réalisé...
 
J'aimerais que vouus soyez très critique, dites moi où ais-je mal fait mon travail, si possible comme le faire mieu, n'omettez rien ;)
 
http://knightoffear.free.fr/ColorC [...] -0-01a.zip
 
J'aimerais y implémenter une gestion de la mémoire et un système de cache à court therme, si vous avez une idée de la manière pour y arriver...
 
Voilà, le résultat sera renvoyé a un script PHP, je compte sur le système de cache pour éviter d'avoir à recalculé tout le code si l'utilisateur s'apperçoit qu'il à oublié de dire bonjoir et qu'il réédite son message ou qu'il le visualise, donc les balise de coloration seront en CSS ^^

Message cité 1 fois
Message édité par Profil supprimé le 01-08-2008 à 14:37:59
Reply

Marsh Posté le 31-07-2008 à 16:52:11   

Reply

Marsh Posté le 31-07-2008 à 18:15:09    

t'as compilé ton code ou c'est moi qui est rien compris :

 
Code :
  1. // Fonction d'appel des bibliothèques
  2. void inclure(std::string langage)
  3. {
  4.     if(!ColorCodesSystem::liste_modules_inclus.find(langage))
  5.     {
  6.         #include "lib/"+langage+".h"
  7.     }
  8. }
 

tu fait quoi là exactement ???

 

Sinon aprés c'est assez moche, pas de passage par références, des fonctions partout à la rache, des globales, des statiques et pas d'objets ...

 

foreach_arg => BOOST_FOR_EACH :o

 
Code :
  1. template<class In, class Op>Op foreach_arg(In first, In last, Op f, In& p1, In& p2)
  2. {
  3.     while(first != last)
  4.     {
  5.         f(*first++, p1, p2);
  6.     }
  7.     return f;
  8. }


Ce prototype est débile, tu renvoie pas la fonction après l'appel  mais le résultat ...

 

T'es sur d'avoir globalement compris el C++ ou tu crois que c'est de l'interprété pour le web aussi ?


Message édité par Joel F le 31-07-2008 à 18:26:47
Reply

Marsh Posté le 01-08-2008 à 08:33:29    

Oufti ! quel bordel.

Reply

Marsh Posté le 01-08-2008 à 08:40:47    

C'est une joke ?

Code :
  1. // Fonction principale
  2. int main(int argc, std::string *argv[])
  3. {
  4.     // Récupération du langage
  5.     std::string langage = argv[0];
  6.     argv.pop_front();


 
Eh bien mes amis, y a core du boulot. Désolé de cette critique, mais c'est la vérité :(

Reply

Marsh Posté le 01-08-2008 à 10:32:41    

Citation :

Code :
  1. // Fonction d'appel des bibliothèques
  2. void inclure(std::string langage)
  3. {
  4.     if(!ColorCodesSystem::liste_modules_inclus.find(langage))
  5.     {
  6.         #include "lib/"+langage+".h"
  7.     }
  8. }


 
 
tu fait quoi là exactement ???


 
Je tente en vain d'inclure les bibliothèques nécessaire et juste les necessaire mais je n'ai trouvé aucune technique pour y arriver, mon but est déviter les doubles inclusions sans pour autant inclure des fichiers inutilement...  [:icon3]  
 

Citation :

Sinon aprés c'est assez moche, pas de passage par références, des fonctions partout à la rache, des globales, des statiques et pas d'objets ...


 
D'après ce que je comprend :

  • Je dois mettre toutes mes fonctions dans un autre fichier
  • Enlevé tout mes passages par référence[1]
  • Supprimer toute mes variables globale et statiques[2]
  • Faire un code moins moche[3]
  • Revoir mon for_each


Citation :

C'est une joke ?  
 

Code :
  1. // Fonction principale  
  2. int main(int argc, std::string *argv[])
  3. {
  4.     // Récupération du langage  
  5.     std::string langage = argv[0];
  6.     argv.pop_front();

 
Eh bien mes amis, y a core du boulot. Désolé de cette critique, mais c'est la vérité  


 
Je vois pas bien où est mon erreur...
 
J'accepte volonté la critique, ta réponse intermédiaire aurait quand même pût être plus pertinente...
 
Legende :
[1] Je ne vois pas tellement en quoi ça gangraine mon code  [:icon3]  
[2] Il me semble que je n'ai utilisé aucune variable static, pour les globales il me semble, par contre que j'en ait par-ci par là
[3] Des suggestions ?  [:icon3]  
 [:icon3]  J'aimerais bien que ces points soit éclairci par ton expérience, par avance merci...
 
PS : Je me met au boulot tout de suite  :bounce:

Reply

Marsh Posté le 01-08-2008 à 10:38:02    


Non mais attend ta compilé ton code au moins ?

 
Code :
  1. [ 50.0%] mingw32-g++.exe -Wall   -IC:\Boost\include\boost-1_35  -c "C:\Documents and Settings\Joel\Mes documents\lol.cpp" -o "C:\Documents and Settings\Joel\Mes documents\lol.o"
  2. C:\Documents and Settings\Joel\Mes documents\lol.cpp:88:24: warning: extra tokens at end of #include directive
  3. C:\Documents and Settings\Joel\Mes documents\lol.cpp:88:37: error: lib/: No such file or directory
  4. C:\Documents and Settings\Joel\Mes documents\lol.cpp:70: error: expected constructor, destructor, or type conversion before '=' token
  5. C:\Documents and Settings\Joel\Mes documents\lol.cpp:80: error: 'string' was not declared in this scope
  6. C:\Documents and Settings\Joel\Mes documents\lol.cpp:80: error: template argument 1 is invalid
  7. C:\Documents and Settings\Joel\Mes documents\lol.cpp:80: error: template argument 2 is invalid
  8. C:\Documents and Settings\Joel\Mes documents\lol.cpp:80: error: invalid type in declaration before ';' token
  9. C:\Documents and Settings\Joel\Mes documents\lol.cpp: In function 'void inclure(std::string)':
  10. C:\Documents and Settings\Joel\Mes documents\lol.cpp:86: error: request for member 'find' in 'ColorCodesSystem::liste_modules_inclus', which is of non-class type 'int'
  11. C:\Documents and Settings\Joel\Mes documents\lol.cpp: At global scope:
  12. C:\Documents and Settings\Joel\Mes documents\lol.cpp:93: error: 'string' was not declared in this scope
  13. C:\Documents and Settings\Joel\Mes documents\lol.cpp:93: error: template argument 1 is invalid
  14. C:\Documents and Settings\Joel\Mes documents\lol.cpp:93: error: template argument 2 is invalid
  15. C:\Documents and Settings\Joel\Mes documents\lol.cpp: In function 'std::string implode(std::string, int)':
  16. C:\Documents and Settings\Joel\Mes documents\lol.cpp:98: error: request for member 'begin' in 'tableau', which is of non-class type 'int'
  17. C:\Documents and Settings\Joel\Mes documents\lol.cpp:98: error: request for member 'end' in 'tableau', which is of non-class type 'int'
  18. C:\Documents and Settings\Joel\Mes documents\lol.cpp:98: error: 'concatene' was not declared in this scope
  19. C:\Documents and Settings\Joel\Mes documents\lol.cpp:98: error: 'foreach_arg' was not declared in this scope
  20. C:\Documents and Settings\Joel\Mes documents\lol.cpp: In function 'int main(int, std::string**)':
  21. C:\Documents and Settings\Joel\Mes documents\lol.cpp:136: error: conversion from 'std::string*' to non-scalar type 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' requested
  22. C:\Documents and Settings\Joel\Mes documents\lol.cpp:137: error: request for member 'pop_front' in 'argv', which is of non-class type 'std::string**'
  23. C:\Documents and Settings\Joel\Mes documents\lol.cpp:139: error: conversion from 'std::string**' to non-scalar type 'std::string' requested
  24. C:\Documents and Settings\Joel\Mes documents\lol.cpp:141: error: no match for 'operator&&' in '(argc > 1) && ColorCodes::langages. std::map<_Key, _Tp, _Compare, _Alloc>::find [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& )((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& langage))))'
  25. C:\Documents and Settings\Joel\Mes documents\lol.cpp:141: note: candidates are: operator&&(bool, bool) <built-in>
  26. C:\Documents and Settings\Joel\Mes documents\lol.cpp: In function 'Op Appel_fonction(Op, In& ) [with Op = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, In = std::string]':
  27. C:\Documents and Settings\Joel\Mes documents\lol.cpp:143:   instantiated from here
  28. C:\Documents and Settings\Joel\Mes documents\lol.cpp:129: error: no match for call to '(std::basic_string<char, std::char_traits<char>, std::allocator<char> > ) (std::basic_string<char, std::char_traits<char>, std::allocator<char> >& )'
  29. Process terminated with status 1 (0 minutes, 0 seconds)
  30. 19 errors, 1 warnings
 

Je dirais plus rien tant que tu auras pas pris un compilo, compilé et corrigé ton monceau de billevesés :E
En vrac :

 

un include c'est résolu à la compilation pas à l'execution
std:: c'est partout ou nulle part, pas 1 fois sur 12
main c'est int main(int, char**) , on est pas en JAVA
les fonctions on les declare avant de les utiliser
tes prototypes sont pour la plupart incohérent
finc renvoit un iterateur par un booleen
et j'en passe

 

Ah et pour les références ... c'est l'inverse, il faut que tu en mete a chaque fois que tu passe un objet en argument.
J'attendrais que tu es vraiment lu le Stroustrup avant de t'expliquer la notion de const aussi.


Message édité par Joel F le 01-08-2008 à 10:47:26
Reply

Marsh Posté le 01-08-2008 à 12:55:00    

comme le dit Joel c'est un "tantinet" (un gros tantinet) le bordel
 
tu ne peux pas ajouter des includes n'importe ou n'importe comment, un include çà sert à la compilation, donc tu ne PEUX PAS faire +ou- d'include en fonction de paramètres déterminés à l'exécution.
 
De plus : tu peux très bien gérer l'inclusion pour ne pas avoir de doublon, et encore heureux car si on utilise des librairies on ne doit pas forcément connaitre tout les includes qui sont fait en cascade : il suffit d'utiliser les balises dans tout fichier .h, genre :
 

Code :
  1. #ifndef MON_HEADER_A_MOI_H
  2. #define MON_HEADER_A_MOI_H
  3. ..... le code
  4. #endif // MON_HEADER_A_MOI_H


 
si tu veux par exemple une fonction coloration qui ai une implémentation différente en fonction du type de code tu utilisera plutôt du vrai C++, avec des classes, de l'héritage etc...  
un genre de truc dans ce style :
 

Code :
  1. class IColorCode
  2. {
  3. public:
  4. IColorCode();
  5. virtual ~IColorCode();
  6. virtual void colorCode(...);
  7. };
  8. class CColorCodeCPP : public IColorCode
  9. {
  10. public:
  11. CColorCodeCPP ();
  12. virtual ~CColorCodeCPP ();
  13. virtual void colorCode(...);
  14. };
  15. class CColorCodeVB : public IColorCode
  16. {
  17. public:
  18. CColorCodeVB ();
  19. virtual ~CColorCodeVB ();
  20. virtual void colorCode(...);
  21. };


 
et tu pourras alors utiliser un code à peu pres correct par la suite, par exemple en stockant quelque part la correspondance 'langage', et parser, un truc dans le style (attention j'ai pas dit que ct la bonne solution, c'est un bête exemple):

Code :
  1. class CColorCodeSelector
  2. {
  3. public:
  4. IColorCode *getColorCodeForLangage(const string &strLangage);
  5. std::map<string, IColorCode> m_ColorCodesByLangage;
  6. };
  7. //et dans ton code :
  8. CColorCodeSelector selector;
  9. ....
  10. IColorCode *pCC = selector.getColorCodeForLangage(monLangage);
  11. if (pCC != NULL)
  12. {
  13.   pcc->colorCode(monCode);
  14. }


Message édité par Malkav le 01-08-2008 à 13:09:44
Reply

Marsh Posté le 01-08-2008 à 13:16:05    

ok, bon, reprennons tout à zéro :
 
Voilà comment j'ai raisonné :
I-1. Je veux faire un colorateur syntaxique donc je dois récupérer un flux d'entrée
I-2. Je décide que ce flux sera divisé en deux partie : le premier argument indiquera le langage, le second, le code source
I-3. Je récupère ça avec int main(int argc, char* argv[]), page 131 du livre...
I-4a. Je récupère le premier argument, donc le langage demandé
I-4b. Je supprime le premier argument avec argv.pop_front();, car il ne sera pas parsé
 
II-1. Je transforme ma liste d'arguments en chaine (d'où ma fonction implode()) pour pouvoir lui appliquer des REGEX
II-2a. Si mon langage appartient à mon tableau j'appel la fonction, donc j'aurais inclus toutes les bibliothèques, malheureusement...
II-2b. Je retourne le retour de la fonction de parsage...
 
III-1. quoi qu'il arrive, je retourne le code, parser ou non vers le flux de sortie (via std::cout)
III-2. Je retourne la valeur 0 pour indiqué que le programme s'est déroulé en entier...
 
Mon raisonnement est-il bon ? Puis-je l'améliorer ?
 
IV-Problèmes :
1. Où imbriquer les objets ?
2. Comment mieu gérer la mémoire ?
 
Par avances merci de vos réponses

Message cité 1 fois
Message édité par Profil supprimé le 01-08-2008 à 13:18:08
Reply

Marsh Posté le 01-08-2008 à 13:23:42    

ben évidemment tu dois inclure toutes les bibliothèques... si tu veux faire un parser qui décode plusieurs langages il contient fatalement de quoi décoder chaque langage et donc la plupart ne servira pas... c'est un exécutable quoi, tu peux pas en changer le contenu ;) là on sent que tu n'as pas tout saisi au fait que ce soit un langage compilé.
C'est comme si tu voulais que ton photoshop modifie son exe pour n'être capable d'ouvrir que le type de fichier que tu ouvres... ben non il a dans son code de quoi ouvrir tout les types qu'il connaît et il n'en mourra pas.
 
 

Reply

Marsh Posté le 01-08-2008 à 13:34:20    


Première erreur, un tableau en C++ n'est pas un objet comme en JAVA ou en PHP mais un type atomique sans méthode.
En outre, argv est en lecture seule.
 
 
Tu peut pas faire autrement à l'instant T. Y a de smoyens propres (chargement de bibliothèque dynamique par exemple) mais c'est hors de ta portée pour l'instant.

Reply

Marsh Posté le 01-08-2008 à 13:34:20   

Reply

Marsh Posté le 01-08-2008 à 14:02:31    

juste une question: si c'est pour un colorateur syntaxique pourquoi ne pas utiliser des bibliothèques existantes plutot quer de réinventer la roue?!
 
Edit: euhh le titre du topic ne me semble pas correct ... "script" ???? on est pas en php!

Message cité 1 fois
Message édité par papangue le 01-08-2008 à 14:04:32
Reply

Marsh Posté le 01-08-2008 à 14:50:17    

Joel F a écrit :


Première erreur, un tableau en C++ n'est pas un objet comme en JAVA ou en PHP mais un type atomique sans méthode.
En outre, argv est en lecture seule.
 
 
Tu peut pas faire autrement à l'instant T. Y a de smoyens propres (chargement de bibliothèque dynamique par exemple) mais c'est hors de ta portée pour l'instant.


 
aie-je le droit que faire :

Code :
  1. list<char> code = argv;


afin de pouvoir continuer à reprendre ma procédure ?
 

papangue a écrit :

juste une question: si c'est pour un colorateur syntaxique pourquoi ne pas utiliser des bibliothèques existantes plutot quer de réinventer la roue?!
 
Edit: euhh le titre du topic ne me semble pas correct ... "script" ???? on est pas en php!


 
Exacte, rectifié. Pour la gloire et le succès ^^, surtout, pour ma boite qui veut tout faire toute seule  :hello:
 
http://knightoffear.free.fr/ColorC [...] -0-02a.zip


Message édité par Profil supprimé le 01-08-2008 à 15:04:19
Reply

Marsh Posté le 01-08-2008 à 15:02:50    

tu veux faire un colorateur syntaxique ? utilise notepad ++ ou vi (vim, gvim...) ou emacs ou gedit ou kwrite enfin bref un truc déjà fait ^^


---------------
Paf le chien
Reply

Marsh Posté le 01-08-2008 à 15:05:54    

theg a écrit :

tu veux faire un colorateur syntaxique ? utilise notepad ++ ou vi (vim, gvim...) ou emacs ou gedit ou kwrite enfin bref un truc déjà fait ^^


 
 
 
Tout est dit je crois...
 

Reply

Marsh Posté le 01-08-2008 à 15:06:38    

c clair que çà serait plus efficace...
et sinon non tu n'as pas le droit d'écrire directement  

Code :
  1. list<char> code = argv;

Reply

Marsh Posté le 01-08-2008 à 15:18:14    

Malkav a écrit :

aie-je le droit que faire :

Code :
  1. 1. list<char> code = argv;




 
Essaye compile, vois le message d'erreur, comprend, corrige, re-essaye, re-compile.......
Sans être grossier ni méchant, mais la réponse à ce genre de question tu l'auras grâce à ton compilateur.

Reply

Marsh Posté le 01-08-2008 à 18:50:33    

Résultat :

Citation :


-------------- Build: Debug in KolorCodes ---------------
 
Compiling: main.cpp
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:40:27: boost/regex.hpp: No such file or directory
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:42:29: boost/foreach.hpp: No such file or directory
In file included from D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:46:
D:\_X\cpp\ColorCodes\KolorCodes\langages.h:30: error: expected constructor, destructor, or type conversion before '=' token
In file included from D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:51:
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:24: error: `string' was not declared in this scope
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:24: error: template argument 1 is invalid
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:24: error: template argument 2 is invalid
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:24: error: invalid type in declaration before ';' token
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h: In function `std::string ColorCodes::implode(std::string, char**)':
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:34: error: expected primary-expression before "mot"
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:34: error: `BOOST_FOREACH' was not declared in this scope
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:35: error: expected `;' before '{' token
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:32: warning: unused variable 'top'
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:34: warning: unused variable 'BOOST_FOREACH'
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp: In function `int main(int, char***)':
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:57: error: conversion from `char**' to non-scalar type `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' requested
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:59: error: conversion from `char***' to non-scalar type `std::string' requested
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:61: error: no match for 'operator&&' in '(argc > 1) && (&ColorCodes::langages)->std::map<_Key, _Tp, _Compare, _Alloc>::find [with _Key = std::string, _Tp = std::string, _Compare = std::less<std::string>, _Alloc = std::allocator<std::pair<const std::string, std::string> >](((const std::string& )((const std::string*)(&langage))))'
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:61: note: candidates are: operator&&(bool, bool) <built-in>
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h: In function `Op ColorCodes::Appel_fonction(Op, In) [with Op = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, In = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]':
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp:63:   instantiated from here
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h:60: error: no match for call to `(std::basic_string<char, std::char_traits<char>, std::allocator<char> > ) (std::basic_string<char, std::char_traits<char>, std::allocator<char> >& )'
Process terminated with status 1 (0 minutes, 0 seconds)
14 errors, 2 warnings
 


 
Pourquoi ne trouve-t-il pas la bibliothèque ?
 
http://knightoffear.free.fr/ColorC [...] -0-02b.zip

Reply

Marsh Posté le 01-08-2008 à 19:03:49    

t'as renseigné le chemin vers les .h via -I ou l'option qui va vient dans ton IDE :o

 

Tu sais compilé ou tu jettes juste du code en vrac ?

 

et apparemment t'as rien compris au principe de fonction :

 
Code :
  1. // Fonction d'appel des fonctions (de parsage)
  2.     template<class Op, class In> Op Appel_fonction(Op nom, In arg)
  3.     {
  4.         return nom(arg);
  5.     }
 

Jamais ça marche ça ...

 

Je crois qu'avant de faire le kador en C++ t'as le droit de lire le Kernigham&Ritchie, apprendre à te servir d'un compilateur et comprendre ce que tu fais :/

Message cité 1 fois
Message édité par Joel F le 01-08-2008 à 19:05:33
Reply

Marsh Posté le 01-08-2008 à 19:52:29    

Joel F a écrit :

t'as renseigné le chemin vers les .h via -I ou l'option qui va vient dans ton IDE :o
 
Tu sais compilé ou tu jettes juste du code en vrac ?


Disons simplement que CodeBlock est un cousin éloigné, pour ta seconde remarque, on va dire ni l'un ni l'autre, je connais la touche F9...
 
 

Joel F a écrit :


et apparemment t'as rien compris au principe de fonction :
 

Code :
  1. // Fonction d'appel des fonctions (de parsage)
  2.     template<class Op, class In> Op Appel_fonction(Op nom, In arg)
  3.     {
  4.         return nom(arg);
  5.     }


 
Jamais ça marche ça ...


 
J'ai simplement raisonné par rapport au exemple qui utilisait dans fonction dans mon livre...
Je ne comprend effetivement rien, je raisonne juste par analogie...
 

Joel F a écrit :


Je crois qu'avant de faire le kador en C++ t'as le droit de lire le Kernigham&Ritchie, apprendre à te servir d'un compilateur et comprendre ce que tu fais :/


 
kador, bof, si c'était le cas, je penses que tes paroles seraient vaines, je comprends ce que je fais, mais de là à dire que le compilateur me comprend, ça c'est autre chose...
 
Si je résume mes tors :

  • Non comprhension des templates
  • Non compréhension du compilateur
  • Non maitrise de Code::Block


on avance, doucement mais sûrement...

Reply

Marsh Posté le 01-08-2008 à 19:54:27    

je retire ce que je dit pour Appel_Fonction, j'avais oublié le masquage template du type pointeur de fonction
 
Par contre, prends du temps pour comprendre la différence entre langage compilé et PHP :/

Reply

Marsh Posté le 01-08-2008 à 20:30:25    

Joel F a écrit :

je retire ce que je dit pour Appel_Fonction, j'avais oublié le masquage template du type pointeur de fonction
 
Par contre, prends du temps pour comprendre la différence entre langage compilé et PHP :/


 
La différence est simple, PHP est compilé à la volé, pour faire simple, avoir que les langages compilés on besoin d'être "assimilé" par le compilateur, puis transformé en langage proche du langage machine, donc une opérations supplémentaire...
 
J'ai revus les modèles (templates), je vais m'attaquer à mon IDE,
 
A demain
 
 :hello:

Reply

Marsh Posté le 03-08-2008 à 10:33:51    

y'a du boulot :D


---------------
MK DS 459634-483247
Reply

Marsh Posté le 03-08-2008 à 13:40:34    


 
Je confirme, j'ai du mal à dompter le fauve...
 
Je vais y arriver : "tout est possible, tout est réalisable..."

Reply

Marsh Posté le 04-08-2008 à 10:28:14    

BOnne chance

Reply

Marsh Posté le 09-08-2008 à 14:13:18    

changelog : http://knightoffear.free.fr./Color [...] -0-03a.zip
 
J'ai tenté une vingtaines de compilations :
 

Citation :


C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\mpl\eval_if.hpp|38|instantiated from `boost::mpl::eval_if<mpl_::bool_< false>, boost::range_const_iterator<char**>, boost::range_mutable_iterator<char**> >'|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\foreach.hpp|368|instantiated from `boost::foreach_detail_::foreach_iterator<char**, mpl_::bool_< false> >'|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\mpl\eval_if.hpp|38|error: no type named `type' C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\range\mutable_iterator.hpp|37|error: `char**' is not a class, struct, or union type|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\foreach.hpp|368|instantiated from `boost::foreach_detail_::foreach_iterator<char**, mpl_::bool_< false> >'|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\foreach.hpp|368|error: no type named `type' in `struct boost::mpl::eval_if<mpl_::bool_< false>, boost::range_const_iterator<char**>, boost::range_mutable_iterator<char**> >'|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\foreach.hpp|374|error: no type named `type' in `struct boost::foreach_detail_::foreach_iterator<char**, mpl_::bool_< false> >'|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\foreach.hpp||In function `void boost::foreach_detail_::next(const boost::foreach_detail_::auto_any_base&, boost::foreach_detail_::type2type<T, C>*) [with T = char**, C = mpl_::bool_< false>]':|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\foreach.hpp|705|error: no type named `type' in `struct boost::foreach_detail_::foreach_iterator<char**, mpl_::bool_< false> >'|
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\boost\foreach.hpp|706|error: no type named `type' in `struct boost::foreach_detail_::foreach_iterator<char**, mpl_::bool_< false> >'|
||=== Build finished: 15 errors, 0 warnings ===|


 
BOOST bug ?
 

Citation :


D:\_X\cpp\ColorCodes\KolorCodes\langages.h|30|error: expected constructor, destructor, or type conversion before '=' token|


 
J'ai respécté les règles, pourquoi il veut pas ?
 

Citation :


D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h|34|instantiated from here|
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h|34|instantiated from here|
in `struct boost::range_mutable_iterator<char**>'|
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h|34|instantiated from here|
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h|34|instantiated from here|
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h|34|instantiated from here|
D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h|34|error: no matching function for call to `deref(const boost::foreach_detail_::auto_any_base&, boost::foreach_detail_::type2type<char**, mpl_::bool_< false> >*)'|


 
Pourquoi il me le dit. On dirait qu'il a perdu un truc ?
 

Citation :


D:\_X\cpp\ColorCodes\KolorCodes\fonctions.h||In function `std::string ColorCodes::implode(std::string, char**)':|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp||In function `int main(int, char***)':|


 
Pourquoi il me le dit ?
 

Citation :


D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|59|error: conversion from `char***' to non-scalar type `std::string' requested|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|61|error: invalid conversion from `char**' to `char'|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|61|error:   initializing argument 1 of `typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const _Key& ) [with _Key = char, _Tp = char, _Compare = std::less<char>, _Alloc = std::allocator<std::pair<const char, char> >]'|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|61|error: no match for 'operator>' in '(&ColorCodes::langages)->std::map<_Key, _Tp, _Compare, _Alloc>::find [with _Key = char, _Tp = char, _Compare = std::less<char>, _Alloc = std::allocator<std::pair<const char, char> >](((const char& )((const char*)(&((char)(+langage)))))) > 0'|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|65|error: invalid conversion from `char**' to `char'|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|65|error:   initializing argument 1 of `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key& ) [with _Key = char, _Tp = char, _Compare = std::less<char>, _Alloc = std::allocator<std::pair<const char, char> >]'|


 
Comment puis-je résourdes ses erreurs de conversions ?
 

Citation :

D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|65|error: invalid operands of types `const char*' and `const char[3]' to binary `operator+'|


 
C'est un string normalement, d'après ma déclaration...
 

Citation :

D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|68|warning: statement has no effect|


 
Par avance merci de votre aide...

Reply

Marsh Posté le 09-08-2008 à 19:16:52    

1/ boost ne bug que rarement. Regarde le message d'erreur et la doc de for_each ...
2/ on n'initialiase pas du code en plein milieu d'un .h ....
3/ RTFM
4/ RTFM
5/ oui mais non, erreur du à l'erreur 2/
 

Reply

Marsh Posté le 09-08-2008 à 20:37:05    

j'ai bossé ça, j'ai mit un coup de pied à BOOST FOREACH : http://knightoffear.free.fr/ColorC [...] -0-03b.zip
 

Citation :

D:\_X\cpp\ColorCodes\KolorCodes\langages.cpp|30|error: expected constructor, destructor, or type conversion before '=' token|


 
J'ai revus mon code, il veut toujours rien savoir...
 

Citation :


D:\_X\cpp\ColorCodes\KolorCodes\main.cpp||In function `int main(int, char***)':|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|57|error: invalid conversion from `const char*' to `char'|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|57|error: cannot convert `char*' to `char**' for argument `2' to `std::string ColorCodes::implode(char, char**, int)'|


 

Code :
  1. std::string code = ColorCodes::implode(" ", **argv, argc);


 
Je bloque sur ce point, some help, please...
 

Citation :


D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|59|error: request for member `find' in `ColorCodes::langages', which is of non-class type `std::map<char, char, std::less<char>, std::allocator<std::pair<const char, char> > >[1]'|


 
D'après ce que je comprend, il trouve pas la méthode ?
 

Citation :


D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|63|error: invalid types `std::map<char, char, std::less<char>, std::allocator<std::pair<const char, char> > >[1][char**]' for array subscript|


 
Comment concaténer 3 char, :/
 
[quote]
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|66|warning: statement has no effect|
||=== Build finished: 5 errors, 1 warnings ===|
[quote]
 
A cause du 2...
 
un peu d'aide ?
 
On y est presque ^^

Reply

Marsh Posté le 09-08-2008 à 21:24:19    


non, pas vraiment.
Tu peux nous expliquer avec des mots ce que tu essaies de faire là :

Code :
  1. std::map<char,char> langages[1];


et là :

Code :
  1. langages["langage_ex"]="langage";


?
 
question subsidiaire : quel est le type de

Code :
  1. "langage_ex"


à ton avis ?

Reply

Marsh Posté le 10-08-2008 à 12:07:04    

SquiZZ a écrit :


non, pas vraiment.
Tu peux nous expliquer avec des mots ce que tu essaies de faire là :

Code :
  1. std::map<char,char> langages[1];


et là :

Code :
  1. langages["langage_ex"]="langage";


?
 
question subsidiaire : quel est le type de

Code :
  1. "langage_ex"


à ton avis ?


 
1/ Je tente de créer une map, avec une allocation pour une seule paire
 
Correction :

Code :
  1. std::map<std::string,std::string> langages[1];


 
2/
Correction :

Code :
  1. langages.insert(make_pair("langage_n", "langage_f" ));


j'insert un pair de string (clef/valeur)
 
3/ je dirais un char[]
 
malgrès ces deux corrections, une erreur persistent :

Citation :

D:\_X\cpp\ColorCodes\KolorCodes\langages.cpp|30|error: expected constructor, destructor, or type conversion before '.' token|


 
...aidez moi, je vois toujours pas.
 

Citation :

D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|64|warning: character constant too long for its type|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|64|error: no match for 'operator[]' in 'ColorCodes::langages[langage]'|
||=== Build finished: 4 errors, 1 warnings ===|


 
Je ne comprends pas...
 

Citation :

D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|58|error: wrong type argument to bit-complement|


Code :
  1. std::string langage;
  2.     // Récupération du langage
  3.     char** langage_inter = argv[1];
  4.     langage.push_back(**langage_inter);
  5.     ~langage_inter; // l.58


 
Pourquoi ne veut-il ps me supprimmer cette variable ? elle n'est pas en lecture seule...
 
Il me manque la méthode count, insert et la surcharge d'opérateur à map, je fais comment pour y acceder
 
http://knightoffear.free.fr/ColorC [...] -0-03c.zip

Reply

Marsh Posté le 10-08-2008 à 15:48:41    

on appelle pas un destructeur sur une variable locale .. elle est détruite automatiquement.

 

Reprend ton bouquin depuis la page 1 stp v_v, j'ai mes yeux qui saignent.

Message cité 1 fois
Message édité par Joel F le 10-08-2008 à 15:48:49
Reply

Marsh Posté le 10-08-2008 à 16:41:48    

Joel F a écrit :

on appelle pas un destructeur sur une variable locale .. elle est détruite automatiquement.
 
Reprend ton bouquin depuis la page 1 stp v_v, j'ai mes yeux qui saignent.


 
Merci de ta patience et de ton entêtement, sur ce, j'ai deux questions :
1. comment optenir les partie manquante ?
2. Comment puis-je rendre mon script optimal, tant au point de vue de la lecture, que des performance et de la qualité d'éxécution ?
 
Par avance merci

Reply

Marsh Posté le 10-08-2008 à 17:08:55    

je comprends pas ta question 1
la question 2, 'en ai encore loin. On verra quand ton truc compilera deja

Reply

Marsh Posté le 10-08-2008 à 17:19:18    

Joel F a écrit :

je comprends pas ta question 1
la question 2, 'en ai encore loin. On verra quand ton truc compilera deja


 
Lorsque je tente une compilation j'obtiuens ces messages :

Citation :

||=== KolorCodes, Debug ===|
D:\_X\cpp\ColorCodes\KolorCodes\langages.cpp|30|error: expected constructor, destructor, or type conversion before '.' token|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp||In function `int main(int, char***)':|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|61|error: request for member `count' in `ColorCodes::langages', which is of non-class type `std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >[1]'|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|63|warning: character constant too long for its type|
D:\_X\cpp\ColorCodes\KolorCodes\main.cpp|63|error: no match for 'operator[]' in 'ColorCodes::langages[langage]'|
||=== Build finished: 3 errors, 1 warnings ===|


 
Hors, langage est une map, d'après ce que je comprend, je tente de faire appel à des méthodes, et à un opérateur inéxistant, je pense que ça vient de la définition std::map qui ne doit pas être complète...
 
D'où ma question : comment compléter mon modèle ?

Reply

Marsh Posté le 10-08-2008 à 17:35:32    

non std::map est complet, tu utilsies juste des trucs qui n'existe aps. Lis la doc de map stp

Reply

Marsh Posté le 10-08-2008 à 17:54:04    

J'ai cherché un moment avant d'avoir cette hypothèse :
Les [] : [url]http://www.cplusplus.com/reference/stl/map/operator[].html[/url]
 
Effectivement, au lieu de faire

Code :
  1. mymap['a']


 
Je fais :

Code :
  1. ColorCodes::langages[langage]


 
Différences : j'ai un std::string, ils ont un char, j'ai une porté, pas eux, langage, la clef, est dynamique...
 
insert : http://www.cplusplus.com/reference/stl/map/insert.html
 
Eux :

Code :
  1. mymap.insert ( pair<char,int>('z',200) );


 
Moi :

Code :
  1. langages.insert(std::pair<std::string,std::string>("langage_n", "langage_f" ));


 
un dernier ?
count : http://www.cplusplus.com/reference/stl/map/count.html
 
Eux :

Code :
  1. if (mymap.count(c)>0)


 
Moi :

Code :
  1. if(argc > 1 && ColorCodes::langages.count(langage) > 0)


 
Voila, voila...

Reply

Marsh Posté le 10-08-2008 à 19:40:09    

y a pas à faire d'hypothèse, le compilo te file une erreur de type, t'as la doc. Après c'est comme dans le journal de Mickey, c 'est le jeu des "Une Erreur" ...
 
Tu comprends la notion de type et de signature de méthode ou pas ? car là c'est typiquement ça. Ça n'a aucun rapport avec le fait que tes trucs soit dynamiques ou pas, du nombre de scope etc

Reply

Marsh Posté le 10-08-2008 à 20:04:50    

Joel F a écrit :

y a pas à faire d'hypothèse, le compilo te file une erreur de type, t'as la doc. Après c'est comme dans le journal de Mickey, c 'est le jeu des "Une Erreur" ...
 
Tu comprends la notion de type et de signature de méthode ou pas ? car là c'est typiquement ça. Ça n'a aucun rapport avec le fait que tes trucs soit dynamiques ou pas, du nombre de scope etc


 
La notion de type je maitrise, la notion de signature de méthode je pense que c'est la même chose, mais par rapport aux méthode ; donc ce serait un problème de type, je bosse ça et je reviens...

Reply

Marsh Posté le 11-08-2008 à 17:07:25    

J'ai bossé un peu, et il ne me reste plus qu'une erreur :
 

Citation :

D:\_X\cpp\ColorCodes\KolorCodes\langages.cpp||In function `int main(int, char***)':|
D:\_X\cpp\ColorCodes\KolorCodes\langages.cpp|18|error: expected primary-expression before "namespace"|
D:\_X\cpp\ColorCodes\KolorCodes\langages.cpp|18|error: expected `;' before "namespace"|
||=== Build finished: 2 errors, 0 warnings ===|


 

Code :
  1. namespace ColorCodes{
  2.     /*
  3.         Listes des langages
  4.     */
  5.     #include "lib/langage_ex.cpp"
  6.     ColorCodes::langages["langage_ex"]=ColorCodes::langage; // ajouté le 31/07/2008 - 16:45
  7. }


 

Code :
  1. int main(int argc, char** argv[])
  2. {
  3.     /*
  4.         Inclusion du tableau des langages supportés
  5.     */
  6.     #include "langages.cpp"


 
Voilà, je ne comprend pas trop, pc si je commente ou que j'enlève la déclaration de l'espace nom... j'ai la même erreur
 
Par avance merci de votre aide
 
changelog : [url]http://knightoffear.free.fr/ColorCodes/colorcodes-0-04a.zip[cpp]


Message édité par Profil supprimé le 11-08-2008 à 17:26:25
Reply

Marsh Posté le 11-08-2008 à 17:23:42    

[:pingouino]
 
merci de réapprendre le c++

Reply

Marsh Posté le 11-08-2008 à 18:21:50    

j'abandonne perso ...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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