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 :

Pointeur sur une fonction.


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut Pointeur sur une fonction.
    Bonjour,

    Je développe depuis un ans en Fortran et que voudrais savoir s'il est possible d'affecter a une variable une fonction. Prenons un exemple simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    do i = 1, 10 000
       do j = 1, 10 000
          do k = 1, 10 000
               select case (id)
               case ( 1 )
                    c = fct1(a,b,i,j,k)
               case ( 2 )
                    c = fct2(a,b,i,j,k)
               case ( 3 )
               .... jusqu'à 10
               end select case
          end do
       end do
    end do
    Pour éviter cela je voudrais sortir le select case et créer une fonction fct qui vaudra soit fct1, fct2, ou encore fct3.
    Puis, dans la boucle j'aurais juste à faire c = fct et je n'aurai plus à faire un select case
    dans chacune des boucles. Est-ce possible ?

    Il me semble qu'on m'a dit de faire un truc du genre par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    integer :: fct
    fct = fct1
    mais ça ne marche pas. Pourriez-vous m'aider ?

    Merci

  2. #2
    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
    Au début du Forum Fortran, Cours à télécharger, http://fortran.developpez.com/, Les apports de la norme Fortran 2003, Section 7.3

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    Merci, mais je suis pas si débutant que ça quand même j'ai lu les cours de fortran mais merci quand même ^^.
    Le problème est que je ne dispose que de ifort 11.1 au mieux et que pour faire du 2003 il faut la version 12 d'où ma question en fortran 90 ?

    Une idée peut être pour faire l'équivalent fortran2003 en fortran 90 ou du moins quelque chose de compréhensible avec un compilateur version 11 ?

    Bonne soirée à tous, et encore merci pour cette première réponse.
    ++

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Par défaut
    Bonsoir,
    J'ai du mal à saisir ton exemple donc je réponds peut être à coté mais je pense que tu peux t'en sortir avec une interface qui englobe les fonction fct1, fct2 et fct3.
    Tu peux trouver de la doc sur la déclaration d'une interface dans des cours fortran sur le net. En réalité les interface sont plutot faite pour des fonctions similaires avec des arguments de type différents mais tu peux eventuellement bricoler un truc pas trop mal pour ton cas.

    Pour pouvoir être plus clair, peut-tu préciser où et comment veux-tu déplacer le "select case" et à quoi veux-tu que ta boucle "ressemble" après modif (écrit l'algo que tu veux même si la syntaxe fortran est incorrecte).

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    L'idée générale de mon exemple est de voir comment sortir le select case des boucles en fortran 90 afin d'optimiser mon code. Vous le savez certainement mais des instructions comme les "if" et "select case" imbriquées dans des boucles sont à éviter.

    Je voudrais avoir quelque chose d'équivalent au fortran 2003 mais en fortran 90. En fortran 2003 cela donne :

    select case (id)
    case ( 1 )
    fct=>fct1
    case ( 2 )
    fct=>fct2
    case ( 3 )
    fct=>fct3
    ...etc... jusqu'à 10 ou plus.
    end select case

    do i = 1, 10 000
    do j = 1, 10 000
    do k = 1, 10 000
    c = fct(a,b,i,j,k)
    end do
    end do
    end do

    Ce qui est beaucoup plus lisible à mon gout mais aussi plus performant car les temps avec une compilation optimisée sont nettement inférieure avec cette forme là.
    Mon problème est que je travaille sur des machines ne possédant pas encore les dernières versions des compilateurs fortran donc il n'y a pas de prise en charge des syntaxe fortran 2003.
    Je vais essayer de réfléchir à comment faire avec les interfaces c'est peut être une piste. Encore merci pour ta réponse.

    Bonne soirée.

  6. #6
    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
    Si tu peut briser ton code en sous-fonction, voici une solution :
    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
     
    select case (id)
       case ( 1 ); call NextStep(fct1)
       case ( 2 ); call NextStep(fct2)
       case ( 3 ); call NextStep(fct3)
    end select case
    ...
    subroutine NextStep(fct)
    ... 
       do i = 1, 10 000
          do j = 1, 10 000
             do k = 1, 10 000
                c = fct(a,b,i,j,k)
             enddo
          enddo
       enddo
    NextStep peut être une routine interne (contains), de sorte qu'elle a alors accès à toute les variables de la fonction principale. Cette stratégie simplifie grandement l'implantation de la solution.

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  2. Réponses: 3
    Dernier message: 16/05/2006, 18h22
  3. Pointeur sur une fonction
    Par bogosse dans le forum C
    Réponses: 12
    Dernier message: 16/02/2006, 14h16
  4. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25
  5. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26

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