尝试了解 Fortran 编译器的行为

问题描述 投票:0回答:1

这个玩具代码有问题。 该程序需要一个显式的子例程接口

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
放入模块中并拥有更简单的代码。但是这是因为我正在尝试测试的东西而出现的。)

interface fortran gfortran intel-fortran
1个回答
0
投票

子程序

print_i(instr)
有一个多态参数
instr
。所以它需要一个接口。

如果不是多态就不会有问题。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.