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 :

newline dans une macro procédure


Sujet :

C

  1. #1
    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 newline dans une macro procédure
    Je désire réaliser une macro qui doit générer un code comprenant des newlines(\n). du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define MaSuperMacro(line1, line2) line1 <?> line2
     
    MaSuperMacro("super", "ça marche")
    qui va générer un code après preprocessing qui devrait ressembler à :

    Ce qui pose problème c'est le <?>. Par quoi faut-il le remplasser pour que le \n soit effectif dans le code généré ?

    Nb : l'objectif est d'utiliser le préprocesseur C pour généré du code fortran (d'où la nécessité du newline)
    Nb2 : j'ai déjà tenté d'utiliser les trigraphs, sans réussite car mon compilateur ne les gère pas


    Si quelqu'un à la solution, je suis preneur...

    Et si il existe des bidouilles pour faire de la récursivité avec le préprocesseur C (pas le prépro template du c++) ça m'intéresse aussi.

  2. #2
    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 Puyi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define MaSuperMacro(line1, line2) line1 <?> line2
     
    MaSuperMacro("super", "ça marche")
    qui va générer un code après preprocessing qui devrait ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define MaSuperMacro(line1, line2) line1\
    line2
    Il n'est pas interdit d'ouvrir un livre de C de temps en temps. On y trouve la réponse aux questions basiques...

    K&R A12.2 page 232

    Pan sur le bec!

    Et ca vaut pour moi aussi ! Boulette ! (J'ai confondu avec MASM) Il semblerait que le saut de ligne (inutile en C) soit supprimé. Si c'est ça, pas de solution avec le CPP.

    Il faut essayer un autre préprocesseur (M4, par exemple...)

  3. #3
    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
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define MaSuperMacro(line1, line2) line1\
    line2
    Ca doit être le premier truc que j'ai tenté. Si la réponse avait été aussi évidente et si je n'avais pas fait chou blanc dans mes recherches je n'aurais pas posté.
    Ca m'embète un peu d'utiliser un autre prépro parceque je vais devoir le greffer sur le compilo fortran et que ca risque d'être difficile à un utilisateur moins confirmé de faire compiler le programme sur une autre machine. Je vais quand même essayer de voir ce que ça donne.

  4. #4
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Et pourquoi ne pas remplacer le <?> par tout bêtement "\n" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define MaSuperMacro(L1, L2)   L1 "\n" L2
     
    int main(int argc, char *argv[])
    {
      printf(MaSuperMacro("super", "ça marche")) ;
      return 0 ;
    }

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Et pourquoi ne pas remplacer le <?> par tout bêtement "\n" ?
    Par ce que dès que tu vas mettre des instructions à la place de "super" et "ça marche", cela ne va plus trop lui plaire...

    Jc

  6. #6
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Arfff, désolé, je n'avais pas vu la chose dans le sens "préprocesseur".

  7. #7
    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
    Fearyourself a raison, je ne veux pas faire des printf avec ma macro.
    J'aurais du mettre un exemple plus précis de ce que je veux faire exactement. Comme c'est des macros qui appellent des macros, qui appellent des macros ...
    Je fais un exemple simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #define _C1_(X) X(5)-X(1)*X(4) 
    #define _C2_(X) X(6)-X(2)*X(3)
     
    #define _contrainte_(i) CONTRAINTES(i)= _C##i##_(X)
     
    #define _les_contraintes_ \
    _contrainte_(1) \
    _contrainte_(2) \
    moi je voudrais que _les_contraintes_ génère le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CONTRAINTES(1)=X(5)-X(1)*X(4) 
    CONTRAINTES(2)=X(6)-X(2)*X(3)
    et actuellement ça fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CONTRAINTES(1)=X(5)-X(1)*X(4) CONTRAINTES(2)=X(6)-X(2)*X(3)
    Et ça en fortran : ça ne compile pas !!

    La solution proposée par Elijha (merci de l'avoir proposée), qui fonctionne très bien pour les printf donne le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CONTRAINTES(1)=X(5)-X(1)*X(4) "\n" CONTRAINTES(2)=X(6)-X(2)*X(3)
    qui ne compile pas non plus ;(

  8. #8
    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 Puyi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CONTRAINTES(1)=X(5)-X(1)*X(4) CONTRAINTES(2)=X(6)-X(2)*X(3)
    Et ça en fortran : ça ne compile pas !!
    Ta conception est buggée au départ. Le CPP est fait pour générer du C (donc, pas de lignes). Pas du FORTRAN. Il existe peut être un PP pour le FORTRAN...
    est ton ami...

    http://www.ess.stsci.edu/desi/jtools/fprep_info.html

  9. #9
    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
    En fait j'utilise g95 comme compilateur fortran. Il ne possède pas de précompilateur mais il propose une option qui appelle le cpp de gcc. C'est pour cela que je l'utilise.

  10. #10
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Il est assez courant d'utiliser le pre-processeur C sur du Fortran, notamment pour profiter de la compilation conditionnelle (#ifdef et consorts). Par contre, il ne faut pas pousser le bouchon trop loin. S'il n'est pas possible de forcer un passage a la ligne avec cpp, alors il faut faire deux macros (ou simplement faire une fonction Fortran qui remplisse le tableau CONTRAINTES avec le contenu du tableau X comme argument).

Discussions similaires

  1. Requete De Mise A Jour Inseree Dans Une Macro
    Par tereda dans le forum Access
    Réponses: 1
    Dernier message: 10/05/2006, 12h34
  2. Exécuter une sub d'un module dans une macro
    Par pnoel-bi dans le forum Access
    Réponses: 3
    Dernier message: 03/03/2006, 10h39
  3. Code asm dans une macro C
    Par progfou dans le forum C
    Réponses: 11
    Dernier message: 01/03/2006, 18h50
  4. Comment insérer une macro excel dans une macro word?
    Par max2245 dans le forum VBA Word
    Réponses: 15
    Dernier message: 07/01/2006, 17h44
  5. pb dans une macro excel VB
    Par syl221 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/10/2005, 17h29

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