fortran 90名称中的字符无效

fortran 90名称中的字符无效,fortran,character,fortran90,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

这可能很简单,但我在编译我的小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

不能使用引号表示初始化。在子例程中,您应该

CHARACTER(LEN=*) :: fname
而不是你所拥有的。您可能不需要带有字符声明的
参数
语句。主程序中似乎不需要初始化
fname

我在代码中还提到了两件事:(1)您不需要声明
数组
可分配
,(2)您应该在值>=10时启动文件
单元
s,因为单个数字偶尔与标准输出相关联(保留?)


另一个建议是,您应该将
writeArray
子例程放在它自己的
模块中,然后
使用它,或者按照

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

无论使用哪种方法,都会发现参数中的不一致。不仅如此,您还可以毫无疑问地使用变量
n
k

您不能使用引号表示初始化。在子例程中,您应该

CHARACTER(LEN=*) :: fname
而不是你所拥有的。您可能不需要带有字符声明的
参数
语句。主程序中似乎不需要初始化
fname

我在代码中还提到了两件事:(1)您不需要声明
数组
可分配
,(2)您应该在值>=10时启动文件
单元
s,因为单个数字偶尔与标准输出相关联(保留?)


另一个建议是,您应该将
writeArray
子例程放在它自己的
模块中,然后
使用它,或者按照

PROGRAM Main
...
CONTAINS
  SUBROUTINE writeArray
  ...
  END SUBROUTINE
END PROGRAM
无论使用哪种方法,都会发现参数中的不一致。不仅如此,您还可以毫无疑问地使用变量
n
k

其他注释:

您肯定不希望在
fname
的声明中使用
参数
——这表明“变量”是常量,这与伪参数不一致

您可以将参数声明为:

integer, intent (in) :: f
character (len=*), intent (in) :: fname
real*8, dimension(:, :, :), intent (in) :: array
您不需要在子例程中将
数组
声明为可分配的原因是您不需要在子例程中更改其分配。您可以使用
size
内部参数获取
n
k
的值,因此不需要将它们作为参数传递。

其他注释:

您肯定不希望在
fname
的声明中使用
参数
——这表明“变量”是常量,这与伪参数不一致

您可以将参数声明为:

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

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

我完全同意@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)
双精度


最后,根据您使用的编译器(以及它的标志),请尽量学究和健谈。对于gfortran,我在编译时通常使用选项
-Wall-pedantic

我完全同意@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)
双精度


最后,根据您使用的编译器(以及它的标志),请尽量学究和健谈。对于gfortran,我通常在编译时使用选项
-Wall-pedantic

谢谢,我现在就有了!你帮了大忙!感谢您为阵列提供了“大小”函数。我当然想让它更一般化,并试图找到它的语法。:)谢谢,我现在拿到了!你帮了大忙!感谢您为阵列提供了“大小”函数。我当然想让它更一般化,并试图找到它的语法。:)谢谢你的回复!谢谢你的回复!谢谢你的回复,你帮了我很大的忙!谢谢你的回复,你帮了我很大的忙!