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 :

Macro : dupliquer code


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut Macro : dupliquer code
    bonjour,

    Dans mon serveur Telnet/HTTP, je dois déclarer mes sockets comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sockets[] = {
    	{TCP_PURPOSE_HTTP_SERVER, HTTP_TX_TCPBUFFERSIZE   , HTTP_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_TELNET,        , TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE}
    };

    Existe t-il une méthode pour dupliquer mes lignes en fonction d'un #define qui correspondrait au nombre de socket ?
    Par exemple, si je déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define HTTP_SOCKET_COUNT (2)
    #define TELNET_SOCKET_COUNT (3)
    Je voudrais que le tableau généré soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sockets[] = {
    	{TCP_PURPOSE_HTTP_SERVER, HTTP_TX_TCPBUFFERSIZE   , HTTP_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_HTTP_SERVER, HTTP_TX_TCPBUFFERSIZE   , HTTP_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_TELNET,        , TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_TELNET,        , TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_TELNET,        , TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE}
    };
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    Existe t-il une méthode pour dupliquer mes lignes en fonction d'un #define qui correspondrait au nombre de socket ?
    Par exemple, si je déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define HTTP_SOCKET_COUNT (2)
    #define TELNET_SOCKET_COUNT (3)
    Je voudrais que le tableau généré soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sockets[] = {
    	{TCP_PURPOSE_HTTP_SERVER, HTTP_TX_TCPBUFFERSIZE   , HTTP_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_HTTP_SERVER, HTTP_TX_TCPBUFFERSIZE   , HTTP_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_TELNET,        , TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_TELNET,        , TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE},
    	{TCP_PURPOSE_TELNET,        , TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE}
    };
    Bonjour

    Si c'est faisable à la main, alors c'est faisable en prog

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int sockets[(HTTP_SOCKET_COUNT + TELNET_SOCKET_COUNT) * 3];
    for (i=0; i < HTTP_SOCKET_COUNT + TELNET_SOCKET_COUNT; i++) {
    	sockets[i*3]=i < TELNET_SOCKET_COUNT ?TCP_PURPOSE_HTTP_SERVER :TCP_PURPOSE_TELNET;
    	sockets[i*3+1]=TELNET_RX_TCPBUFFERSIZE;
    	sockets[i*3+2]=TELNET_TX_TCPBUFFERSIZE;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Merci pour votre réponse mais cette solution ne me convient pas.
    Le tableau est utilisé par une library et il doit être déclaré dans un fichier .h (cette lib n'est pas de moi et est assez mal organisée). Je ne veux donc pas modifier le code source/l'organisation de cette lib : c'est pourquoi, je voulais savoir s'il n'existait pas de solution à base de macro de façon à n'avoir que mon fichier .h à modifier.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il m'est arrivé une seule fois de faire des macros avec génération de code comme dans ton cas. Ca obligeait bien sûr à passer deux fois le pré-compilateur. Je l'avais fait un peu par contrainte et beaucoup pour le fun mais j'ai laissé tombé. C'est une technique tellement inhabituelle et le code écrit est tellement compliqué que j'ai fait autrement. Maintenant que j'ai raconté ma vie, passons à ton problème

    Générer du code à partir de macro va t'obliger à lancer au moins deux fois le pré-compilateur. N'as-tu pas d'autre solution ?
    Tu peux déclarer un tableau dans un .h et l'initialiser ailleurs comme le montre Sve@r.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Peut-être je vais dire une grosse ânerie, mais un truc comme cela non testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #define REPEAT_1(X) X,
     
    #define REPEAT_2(X) \
        X, \
        X,
     
    #define REPEAT_2_END(X) \
        X, \
        X
     
    #define REPEAT_3(X) \
        X, \
        X, \
        X,
     
    #define REPEAT_3_END(X) \
        X, \
        X, \
        X
     
    #define REPEAT_4(X) \
        X, \
        X, \
        X, \
        X,
     
    #define REPEAT_4_END(X) \
        X, \
        X, \
        X, \
        X
     
    #define REPEAT_5(X) \
        X, \
        X, \
        X, \
        X, \
        X,
     
    #define REPEAT_5_END(X) \
        X, \
        X, \
        X, \
        X, \
        X

    Et donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sockets[] = {
        REPEAT_2(  {TCP_PURPOSE_HTTP_SERVER, HTTP_TX_TCPBUFFERSIZE   , HTTP_RX_TCPBUFFERSIZE} )
        REPEAT_3_END( {TCP_PURPOSE_TELNET,        TELNET_TX_TCPBUFFERSIZE, TELNET_RX_TCPBUFFERSIZE} )
    }

    Édit: Ahahahah je m'en doutais un petit peu: si on passe des variables cela passe, mais pas avec des lignes complètes

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Merci pour vos réponses

    C'était aussi un peu pour le fun que je voulais faire ça


    J'étais partie sur le même genre de solution que foetus mais avec quelques améliorations ce qui évites de devoir modifier le code du tableau (je n'ai plus qu'a modifier LOOP_COUNT) :
    => inspiré de http://blog.huoc.org/recursivite-imb...rocesseur.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #define LOOP_COUNT 5 // nombre de lignes à dupliquer
     
     
    // *******************************
    #define DATA 10 // contenu de la ligne à insérer
    //#define DATA {1,2} // ne fonctionne pas
     
    #define LOOP_0(x)
    #define LOOP_1(x) x
    #define LOOP_2(x) x, x
    #define LOOP_3(x) x, x, x
    #define LOOP_4(x) x, x, x, x
    #define LOOP_5(x) x, x, x, x, x
     
    #define LOOP_VAL(x) x
    #define LOOP_CMD(x) LOOP_##x
    #define LOOP(x, y) LOOP_CMD(x)(y)
     
     
    int main()
    {
        //char tab[][2] = {DATA};
        //char tab[][2] = {LOOP_5(DATA)};
        //char tab[][2] = {LOOP_CMD(5)(DATA)};
        //char tab[][2] = {LOOP_CMD(LOOP_VAL(LOOP_COUNT))(DATA)};
        char tab[] = {LOOP(LOOP_COUNT, DATA)};
        return 0;
    }
    // *******************************
    ça semble fonctionner si DATA est un nombre unique par contre quand je le remplace par {1, 2} ça ne fonctionne plus

    PS: je n'ai pas envie de m’embêter à lancer 2x le pre-compilateur

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #define REPEAT_1(X) X,
     
    #define REPEAT_2(X) \
        X, \
        X,
     
    #define REPEAT_2_END(X) \
        X, \
        X
     
    #define REPEAT_3(X) \
        X, \
        X, \
        X,
     
    #define REPEAT_3_END(X) \
        X, \
        X, \
        X
     
    #define REPEAT_4(X) \
        X, \
        X, \
        X, \
        X,
     
    #define REPEAT_4_END(X) \
        X, \
        X, \
        X, \
        X
     
    #define REPEAT_5(X) \
        X, \
        X, \
        X, \
        X, \
        X,
     
    #define REPEAT_5_END(X) \
        X, \
        X, \
        X, \
        X, \
        X
    Arf qu'est-ce que c'est quoi que qu'est-ce que c'est cte horreur ???
    Et sinon t'es libre pour dîner mercredi prochain ? Tu pourrais nous parler de tes codes, tes expériences, tes espoirs dans la prog...

    Citation Envoyé par boboss123 Voir le message
    je n'ai pas envie de m’embêter à lancer 2x le pre-compilateur
    Mouais c'est sûr. Mieux vaut t'embêter avec tes LOOP. Moi je suis un compilateur ; je vois ça je me crashe exprès !!!

    Non sans rire, t'as pensé au pauvre type qui sera obligé de te relire quand tu seras parti ??? Ou alors tu t'exerce au ioccc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Non sans rire, t'as pensé au pauvre type qui sera obligé de te relire quand tu seras parti ??? Ou alors tu t'exerce au ioccc...
    Comme ça ils ne pourront pas me virer

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    ou alors ils appellent du sabotage, et tu te fais virer précisément pour cela.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/02/2012, 17h18
  2. Requete ou macro ou code ?
    Par Rafikaccess dans le forum IHM
    Réponses: 20
    Dernier message: 10/06/2006, 13h12
  3. Prob pour exporter une macro en code VBA
    Par electrosat03 dans le forum Access
    Réponses: 6
    Dernier message: 04/02/2006, 20h15
  4. Enregistrer fichier .xls sans macro ni code vb
    Par alexxx69 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/11/2005, 18h48
  5. Fenetre Action Macro "Executer Code" pour Module
    Par beurnoir dans le forum Access
    Réponses: 16
    Dernier message: 21/10/2005, 17h15

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