2013-10-16 74 views
1

這可能非常簡單,但編譯我的小Fortran程序時出現錯誤。 (文件是.f90)這是固定還是自由行長度的問題?這似乎是我可以從Google搜索中收集到的所有信息。名稱中無效的Fortran 90

這裏的程序:

program array 
    integer :: k, n, i, j, h, f, AllocateStatus 
    real*8, dimension(:, :, :), allocatable :: a 
    character, parameter :: "fname" 

k = 5 
n = 5 
h = 1 
    allocate(a(n,k,h), stat = AllocateStatus) 
    if (AllocateStatus /= 0) stop "*** Not enough memory ***" 

    a(1,:,:) = 5 
a(2,:,:) = 6 

call writeArray(7,a,"testOutput") 

deallocate(a) 

end program array 

subroutine writeArray(f,array,fname) 
implicit none 
integer :: f, i, j, k, n 
character, parameter :: "fname" 
real*8, dimension(:, :, :), allocatable :: array 
     open(unit = f, file="fname") 
    do, i=1,n 
     do, j=1,k 
       write(7,"(F5.2)") array(i,j,:) 
     if (j==k) write(7,"(A1)") "X" 
     enddo 
    enddo 
    !write(7,"(I5)") size(a) 

    close(f) 
end subroutine writeArray 

而且錯誤:

test.f90:4.29: 

character, parameter :: "fname" 
         1 
Error: Invalid character in name at (1) 
test.f90:24.26: 

character, parameter :: "fname" 
         1 
Error: Invalid character in name at (1) 
test.f90:21.35: 

subroutine writeArray(f,array,fname) 
           1 
Error: Symbol 'fname' at (1) has no IMPLICIT type 

回答

2

我完全同意@kyle。因此,在考慮這些建議時,我還會將變量的意圖聲明爲子程序writeArray。因此,該程序將沿着線:

program array 
    integer :: k, n, h, AllocateStatus 
    double precision, dimension(:, :, :), allocatable :: a 
    character(len=1024) :: fname 

    fname = "testOutput" 
    k = 5 
    n = 5 
    h = 1 
    allocate(a(n,k,h), stat = AllocateStatus) 
    if (AllocateStatus /= 0) stop "*** Not enough memory ***" 

    a(1,:,:) = 5 
    a(2,:,:) = 6 

    call writeArray(7,a,fname) 

    deallocate(a) 

contains 

subroutine writeArray(f,array,fname) 
    implicit none 
    integer,     intent(in) :: f 
    integer        :: i, j, k 
    character(len=*),   intent(in) :: fname 
    double precision, dimension(:, :, :), intent(in) :: array 

    open(unit = f, file=fname) 
    i = size(array, 1) 
    k = size(array, 2) 
    do, i=1,n 
     do, j=1,k 
       write(7,"(F5.2)") array(i,j,:).. 
     if (j==k) write(7,"(A1)") "X" 
     enddo 
    enddo 
    !write(7,"(I5)") size(a) 

    close(f) 
end subroutine writeArray 

end program array 

而且我不喜歡使用real*8,我傾向於要麼聲明爲任何real(kind=8)double precision

最後,根據你使用的編譯器(因此它是標誌),儘量讓它儘可能迂迴和健談。對於gfortran,編譯時我通常使用選項-Wall -pedantic

+0

謝謝,我已經明白了!你一直很有幫助! – whatsherface

+0

並感謝您爲陣列添加「大小」功能。我當然希望使它更通用,並試圖找到它的語法。 :) – whatsherface

3

不能使用引號表示初始化。在你的子程序中,你應該有

CHARACTER(LEN=*) :: fname 

代替你在那裏的東西。您可能不需要帶有字符聲明的PARAMETER語句。在主程序中似乎不需要初始化fname

另一對的事情,我在你的代碼注意:(1)你不需要申報arrayALLOCATABLE和(2)你應該在價值觀開始文件UNIT S> = 10,因爲單位數是偶爾與(保留給?)標準關聯。


另一個建議是,你要麼把你的writeArray子程序在自己MODULEUSE它,或寫程序作爲

PROGRAM Main 
... 
CONTAINS 
    SUBROUTINE writeArray 
    ... 
    END SUBROUTINE 
END PROGRAM 

,無論什麼方法,你會趕上的參數不一致。不僅如此,您還可以使用變量nk而沒有問題。

+0

感謝您的回覆,您一直非常樂於助人! – whatsherface

2

附加註釋:

你肯定不希望在fname聲明parameter - 那指定的「變量」是不變的,這是一個虛擬的說法不一致。

你可以聲明的參數爲:

integer, intent (in) :: f 
character (len=*), intent (in) :: fname 
real*8, dimension(:, :, :), intent (in) :: array 

,你不需要申報array作爲子程序分配的原因是,你不要在子程序改變其分配。您可以使用size內部函數獲取nk的值,因此不需要將它們作爲參數傳遞。

+0

謝謝你的迴應! – whatsherface