2010-07-08 5 views
0

J'essaie d'écrire un programme avec une fonction qui retourne une matrice avec un nombre aléatoire sur la diagonale, 1s sur les sous-diagonales et 0 partout ailleurs. Alors, je l'ai écrit cette fonction:Erreur: Deux programmes principaux dans Fortran

real function am1d 
    do i=1,L 
     do j=1,L 
      if (i.eq.j) then 
       am1d(i,j)=rand()*w-w/2. 
      elseif ((i-j.eq.1) .or. (j-i.eq.1)) then 
       am1d(i,j)=1 
      else am1d(i,j)=0 
     enddo 
    enddo 
end function am1d 

et a essayé de l'appeler d'ici (dans le même fichier source, juste au-dessus de la fonction)

program make3d 
    integer, parameter :: L = 20 
    real, parameter :: w = 0.5 
    real :: x 


    !x=rand(1234) ! seed random manually 
    x=rand(itime) ! seed random from current local time 
    print *,am1d()(:) 


end program make3d 

Mais essayer de compiler ce throws l'erreur:

$ f95 make3d.f 
make3d.f:18.21: 

     print *,am1d()(:)             
        1 
Error: Syntax error in PRINT statement at (1) 
make3d.f:7.72: 

     program make3d              
                     1 
make3d.f:24.72: 

     real function am1d             
                     2 
Error: Two main PROGRAMs at (1) and (2) 

Qu'est-ce que cela signifie? Je ne pensais pas qu'une fonction pourrait jamais être un programme? J'ai eu de petites fonctions logiques sous l'instruction endprogram avant, sans aucun problème.

+0

l'erreur de syntaxe dans l'impression est levée parce que vous avez écrit 'print *' au lieu de 'print *'. Et ne pas déclarer la forme de la sortie de la fonction est également faux. Mais la deuxième erreur lancée par le compilateur doit être ignorée car elle est probablement causée par la première erreur (cascade). –

Répondre

2

Si vous voulez que la fonction am1d renvoie un tableau, vous devez le déclarer comme tel. Il y avait plusieurs autres erreurs de syntaxe. Le compilateur est confus .... Avez-vous oublié l'instruction "contains" ... sans cela ou un module, le compilateur ne "sait" pas quoi faire avec une autre procédure et pourrait essayer de l'interpréter comme deuxième programme principal.

Essayez:

program make3d 
    integer, parameter :: L = 20 
    real, parameter :: w = 0.5 
    real :: x 

    x=rand(1234) ! seed random manually 
    !x=rand(itime) ! seed random from current local time 
    write (*, *) am1d() 

stop 

contains 

function am1d() 
real, dimension (L,L) :: am1d 
    integer i, j 
    do i=1,L 
     do j=1,L 
      if (i.eq.j) then 
       am1d(i,j)=rand()*w-w/2. 
      elseif ((i-j.eq.1) .or. (j-i.eq.1)) then 
       am1d(i,j)=1 
      else 
       am1d(i,j)=0 
      end if 
     enddo 
    enddo 
end function am1d 

end program make3d 

ou placer la routine dans un module, que je pense fournit une interface plus claire et plus propre (rend la communication variable explicite) - alors vous devez « utiliser » le module dans le programme principal et de passer w et L comme arguments:

module a_mod 

contains 

function am1d (w,L) 
real, intent (in) :: w 
integer, intent (in) :: L 
real, dimension (L,L) :: am1d 

..... 
end function am1d 


end module a_mod 
+0

Merci, c'est réglé. Je savais qu'il y avait plus de mal avec ça, je ne me rendais pas compte que cela pouvait perturber le compilateur dans un étrange message d'erreur. Incidemment, je me suis alors heurté à ceci: https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/577881 pendant que je compile le code sur sftp. Compiler localement évite cela. – Samizdis

-2

J'avais le même problème. Et il semble que ce soit la même réponse. Vous avez mis le "END" dans les 6 caractères de l'étiquette. Si vous déplacez simplement vos 6 caractères END plus loin, cela peut être magique ...

+0

Cette 'réponse' semble avoir été écrite par quelqu'un qui n'a pas compris la question ou la bonne réponse déjà acceptée. –