这个玩具代码有问题。 该程序需要一个显式的子例程接口
print_i
。
module types
type plain
integer :: i
end type plain
type, extends(plain) :: fancy
integer :: i2
end type fancy
end module
program poly
use types
! UH-OH! Missing interface!
type(plain) :: pl
type(fancy) :: fan
pl%i = 10
fan%i = 20
call print_i(pl)
call print_i(fan)
end program
subroutine print_i(instr)
use types
class(plain) :: instr
print '("i is ",i5)', instr%i
end subroutine
当我尝试使用 GNU Fortran 进行编译时,它无法编译,并且 gfortran 抱怨缺少接口。 在我看来奇怪的是,英特尔 Fortran 编译了一个可执行文件而没有抱怨,但随后它因
print_i
中的段错误而终止。 当我将接口放入...
interface
subroutine print_i(instr)
use types
class(plain) :: instr
end subroutine
end interface
两个编译器编译时都没有错误,并且它们的可执行文件运行良好。
英特尔的行为对我来说似乎很奇怪。 为什么不标记无法运行的东西? 有什么想法吗?
(顺便说一句,我知道我可以将
print_i
放入模块中并拥有更简单的代码。但是这是因为我正在尝试测试的东西而出现的。)
子程序
print_i(instr)
有一个多态参数instr
。所以它需要一个接口。
如果不是多态就不会有问题。