这可能是非常简单的事情,但是在编译我的小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
答案 0 :(得分:3)
您不能使用引号来表示初始化。在你的子程序中,你应该有
CHARACTER(LEN=*) :: fname
取代你拥有的东西。您可能不需要带有字符声明的PARAMETER
语句。主程序中似乎不需要初始化fname
。
我在您的代码中注意到的另一对事项:(1)您不需要声明array
和ALLOCATABLE
以及(2)您应该在UNIT
处启动文件writeArray
值> = 10,因为单位数字偶尔与(标记为?)标准输出相关联。
另一个建议是,您应该将MODULE
子例程放在自己的USE
和PROGRAM 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
内在函数获取k
和size
的值,因此不需要将它们作为参数传递。
答案 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
。