2016-06-21 4 views
0

Je voudrais passer la dimension de tableau comme une variable fictive à un sous-programme. Le tableau lui-même est dans un bloc commun. Voici le code:Passe la taille du tableau de bloc commun au sous-programme dans Fortran

PROGRAM test 
integer i, nn 
integer PARAMETER(Nt=10) 
real x(Nt), y(nt), z(Nt) 
Common /Bdat/ z 
nn=Nt 
do i=1,Nt 
x(i)=i+1 
z(i)=i-1 
enddo 
call estimate(x,y,nn) 
print*, y 
return 
end 

subroutine estimate(x,y,jj) 
integer i,jj 
real x(jj), y(jj), zq(jj) 
COMMON /Bdat/ zq 
do i=1, jj 
y(i)=x(i)+zq(i) 
enddo 
return 
end 

c'est l'erreur que je reçois de la sous-routine:

real x(jj), y(jj), zq(jj) 
         1 

Erreur: Variable 'J.-J.' à (1) dans ce contexte doit être constante

I apprécierait vraiment si quelqu'un pouvait aider à faire cela.

+3

Il est possible de donner une réponse significative à la question, mais pourriez-vous envisager une réponse qui dit: don » t utiliser des blocs communs à cette fin? Fortran a énormément évolué au cours des 30 dernières années. – francescalus

+0

Je ne pense pas que quelqu'un dans son bon sens devrait utiliser Fortran quand Python et MATLAB sont là. Il y a d'anciens codes que les gens doivent revoir de temps en temps. – emperial

Répondre

1

Vous avez un problème d'étendue. Lire: Scope in Fortran. Autrement dit, votre sous-programme estimate doit avoir accès à la variable Nt que vous devez passer en argument supplémentaire, ou vous pouvez déplacer la sous-routine entière dans votre programme à l'aide de l'instruction contains. Cela permettra à votre programme de fonctionner avec succès, mais je vous encourage fortement à ne pas utiliser les blocs common. Si vous ne pouvez pas les éviter en raison des codes existants voir Improve your FORTRAN 77 programs using some Fortran 90 features

Essayez d'utiliser des modules au lieu:

module bdat 

     implicit none 

     private 
     public :: NT, z 

     integer, parameter :: NT = 10 
     real    :: z(NT) 

    end module bdat 

    module my_sub 

     use bdat, only: & 
      zq => z ! You're free to rename the variable 

     implicit none 
     private 
     public :: estimate 

    contains 

     subroutine estimate(x,y) 
     ! calling arguments 
     real, intent (in) :: x(:) 
     real, intent (out) :: y(:) 

     ! local variables 
     integer :: i, jj 

     jj = size(x) 

     do i=1, jj 
      y(i)=x(i)+zq(i) 
     end do 

     end subroutine estimate 

    end module my_sub 

    program test 

     use bdat, only: & 
      NT, z 

     use my_sub, only: & 
      estimate 

     implicit none 

     integer :: i 
     real :: x(NT), y(NT) 

     do i=1,NT 
     x(i)=i+1 
     z(i)=i-1 
     end do 

     call estimate(x,y) 

     print *, y 

    end program test 
+0

Que faire si des tableaux x, y ou z doivent être lus à partir d'un fichier d'entrée et mis à la disposition de plusieurs sous-programmes. Fortran n'autorise pas les instructions d'ouverture et de lecture dans un module. – emperial

+0

Ce n'est pas vrai! Les instructions d'ouverture et de lecture sont autorisées à l'intérieur des sous-routines et sont toutes contenues dans des modules. Je vous suggère de placer les tableaux dans des types de données dérivés, ce qui élimine le besoin de partager des variables globales entre les sous-programmes. – jlokimlin