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 :

Fichier *.dll avec des call dans une subroutine.


Sujet :

Fortran

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut Fichier *.dll avec des call dans une subroutine.
    Bonjour,

    Avec Fortran77, j'ai besoin de générer un fichier *.dll

    Jusqu’à présent avec les lignes de commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gfortran -c solution.f
    gfortran -shared -o solution.dll solution.o
    Je parvenais à faire le travail; c'est à dire générer une fichier *.dll sur la base d'une simple subroutine.

    Mais depuis que j'y ai rajouté un appel de fonction : call itime, le résultat attendu est faussé. J'ai l'impression que je dois inclure cette fonction itime lors de la génération du fichier *.dll ...

    Pouvez-vous m'éclairer ?

    Merci.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Citation Envoyé par macErmite Voir le message
    Mais depuis que j'y ai rajouté un appel de fonction : call itime, le résultat attendu est faussé..
    Qu'entends-tu par là? Un exemple illustratif serait sûrement utile.

    La routine itime() est intrinsèque donc il n'y a pas de raison de vouloir l'inclure dans ta dll (à moins qu'il n'y ai là une subtilité Windows...)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Pour les besoins d'un programme extérieur, j'ai besoin de générer cette DLL :

    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
    SUBROUTINE varasub(moyenne, sigma, x, y)
     
          real*8 moyenne, sigma, u, v, ppi, x, y
          real rand
     
          ppi = 3.14159265358979
     
          u = rand()
          v = rand()
     
          x = (sqrt(-2 * log(v))) * cos(2 * ppi * u) * sigma + moyenne
          y = (sqrt(-2 * log(v))) * sin(2 * ppi * u) * sigma + moyenne
     
          RETURN
     
          END
    Mais à chaque appel de cette DLL, la séquence sensé être aléatoire ne l'est pas. Elle me génère la même séquence.

    Je ne suis pas informaticien de formation, si vous pouviez m'apporter votre aide ?

    Merci.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    La fonction rand() ne fait que donner accès à des valeurs pseudo-aléatoires.
    Il est donc normal de retrouver toujours les mêmes valeurs, à moins d'initialiser (au premier appel) le processus avec une graine différente.
    En pratique on obtiendra toujours un programme donnant le même résultat d'une exécution à l'autre si il utilise toujours la même graine.
    Si on veut retrouver un "vrai" comportement aléatoire, alors on peut par exemple initialiser la graine avec l'horloge.

    Un exemple vaut souvent un long discours:
    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
     
          program test_rand
            integer,parameter :: seed = 86456
            integer :: clockseed
     
            ! Avec une graine "figée":
            print *, rand(seed), rand(), rand(), rand()
            ! On aura les mêmes valeurs que ci-dessus en reprenant la même graine:
            print *, rand(seed), rand(), rand()
     
            ! initialisation de la graine avec l'horloge => résultats différent à chaque exécution du programme
            call system_clock(count=clockseed)
            write(*,*) "clockseed:",clockseed,
         &                 " rand(clockseed)=",rand(clockseed),
         &                 " rand()=",rand()
     
          end program test_rand

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    je ne reconnais pas la syntaxe utilisée un Fortran > à 77 ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Il y a t il une syntaxe en fortran 77 pour obtenir le même comportement du rand, ou c'est un problème pour cette version de Fortran ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Est-tu bien certain de ne vouloir que du Fortran 77? Je vois que tu utilises gfortran...
    rand() est une fonction qui existait déjà en Fortran 77 si mes souvenirs sont bon.
    Pour ce qui est de l'appel à "system_clock", il doit pouvoir être remplacé par
    Aucune idée si time() est strictement Fortran 77 ou non.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Après modifications des scripts ...

    Cette partie permet de tester la subroutine, qui sera ensuite générée en DLL.

    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
          program main
     
          real*8 mmoyenne, ssigma ,xxGauss, yyGauss
          real*8 aalea1, aalea2
     
          intrinsic time, rand, srand
     
          PARAMETER(NMAX = 10)
     
          call srand(time())
     
          mmoyenne = 0
          ssigma = 10
     
          print *,' -------------------'
     
          do i=1,NMAX
          aalea1 = rand(0)
          aalea2 = rand(0)
    !      print *, ' aalea1 = ', aalea1,' aalea2 = ', aalea2
          call gaussien(aalea1, aalea2, mmoyenne, ssigma, xxGauss, yyGauss)
          print *, ' x = ', xxGauss,' y = ', yyGauss
          enddo
          print *,' -------------------'
     
          pause
     
          END program main
    Dans le même fichier, à la suite de "end program main" :





    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
     
    c     ******************************************************
    c     ******************************************************
    c     ******     Future subroutine pour la DLL     *********
    c     ******************************************************
    c     ******************************************************
     
          SUBROUTINE gaussien(alea1, alea2, moy, sig, xGauss, yGauss)
     
          real*8 alea1, alea2, moy, sig, xGauss, yGauss
          real*8 pi
     
          INTRINSIC COS,SIN, datan
          pi=4.D0*DATAN(1.D0)
     
          xGauss=(sqrt(-2 * log(alea2))) * cos(2 * pi * alea1) * sig + moy
          yGauss=(sqrt(-2 * log(alea2))) * sin(2 * pi * alea1) * sig + moy
     
          RETURN
     
          END
    Cette partie est copié/collé dans un fichier afin de générer la DLL avec les lignes de commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gfortran -c gaussien.f
    gfortran -shared -o gaussien.dll gaussien.o

    Le problème est que la génération "aléatoire" doit être gérer par le programme qui utilisera cette DLL. Comment structurer ce fichier DLL pour gérer ce caractère aléatoire et non répétitif à chaque appel ? (peut-être l'utilisation de plusieurs DLL)

    Il y a également des "warning" remontés par l'EDI Force2 :

    Nom : force2DLL.PNG
Affichages : 190
Taille : 8,7 Ko

    Des idées pour résoudre ces alertes ?

    Merci pour votre aide.

    N.B. : EDI Force2 : http://force.lepsch.com/2009/05/downloads.html
    [ Force209G77Setup.exe 2.03 MB Force 2.0.9 plus GNU Fortran 77 (G77) ]

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Citation Envoyé par macErmite 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
          program main
     
          real*8 mmoyenne, ssigma ,xxGauss, yyGauss
          real*8 aalea1, aalea2
     
          intrinsic time, rand, srand
     
          PARAMETER(NMAX = 10)
     
          call srand(time())
     
          mmoyenne = 0
          ssigma = 10
     
          print *,' -------------------'
     
          do i=1,NMAX
          aalea1 = rand(0)
          aalea2 = rand(0)
    !      print *, ' aalea1 = ', aalea1,' aalea2 = ', aalea2
          call gaussien(aalea1, aalea2, mmoyenne, ssigma, xxGauss, yyGauss)
          print *, ' x = ', xxGauss,' y = ', yyGauss
          enddo
          print *,' -------------------'
     
          pause
     
          END program main
    Là tu appelles toujours (pour tout i) rand(0), qui renverra toujours exactement la même valeur; pour varier il faudrait au minimum appeler rand() sans argument pour construire des aalea1 et aalea2 qui changent à chaque itération.


    Citation Envoyé par macErmite Voir le message
    Il y a également des "warning" remontés par l'EDI Force2 :
    Manifestement cet EDI ne "connaît" pas les fonctions intrinsèques rand(), etc.
    Gros problème à résoudre (quelque part dans les paramétrages?) si tu comptes t'en servir.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Merci pour ta participation. J'ai regardé si je pouvais utiliser une version supérieure à 77. Apparemment c'est le cas. Je vais donc passé sur une version ultérieure avec Plato (Silverfrost)

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

Discussions similaires

  1. Ecrire avec des étoiles dans une zone de texte.
    Par ApocKalipsS dans le forum Langage
    Réponses: 2
    Dernier message: 07/07/2009, 16h08
  2. INSERER DU TEXTE AVEC DES CHAMPS DANS UNE REQUETE SUR sql Srv 2000
    Par sauceaupistou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/03/2007, 10h02
  3. Réponses: 2
    Dernier message: 21/02/2007, 13h28
  4. Réponses: 5
    Dernier message: 12/01/2007, 11h39
  5. Liaison avec des images dans une table
    Par ValérieBruxelles dans le forum Access
    Réponses: 5
    Dernier message: 25/11/2005, 14h21

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