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 :

fonction intrinsèque "present"


Sujet :

Fortran

  1. #1
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 76
    Points : 49
    Points
    49
    Par défaut fonction intrinsèque "present"
    Bonjour,

    J'ai une incohérence de résultat quand j'utilise la fonction "present", et donc il semblerait que je l'utilise mal ; pouvez-vous me dire ce qui ne va pas sur ce mini exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SUBROUTINE OPT(a,n)
    IMPLICIT NONE
    INTEGER , INTENT(IN), OPTIONAL :: n
    INTEGER , INTENT(OUT) :: a
    IF (present(n)) THEN
      a= 2
    ELSE
      a=0
    ENDIF
     
    RETURN
    END
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PROGRAM MAINPRICE
    IMPLICIT NONE
     
    INTEGER :: a
    EXTERNAL OPT
     
    CALL OPT(a)
     
    PRINT*, "a=", a
     
    END PROGRAM MAINPRICE
    Je compile avec gfortran en mode debug:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gfortran -g -o test OPT.F90 TESTOPTIONAL.F90
    et mon résultat est différent suivant que j'utilise valgrind ou pas !!

    et :
    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
    valgrind --tool=memcheck ./test
     ==6422== Memcheck, a memory error detector 
    ==6422== Copyright (C) 2002-2013, and GNU GPL d, by Julian Seward et al.
     ==6422== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
     ==6422== Command: ./test 
    ==6422==
     a= 0 
    ==6422== 
    ==6422== HEAP SUMMARY:
    ==6422== in use at exit: 0 bytes in 0 blocks 
    ==6422== total heap usage: 21 allocs, 21 frees, 11,821 bytes allocated 
    ==6422== 
    ==6422== All heap blocks were freed -- no leaks are possible 
    ==6422== 
    ==6422== For counts of detected and suppressed errors, rerun with: -v 
    ==6422== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
    Merci beaucoup !

  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
    Points : 1 346
    Points
    1 346
    Par défaut
    Tu as simplement un problème d'interface. Quand le compilateur compile MainPrice, il ne voit pas Opt. Il ne peut donc pas deviner qu'il doit dire à Opt qu'il n'y a pas de 2ième argument. Il pense que Opt a simplement 1 argument (ce qui n'est pas pareil - Un optionnel manquant requiert souvent l'empilement de l'adresse NULL lors de l'appel).

    Tu dois donc avoir une interface explicite :

    • En plaçant Opt dans un module, ou
    • En plaçant Opt dans une section "contains" de MainPrice, ou
    • En insérant un "interface to Opt" dans MainPrice

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