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