Bonjour, je ne comprends pas le comportement suivant en terme de visibilité de variable et j'aimerais bien que quelqu'un veuille bien m'éclairer...
Quand une routine qui est dans un module appelle une autre routine, externe au module, je constate que je ne peux pas passer de tableau en argument.
Par exemple, j'ai le module "test" ci-dessous (dans le fichier test.f) ainsi que le programme principal (main.f) et une routine externe() (fichier externe.f)
J'obtiens la sortie ci-dessous alors que je m'attendais à la même sortie pour les 2 routines...
TAB INTERNE = 1 2 3 4 5 6 7 8 9 10
TAB EXTERNE =
Et ce qui en dehors de cette incompréhension me surprend encore plus, c'est que si je mets une autre dimension pour le tableau (9 au lieu de 10 par exemple)
ALORS, ca plante sur un signal SIGSEGV !!! (alors que ça ne plante pas avec 10 !!!!!)
Merci pour votre aide...
Voici pour LE MODULE : test.f :
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 MODULE TEST IMPLICIT NONE INTEGER, DIMENSION(:),ALLOCATABLE :: TAB CONTAINS SUBROUTINE CHECK_IT ALLOCATE(TAB(10)) TAB=(/(i,i=1,10)/) CALL INTERNE(TAB) CALL EXTERNE(TAB) DEALLOCATE(TAB) END SUBROUTINE CHECK_IT SUBROUTINE INTERNE(ARRAY) IMPLICIT NONE INTEGER, INTENT(INOUT),DIMENSION (:) :: ARRAY WRITE(*,*) 'TAB INTERNE = ', ARRAY END SUBROUTINE INTERNE END MODULE
main.f:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 PROGRAM MAIN USE TEST IMPLICIT NONE CALL CHECK_IT END PROGRAM
externe.f
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SUBROUTINE EXTERNE(ARRAY) IMPLICIT NONE INTEGER, INTENT(INOUT),DIMENSION (:) :: ARRAY WRITE(*,*) 'TAB EXTERNE = ', ARRAY END SUBROUTINE EXTERNE
pour compiler, je fais:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 gfortran -c test.f gfortran -c -I./ *.f gfortran -o exec *.o
Partager