2010-07-08 69 views
0

我想用一個函數編寫一個程序,該函數返回一個矩陣,其中包含對角線上的隨機數,子對角線上的1和其他地方的0。所以,我寫了這個功能:錯誤: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 

並試圖從這裏調用它(相同的源文件中,只是上面的功能)

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 

但是,試圖編譯,這將引發錯誤:

$ 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) 

這是什麼意思?我不認爲一個功能可以成爲一個程序?我之前在endprogram語句下有小邏輯函數,沒有任何問題。

+0

因爲你寫了'print *'而不是'print *',所以拋出了print中的語法錯誤。而不是聲明函數輸出的形狀也是錯誤的。 但編譯器拋出的第二個錯誤將被忽略,因爲它可能是由第一個錯誤(級聯)引起的。 – 2017-02-06 12:13:18

回答

2

如果你想讓函數am1d返回一個數組,你需要像這樣聲明它。還有其他幾個語法錯誤。編譯器感到困惑....你忘記了「包含」語句...沒有這個或一個模塊,編譯器不會「知道」如何處理另一個過程,並可能試圖將其解釋爲第二個主程序。

嘗試:

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 

或放置一個模塊,我認爲提供了一個更清晰和更清潔的界面的程序(使變量通信顯式) - 那麼你就需要在「用」的模塊主程序並將w和L作爲參數:

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

謝謝,這是整理它。我知道它有更多的錯誤,沒有意識到可能會將編譯器混淆成一個奇怪的錯誤信息。 順便說一句,我接着反對這個:https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/577881 因爲我通過sftp編譯代碼。本地編譯避免了這一點。 – Samizdis 2010-07-08 21:12:03

-2

我遇到了同樣的問題。這似乎是相同的答案。您已將「END」放入標籤的6個字符中。如果你只是將你的END 6字符移動得更遠,它可能會變魔術......

+0

這個「答案」似乎是由不明白已發佈的問題或長期接受的正確答案的人寫的。 – 2012-06-28 08:56:04