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

Fortran Discussion :

[Fortran 90] Compilation, definition de type et autre


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 12
    Par défaut [Fortran 90] Compilation, definition de type et autre
    Bonjour.

    Je cherche quelques réponses simples a des questions encore plus simples sous fortran 90.

    Précision avant de commencer : j'utilise le compilateur intel (ifort) sous linux

    (pour être plus complet : ifort -V donne ceci

    Intel(R) Fortran Compiler for applications running on IA-32, Version 10.0 Build 20070426 Package ID: l_fc_p_10.0.023
    Copyright (C) 1985-2007 Intel Corporation. All rights reserved. )

    1. Comment inclure un header (fichier de type truc.h) dans un program fortran 90. Le #include "truc.h" qui marchait bien en f77 n'est plus valable à priori. J'ai essayer sans le diez, et ça compile, donc peut être ce n'est qu'une question de compilation.

    2. le #ifndef #ifdef et #endif ne marche pas. Il y a un équivalent à ça, ou c'est encore mon compilo qui me joue des tours??

    3. (Et c'est La question existentielle pour moi ) : Comment je peux récupérer la valeur d'une variable que j'utilise dans le Makefile?

    Je m'explique :

    Je défini une variable (ORDER par exemple) dans mon Makefile, qui prendra des valeurs entières (de 0 à 3 disons). Selon cette valeur, je vais compiler le program qui va avec (genre si je fais : make 0, la variable ORDER prendra la valeur 0. make 2, la variable ORDER prendra la valeur 2, etc).
    Maintenant, je veux que cet ORDER soit aussi lu par mon main.f90. En f77, je mettais dans mon param.h : #define n ORDER, j'incluais le param.h via #include, et le tour est joué (puisque mon n prend maintenant la valeur de ORDER). Sous f90, rien ne marche comme il faut, et du coup, je suis à la ramasse

    voici une ébauche du Makefile :

    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
    .SUFFIXES : .out .o .f90 .h
     
    FC = ifort
     
    FFLAGS = -c -fpe3 -pg -traceback
     
    FLAGS = -O3 -pg
     
    OBJS = param.o main.o
     
    # ici le fameux ORDER
    ORDER = 0
     
    exec = exe
     
    .f90.o :
    	 $(FC) -DORDER=$(ORDER) $(FFLAGS) $<
     
    $(exec) : $(OBJS)
    	  $(FC) -DORDER=$(ORDER) $(FLAGS) -o $@ $^
    	  @rm -f *.out *.mod *.o *~
     
    0: 
    	make exe ORDER=0
    1: 
    	make exe ORDER=1
    2:
    	make exe ORDER=2
    3:
    	make exe ORDER=3
    Merci d'avance à vos réponses!

  2. #2
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    J'avais mis une réponse mais en fait je crois que j'ai rien compris car ça dépasse de loin mes compétences toute mes excuses.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Ce sera une réponse partielle. Je laisse à quelqu'un d'autre le soin de répondre à la question 3 sur les makefile.

    Citation Envoyé par Takeiteasy Voir le message
    Je cherche quelques réponses simples a des questions encore plus simples sous fortran 90.

    Précision avant de commencer : j'utilise le compilateur intel (ifort) sous linux

    (pour être plus complet : ifort -V donne ceci

    Intel(R) Fortran Compiler for applications running on IA-32, Version 10.0 Build 20070426 Package ID: l_fc_p_10.0.023
    Copyright (C) 1985-2007 Intel Corporation. All rights reserved. )
    Question d'être puriste, tu n'utilises pas un compilateur Fortran 90, mais un compilateur Fortran 95 implantant partiellement Fortran 2003. À ma connaissance, il n'y a plus de compilateur Fortran 90 sur le marché, les éditeurs de Fortran 90 ayant tous implanté Fortran 95 qui était une mise à niveau mineure. (Le fait qu'on utilise l'extension .f90 pour désigner le format libre commun à toutes les versions ultérieures à F90 est une erreur stratégique des premiers implanteurs de Fortran 90.)

    Citation Envoyé par Takeiteasy Voir le message
    1. Comment inclure un header (fichier de type truc.h) dans un program fortran 90. Le #include "truc.h" qui marchait bien en f77 n'est plus valable à priori. J'ai essayer sans le diez, et ça compile, donc peut être ce n'est qu'une question de compilation.
    La commande include n'existe pas en F77, c'est une extension. Elle avait la forme #include "truc.h" dans certains compilateurs, simplement include "truc.h" dans d'autre, ... Elle est standardisée à compter de F90 avec la forme include "truc.h".

    Il est important de noter que include est déprécié en Fortran moderne. On utilise des modules à la place.

    Citation Envoyé par Takeiteasy Voir le message
    2. le #ifndef #ifdef et #endif ne marche pas. Il y a un équivalent à ça, ou c'est encore mon compilo qui me joue des tours??
    Il n'y a pas de préprocesseur en Fortran (en fait, il y en a un de défini dans le standard et implanté dans l'outil coco, mais je ne le crois pas très utilisé).

    En pratique, on utilise le précompilateur C. Pour activer la précompilation avec le compilateur Intel, j'utilise l'option -fpp

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 12
    Par défaut
    Merci Sylvain pour ces explications.

    Les réponses étant satisfaisantes sur les deux premières questions, je répond moi même à la troisième, peut être que ça servira un jour à quelqu'un quelque part..sait-on jamais

    Par contre, j'ai du contourner un peu la chose

    L'idée est de passer par un script, qui évite de récupérer la variable depuis le Makefile, mais plutôt depuis le shell au moment de lancer la compilation.

    voici ce qu'il en advient du Makefile :
    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
    .SUFFIXES : .out .o .f90 .h
     
    FC = ifort
     
    FFLAGS = -c -fpe3 -pg -traceback
     
    FLAGS = -O3 -pg
     
    OBJS = param.o main.o
     
    # exit le fameux ORDER maintenant :D
    # ORDER = 0
     
    exec = exe
     
    .f90.o :
               $(FC) $(FFLAGS) $<
     
    $(exec) : $(OBJS)
                   $(FC) $(FLAGS) -o $@ $^
                   @rm -f *.out *.mod *.o *~
     
    # exit tous les makes qui suivaient aussi
    et voici le script qui permet de déjouer l'énigmatique Makefile et ses labyrinthes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
     
    order=$1
    echo "integer,parameter :: ORDER="$order > order.h
    make
    ./exe
    Il ne reste plus qu'à exécuter le script en donnant l'argument order en shell, en ayant fait un include "order.h" dans le main précédemment!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    program main
    implicit none
    include "order.h"
    ...
    end program
    execution du script en ligne de commande : ./script n
    (avec n un entier donné qui sera le fameux ORDER )

    hope it helps

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonsoir,

    je fais des choses un peu similaires (variable d'un code source fortran définie dans le Makefile) et cela fonctionne de la façon que tu présentes dans ton premier message.

    je n'utilise pas ifort mais gfortran mais avec gfortran et d'autres compilo propriétaires sur Unix notamment, pour que le code source fortran passe par le préprocesseur, on peut changer l'extension, par exemple:

    main.f90 doit devenir main.F90

    alors les déclarations que tu fais pour le préprocesseur seront reconnues.

    sinon utilises l'option que te donne Sylvain.

    Je pense en fait que tes questions 2 - 3 ont une réponse liée qui est: dans le test que tu as fait, tu n'es pas passé par le préprocesseur. Parce que ton makefile m'a l'air tout à fait valable.

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

Discussions similaires

  1. [Fortran 90] Compiler avec cygwin
    Par gayou dans le forum Fortran
    Réponses: 1
    Dernier message: 26/11/2007, 11h11
  2. definition de type non reconnu par g++ ou erreur?
    Par harsh dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 09/06/2006, 01h42
  3. compiler avec constante dans un autre fichier
    Par hysah dans le forum C++
    Réponses: 8
    Dernier message: 28/03/2006, 22h57
  4. Réponses: 12
    Dernier message: 02/01/2006, 22h24
  5. [debutant]Compilation : too many types in declaration
    Par Battosaiii dans le forum Débuter
    Réponses: 15
    Dernier message: 03/11/2005, 13h36

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