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 :

Commande FOR du preprocesseur???


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Commande FOR du preprocesseur???
    Salut!

    J'ai une fonction template dont le prototype est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<int i>
    void f()
    j'aimerais avoir 100 fonctions de ce type seulement différenciées par la valeur du parametre template i;
    mais au lieu de les taper a la main:
    je me demandait si il n'existait pas une commande du préprocesseur du type "for":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #for(int i=0;i<100;i++){
    #f<i>;
    #}
    Merci d'avance de votre aide!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    A ma connaissance cela n'existe pas ...
    Mais on peut supposer que ce besoin est du à un problème de conception.
    A quoi cela servirait? Es-tu sur qu'il n'y a pas moyen de faire ça autrement ?

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    En fait le prog est chargé de trouver les ports occupés de l'ordi à l'adresse locale 127.0.0.1:
    pour cela la fonction scan crée un socket "client" qui va tenter d'effectuer une connection sur des ports,si la connection échoue c'est qu'ils sonts occupés.

    Mais vu la lenteur d'un test:1 seconde environ, c'est bon pour une dizaine de ports mais pas pour les 65535 ports!

    Donc j'ai voulu lancer plusieurs instances de ma fonction "scan" en parallele grace aux threads en spécifiant pour chaque instance une "base" différentes mais il me lancait bien 10 instance mais qui tournaient avec les mêmes paramétres,l'idée étant que une fonction avec la base 0 analyserait les ports 0 10 20 ...,avec la base 2 les ports 2 12 22 32 ...

    Donc je me suis orienté vers les template et "base" est devenu un parametre template.
    J'ai donc testé avec 10 instances de ma fonction,en faisant a la main scan<1>,scan<2>...nickel elles marchent en paralleles sur des ports différents et analysent 10 ports a la seconde!

    Maintenant j'aimerais en lancer 100 en "parallele",je n'espere pas 100 ports analysés a la seconde mais avec mon 2.8 giga on peut aller plus loin que 10 ports a la seconde je pense...

    Donc pour ne pas écrire 100 fois chaque scan<base> comment faire?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    et pourquoi pas une seule et unique fonction scan(int base) ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Quel est l'intérêt de passer i en tant que paramètre template ?

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    En effet ...
    Et puis ton problème de toute à l'heure ... tu peux le faire en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0;i<65535;++i)
    {
        f<i>();
    }
    Mais il doit y avoir un meilleur moyen de faire ça ...

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Alp
    Et puis ton problème de toute à l'heure ... tu peux le faire en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0;i<65535;++i)
    {
        f<i>();
    }
    Mais il doit y avoir un meilleur moyen de faire ça ...
    Non, un paramètre template doit être connu à la compilation.

    Pour l'équivalent du for en meta-programmation voir ce tuto :
    http://loulou.developpez.com/tutoriels/cpp/metaprog/

    Mais je doute que ça aide notre ami.

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par b4u
    et pourquoi pas une seule et unique fonction scan(int base) ?
    justement parce que le multi-thread avec le passage de parametre classique me générait 10 instances analysant les mêmes ports:0 10 20 30...

    Quel est l'intérêt de passer i en tant que paramètre template ?
    c'est justement un artifice au probleme du passage de parametre classique.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Là, il n'y a pas d'artifice à avoir, une boucle for en C++ normale fonctionne tout aussi bien, je ne vois pas le problème du tout.

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Loulou24
    Pour l'équivalent du for en meta-programmation voir ce tuto :
    http://loulou.developpez.com/tutoriels/cpp/metaprog/
    J'ai déjà utilisé cet excellent tuto pour les developement limité mais j'ai pas vu de "For".

    Mais sinon j'ai déjà essayé de faire en sorte qu'une fonction template i instancie la i+1 par récursion mais d'une part ça m'obligeait a placer en globale certaines données du prog et puis c'était beaucoup moin "propre" que des instanciations "classiques".

    Euh peut on vraiment parler d'instanciation au niveau du préprocesseur?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Miles
    Là, il n'y a pas d'artifice à avoir, une boucle for en C++ normale fonctionne tout aussi bien, je ne vois pas le problème du tout.
    Normalement ça devrait mais il ya un probléme!

    Voir plus haut.

    En réalité je débute en thread (aujourd'hui)!
    Et donc je me contente de bricoler avec les conseils et l'aide que je recois sur ce forum dés que ça bloque et des codes trouvés dans d'autres tutos.

    J'essaie de contourner les problémes que je rencontre!

    Désolé d'en générer d'autres!!!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est un problème qui vient de ta paramétrisation

  13. #13
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Rho l'erreur bête d'innattention que j'ai faite
    Et un for sans multithreads, ça prend tant de temps que ça?

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Miles
    C'est un problème qui vient de ta paramétrisation
    Sans aucun doute car c'est là qu'a eut lieu le dernier blocage:
    voir le topic:
    http://www.developpez.net/forums/viewtopic.php?t=471853

    Encore merci à Loulou24 pour sa réponse qui m'a permit de compiler.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Alp
    Et un for sans multithreads, ça prend tant de temps que ça?
    Il faut une seconde pour analyser 1 port!

    Donc à la queu-leu-leu c'est pas gérable.

    Sinon je me demandais:
    Peut on réduire ce temps entre la tentative de connection et la réponse?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  16. #16
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Tu peux t'en sortir avec une seule instance de classe à mon avis.
    imagine la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct s_thread_param
    {
    	int base;
    	Scanner *this_scanner;
    };
    En supposant que la classe Scanner est celle à partir de laquelle tu controle toute l'opération:
    -> tu créé un certain nombre de threads en passant comme paramètre une structure s_thread_param remplie avec la base que tu souhaite scanner et le pointeur d'instance this dans this_scanner
    -> dans ta fonction membre statique (normalement elle prend un unique paramètre de type void*) qui lance le scan pour une thread donnée, tu récupère la structure s_thread_param passée en argument. Ensuite un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this_scanner->scan(base);
    à partir de la fonction statique devrait faire l'affaire (la méthode void scan(int base); étant membre de la classe Scanner)

  17. #17
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de me donner des pistes mais là je suis un peu dépassé:
    je n'utilise presque pas les classes,
    je sais vaguement ce qu'est une fonction statique,
    et pour ce qui est du passage de parametre a un thread je suis à l'ouest!

    Dans quelques temps,avec un peu de recul,
    j'essayerais de reconsidérer la proposition et de la comprendre
    mais pour l'instant refondre mon prog en utilisant des notions que je maîtrise encore moins risque d'agraver mon probleme!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  18. #18
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut Re: Commande FOR du preprocesseur???
    Citation Envoyé par seriousme
    j'aimerais avoir 100 fonctions de ce type seulement différenciées par la valeur du parametre template i;
    mais au lieu de les taper a la main:
    je me demandait si il n'existait pas une commande du préprocesseur du type "for":
    Il y ace genre de choses, qui se nomme préprocessor metaprogramming, et est un complément utile au template metaprogramming. Regarde par exemple :

    http://www.boost.org/libs/preprocessor/doc/index.html
    http://www.boost.org/libs/preprocessor/doc/ref/for.html
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  19. #19
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci pour la réponse!

    J'ai parcouru rapidement les liens mais:
    ça a l'air compliqué
    je suis pas sur que Dev-C++ le supporte


    Mais je vais m'y mettre quand même...on verra bien!

    Merci encore.

    PS:Si quelqu'un connait d'autres solutions je suis preneur.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  20. #20
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    J'ai fait une petite macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define f(a) (liste_thread[a] = CreateThread ( NULL, 0, scan<a>, (LPVOID) parametre, 0, &dwThreadId ) )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f(0);
    f(1);
    f(2);
    f(3);
    ...
    Ca marche mais ça oblige encore à taper f(base).
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. la commande for en shell
    Par fatnet dans le forum Administration système
    Réponses: 2
    Dernier message: 04/01/2009, 14h11
  2. La commande FOR en BATCH
    Par benkhdiri dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 15/12/2008, 13h36
  3. [Batch Dos] probleme commande for /F
    Par dob2806 dans le forum Scripts/Batch
    Réponses: 12
    Dernier message: 02/10/2008, 17h18
  4. commande FOR /F
    Par ouinih dans le forum Windows
    Réponses: 1
    Dernier message: 05/03/2008, 17h59
  5. Retour d'erreur avec l'utilisation de la commande For en VBS
    Par genialk2000 dans le forum VBScript
    Réponses: 3
    Dernier message: 30/03/2005, 18h45

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