问题是,当我将integer
charlen
作为字符元素函数的长度定义传递时,为什么我会收到一个错误,说是一个real
。更具体地说,以下 MWE工作:
program chararr
implicit none
!!
integer,parameter :: charlen = 20
!!
interface
character(len=20) elemental function adjR(a)
character(len=*),intent(in) :: a
end function
end interface
!!
character(charlen) :: test(3), testR(3)
test = ["hej", "hoj", "haj"]
testR = adjR(test)
print*, test
print*, testR
end program
character(20) elemental function adjR(a)
character(len=*),intent(in) :: a
adjR = adjustr(a)
end function
但是这条线integer,parameter :: charlen = 20
什么也没做。当我像这样更改函数和接口定义时
character(len=charlen) elemental function adjR(a)
我收到以下错误:
charmin.f90:7:14:
character(len=charlen) elemental function adjR(a)
1
Error: Expression at (1) must be of INTEGER type, found REAL
更新
亚历山大的解决方案在代码中:
魅力.f90:
program chararr
use char_mod, only: charlen, adjR
implicit none
!!
!interface
!character(30) elemental function adjR(a)
!character(len=*),intent(in) :: a
!end function
!end interface
!!!
character(charlen) :: test(3), testR(3)
test = ["hej", "hoj", "haj"]
testR = adjR(test)
print*, test
print*, testR
print*, charlen !!! it is here
end program
char_mod.f90:
module char_mod
implicit none
integer,parameter :: charlen = 30
private
public charlen, adjR
contains
character(charlen) elemental function adjR(a)
implicit none
character(len=*),intent(in) :: a
adjR = adjustr(a)
end function
end module
要编译:
gfortran -c char_mod.f90
gfortran charmin.f90 char_mod.f90 -o program
charlen
是在程序范围内定义的,但函数adjR
在该范围之外。因此,charlen
不可访问,并且由于该函数没有定义implicit none
,因此将其解释为实变量。
一种解决方案是将adjR
放入模块中,并charlen
模块变量。