名称fortran 90中的字符无效

时间:2013-10-16 02:16:11

标签: fortran character fortran90

这可能是非常简单的事情,但是在编译我的小Fortran程序时我遇到了错误。 (文件是.f90)这与固定线路长度和自由线路长度有关吗?这似乎是我可以通过谷歌搜索收集的全部内容。

以下是该计划:

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

3 个答案:

答案 0 :(得分:3)

您不能使用引号来表示初始化。在你的子程序中,你应该有

CHARACTER(LEN=*) :: fname

取代你拥有的东西。您可能不需要带有字符声明的PARAMETER语句。主程序中似乎不需要初始化fname

我在您的代码中注意到的另一对事项:(1)您不需要声明arrayALLOCATABLE以及(2)您应该在UNIT处启动文件writeArray值> = 10,因为单位数字偶尔与(标记为?)标准输出相关联。


另一个建议是,您应该将MODULE子例程放在自己的USEPROGRAM Main ... CONTAINS SUBROUTINE writeArray ... END SUBROUTINE END PROGRAM 中,或者将程序编写为

n

使用任何一种方法,您都会发现参数中的不一致。不仅如此,您还可以毫无问题地使用变量k和{{1}}。

答案 1 :(得分:2)

补充意见:

你绝对不希望在parameter的声明中fname - 指定“变量”是常量,这与伪参数不一致。

您可以将参数声明为:

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

您不需要在子例程中将array声明为可分配的原因是您不在子例程中更改其分配。您可以使用n内在函数获取ksize的值,因此不需要将它们作为参数传递。

答案 2 :(得分: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