fortran 90名称中的字符无效
这可能很简单,但我在编译我的小Fortran程序时遇到了错误。(文件是.f90)这与固定和自由行长度有关吗?这似乎是我从谷歌搜索中所能收集到的全部信息 节目如下: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
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
。谢谢,我现在就有了!你帮了大忙!感谢您为阵列提供了“大小”函数。我当然想让它更一般化,并试图找到它的语法。:)谢谢,我现在拿到了!你帮了大忙!感谢您为阵列提供了“大小”函数。我当然想让它更一般化,并试图找到它的语法。:)谢谢你的回复!谢谢你的回复!谢谢你的回复,你帮了我很大的忙!谢谢你的回复,你帮了我很大的忙!