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 :

Macros


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut Macros
    Bonjour,

    Je voudrais appeler une macro définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MACRO(i)  /* corps de la macro */
    700 fois, sans devoir tapper les 700 lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MACRO(1)
    MACRO(2)
    MACRO(3)
    ....
    MACRO(700)
    Merci

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ben un for

  3. #3
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Ben un for
    Avant qu'il demande comment on fait une boucle for, je me permets de lui répondre par avance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define NB_BOUCLE 700
    [......]
    int i;
     
    for (i=0; i<NB_BOUCLE; i++) {
         MACRO(i);
    }
    [......]

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Je pense que la question porte sur le preprocesseur, et je ne crois pas qu'on puisse faire une boucle "for" ou autre avec le preprocesseur...

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par rigobert
    Je pense que la question porte sur le preprocesseur, et je ne crois pas qu'on puisse faire une boucle "for" ou autre avec le preprocesseur...
    Si si j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
     
    #define DUMP(x) printf ("%d\n", x)
     
    int main(void) {
        int i;
        for(i=0; i < 10; i++)
        DUMP(i);
        return 0;
    }

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Ce que voulait dire Rigobert, c'est faire une boucle avec les instructions du préprocesseur, un truc du genre "#FOR.........". A mon avis ce genre de chose n'existe pas.

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par crocodilex
    Ce que voulait dire Rigobert, c'est faire une boucle avec les instructions du préprocesseur, un truc du genre "#FOR.........". A mon avis ce genre de chose n'existe pas.
    Effectivement en relisant, je pense qu'il voulait bien dire ca.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Par défaut
    Un moyen de le faire c'est d'utiliser le preprocesseur template du C++ (si on a un compilo c++ sous la main) et de définir une fonction template récursive.

    Perso j'ai essayé de le faire avec le prépro C (définir une macro récursive) mais j'ai pas trouvé de solution pour le moment.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par glKabuto
    Je voudrais appeler une macro définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MACRO(i)  /* corps de la macro */
    700 fois, sans devoir tapper les 700 lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MACRO(1)
    MACRO(2)
    MACRO(3)
    ....
    MACRO(700)
    Ecris les 10 lignes de C qui génèrent ce code...

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    Citation Envoyé par crocodilex
    Avant qu'il demande comment on fait une boucle for, je me permets de lui répondre par avance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define NB_BOUCLE 700
    [......]
    int i;
     
    for (i=0; i<NB_BOUCLE; i++) {
         MACRO(i);
    }
    [......]
    euh ... la boucle for ça convient pas du tout. Si j'utilise des macros c'est pour qu'elles soient executées avant toute instruction ...

    Citation Envoyé par rigobert
    Je pense que la question porte sur le preprocesseur, et je ne crois pas qu'on puisse faire une boucle "for" ou autre avec le preprocesseur...
    Oui c'est ça que je cherchais

    Citation Envoyé par Emmanuel Delahaye
    Ecris les 10 lignes de C qui génèrent ce code...
    J'y ai pensé mais je me demandais s'il y avait pas une méthode plus élégante.

  11. #11
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Une autre solution est de crée un script qui te génère un fichier header contenant tes macros que tu lanceras avant la compilation. Si tu utilises un makefile, dans ce cas c'est très facile. Si c'est a partir d'un IDE, je sais qu'il existe des options style "PRE-COMPILE et POST-COMPILE" qui te permettent d'appeller des scripts (cf. doc de ton environnement de developpement).

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Citation Envoyé par crocodilex
    Une autre solution est de crée un script qui te génère un fichier header contenant tes macros que tu lanceras avant la compilation. Si tu utilises un makefile, dans ce cas c'est très facile. Si c'est a partir d'un IDE, je sais qu'il existe des options style "PRE-COMPILE et POST-COMPILE" qui te permettent d'appeller des scripts (cf. doc de ton environnement de developpement).
    Je pense que c'est effectivement la seule solution qui réponde strictement à la question telle qu'elle a été posée.

    Mais une autre question à se poser est de savoir si ça en vaut vraiment la peine : si le code est simple, debuggé et qu'il a peu de chance d'évoluer significativement dans le futur, alors peut-être qu'un simple copier/coller de la macro conviendrait (en faisant éventuellement des macros imbriquées pour réduire le nombre total de lignes de code), plutôt que de transformer le build en usine à gaz.

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    Citation Envoyé par rigobert
    Mais une autre question à se poser est de savoir si ça en vaut vraiment la peine : si le code est simple, debuggé et qu'il a peu de chance d'évoluer significativement dans le futur, alors peut-être qu'un simple copier/coller de la macro conviendrait (en faisant éventuellement des macros imbriquées pour réduire le nombre total de lignes de code), plutôt que de transformer le build en usine à gaz.
    Le code n'est pas simple, mais est debuggé et n'a aucune chance d'évoluer dans le futur. La macro que j'utilise fait deja appel a d'autres macro qui en appellent d'autres etc.

    Pour l'instant, en attendant de trouver mieux, j'ai choisi l'option des 700 lignes.

    Merci pour vos réponses

  14. #14
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Citation Envoyé par glKabuto
    J'y ai pensé mais je me demandais s'il y avait pas une méthode plus élégante.
    Ca existe ^^
    Ca s'appelle Emacs, et ça se fait en trois commandes ;-)

    ps : ça fait du bien de dire des betises en français...
    (attention, ca se fait vraiment en trois commande sous Emacs )
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  15. #15
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    Citation Envoyé par Pouic
    Ca existe ^^
    Ca s'appelle Emacs, et ça se fait en trois commandes ;-)
    Quoi donc ? Générer les 700 lignes de code ? :o

  16. #16
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    j'ai essayé une méthode toute simple:
    Microsoft Excel

    case A1: "MACRO("
    case A2: "1"
    case A3: ")"

    ensuite j'ai séléctionné la case A1 et je l'ai "glissé" jusqu'à la A700 (ça copie tout)
    idem pour A3
    et pour A2, idem sauf qu'à la place de "copy cells" tu fais "fill serie"

    ensuite: select all, copy, et paste dans le bloc notes.

    et voila, tu as tes 700 lignes en 30 secondes!

  17. #17
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    C'est un peu tordu comme méthode ^^'
    (Surtout que l'idée à la base c'était d'éviter d'avoir 700 lignes (quasi) identiques dans mon fichier .h)

  18. #18
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    et en 1 ligne de shell ( histoier de finir complement le HS )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i in `seq 1 700`; do echo "MACRO($i)" >> fichier.h; done

  19. #19
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    T'as fais plus court que moi, j'avais pensé à :

    Code gen_macro.sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in `seq 1 700`
    do echo "MACRO($i)"
    done
    suivi d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gen_macro.sh >> fichier.h

    ... mais c'est on a toujours les 700 lignes dans le fichier .h

  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 : 38
    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
    Par défaut
    Boost/preprocessor permet de faire ça en C++.
    En C je pense qu'il y a des équivalents.

Discussions similaires

  1. [VB6] Exécuter une macro Access
    Par Nektanebos dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/02/2006, 16h32
  2. [VBA-E] Macro ouverture fichier déja ouvert
    Par bhaal76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 14h30
  3. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 12h15
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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