Executer une partie de code ou une autre

Executer une partie de code ou une autre - C++ - Programmation

Marsh Posté le 23-07-2007 à 10:20:20    

Salut,
 
Je souhaiterais que soit executé une partie de code ou bien une autre partie de code en fonction d'une variable initialisée en début de fichier .cpp
 
exemple:  
si var = TRAITEMENT_1, executer la partie de code n°1
si var = TRAITEMENT_2, executer la partie de code n°2
 
Je crois que c'est faisable en utilisant les balises #define, mais je vois pas comment.
 
Merci d'avance.

Reply

Marsh Posté le 23-07-2007 à 10:20:20   

Reply

Marsh Posté le 23-07-2007 à 10:27:35    

http://casteyde.christian.free.fr/ [...] c1039.html

 

Google tips : c++ structure de controle if


Message édité par LePhasme le 23-07-2007 à 10:28:23
Reply

Marsh Posté le 23-07-2007 à 10:55:57    

Une autre solution, peut être plus dans l'esprit de ce que tu voulais faire initialement :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. #define VARIABLE 5
  4. int main()
  5. {
  6. #if VARIABLE==10
  7.   cout << "variable = 10" << endl;
  8. #elif VARIABLE==5
  9.   cout << "variable = 5" << endl;
  10. #else
  11.   cout << "La valeur n'est pas listée !" << endl;
  12. #endif
  13. }


 
Ainsi, le paramètre variable est comparée à partir de sa valeur définie dans le fichier, dès la compilation.

Reply

Marsh Posté le 23-07-2007 à 11:01:35    

heu vaut mieux donner le contexte, voir si y'a pas une solution plus propre....

Reply

Marsh Posté le 23-07-2007 à 12:28:54    

bjone a écrit :

heu vaut mieux donner le contexte, voir si y'a pas une solution plus propre....


 
Merci nathan_g, c'est exactement ça que je cherchais.
 
Voici le contexte. Il s'agit d'un serveur qui peut être compilé soit sous la forme d'un serveur HTTP, soit sous la forme d'un serveur SIP (communication VoIP). Vu que je me base sur un serveur HTTP pour y construire le serveur SIP, je souhaite garder en commun aux deux la plus grande partie du code, et mettre des #ifdef / #endif pour les parties distinctes.
 
Ainsi, par exemple:  
 
dans le header :

Code :
  1. // Server use (one of these below)
  2. #define SERVER_USE_HTTPS   1
  3. //#define SERVER_USE_SIPS   2


 
dans le source :

Code :
  1. #ifdef SERVER_USE_HTTPS
  2. INT     iPortNumber     = 443;     // default for HTTPS is 443
  3. #else
  4. INT  iPortNumber  = 5061;     // default for SIPS is 5061
  5. #endif


 
Je ne suis pas sur que ce soit la solution la plus propre, mais c'est un début.
Merci encore  :jap:

Reply

Marsh Posté le 23-07-2007 à 12:58:55    

il faudrait avoir une vision un peu globale.
 
mais non ça me parait pas propre.
 
déjà tes variables et ports doivent être configurables, et si tu as une partie tranport différente, il vaudrait mieux passer par un objet qui s'occupe de ça, avec des primitives qui vont bien.
 
avec par exemple la possibilitée de faire les "deux".
 
style:
 
 

Code :
  1. class Communication_Layer
  2. {
  3. public:
  4.      // primitives de communication
  5.      virtual bool Initialize() = 0;
  6.      virtual bool Send( ..... ) = 0;
  7.      ....
  8. };
  9. class HTTPS_Layer : public Communication_Layer
  10. {
  11. public:
  12.      virtual bool Initialize(); // gnagna init http...
  13.      .....
  14. };
  15. class SIP_Layer : public Communication_Layer
  16. {
  17.      .... idem
  18. };
  19. class ServerEngine
  20. {
  21. public:
  22.     std::vector< boost::shared_ptr<Communication_Layer> > Layers;
  23.     void CreateCommunicationLayers(); // parse un fichier de config et instancie les couches de communication...     
  24. };


 
 
enfin voilà, les trucs figés, c'est très vilain: si tu as plusieurs modes de communication, il vaut mieux réfléchir à créer un objet d'abstraction avec les primitives minimalistes et le masquage de l'implémentation de la communication, et ainsi de pouvoir brasser ce que tu veux avec des communication multiples de natures différentes.
 
bon c'est une idée.
 
après, si tu n'as pas encore la vision des objets clés et de leurs primitives (le choix de bonnes primitives est la clé des perfs et de la souplesse de manière simultannée), tu peux bricoler encore un peu ton truc avec tes compilations conditionnelles, mais si tu pousses ton projet sur un stade avancé ça va être une usine à gaz a maintenir.


Message édité par bjone le 23-07-2007 à 13:01:15
Reply

Marsh Posté le 23-07-2007 à 13:42:02    

Merci bjone pour ton explication. Je vois bien de quoi tu parles. Et en effet, je n'ai pas de vision assez globale sur le programme de base (basé sur HTTP) pour encapsuler tout ça en classes, surtout que ce programme de base n'est pas du tout programmé comme tel.
Mais c'était une idée intéressante je te l'accorde. Merci bien.
 
Pour continuer dans mon contexte, les protocoles HTTP et SIP sont vraiment similaire (le protocole SIP est basé sur HTTP), donc je me retrouve à effectuer quelques changements. Mon but n'est pas non plus de réaliser une application *propre* maintenant, mais bel et bien de réaliser un prototype en SIP qui fasse à peu prêt comme celui en HTTP.
 
Bon je sais pas si j'ai été clair, mais je pense m'en sortir avec les #def ...

Reply

Marsh Posté le 23-07-2007 à 19:12:26    

pour un proto ça peut faire l'affaire :)

Reply

Sujets relatifs:

Leave a Replay

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