gpt4 book ai didi

FORTRAN 95 : OPTIONAL statement does not work (using FTN95 and Plato)

转载 作者:行者123 更新时间:2023-12-01 09:00:19 26 4
gpt4 key购买 nike

我遇到了 OPTIONAL 的问题Fortran 95 的函数和子例程中的语句。目前我正在使用 Silverfrost 的 Plato 和他们的 FTN95 编译器(在“Release Win32”模式下)。在尝试在我正在编写的更复杂的程序中实现 OPTIONAL 语句之后,我创建了一个非常简单的程序来测试它。这是代码:

program TEST

implicit none
integer :: a=1, b=2

call Z(a,b)
call Z(a)
call Z(b)

end program TEST

subroutine Z(x,y)
implicit none
integer :: x
integer, optional :: y

if (present(y)) then
write(*,*) x, y
else
write(*,*) x
endif

end subroutine Z

我预计屏幕上会显示以下结果:
1 2
1
2

好吧,代码可以编译,尽管我收到警告 (673) “SUBROUTINE Z has been called with too little arguments”。执行后,我进入我的屏幕:
1 2

然后是“访问冲突”错误消息。有人能理解这里有什么问题吗?

非常感谢!
吉尔伯托

最佳答案

尝试将子例程放入模块中,如下所示:

module testoptional
contains
subroutine Z(x,y)
implicit none
integer :: x
integer, optional :: y

if (present(y)) then
write(*,*) x, y
else
write(*,*) x
endif

end subroutine Z
end module testoptional

program TEST
use testoptional
implicit none
integer :: a=1, b=2

call Z(a,b)
call Z(a)
call Z(b)

end program TEST

然后使用 gfortran 和 ifort 编译和运行会给出预期的结果。

问题在于主程序如何知道(或猜测)到 Z(x,y) 的接口(interface)。 .在您提供的代码中,虽然主程序和子程序在同一个文件中,但没有明确告诉主程序接口(interface) - 调用顺序,包括参数计数、类型等 - Z .第一个电话是 Z(a,b) ,因此它推断出某处有一个带有两个参数的子程序;然后它尝试使用一个参数调用它,但失败了。

将子程序放在一个模块中,然后使用该模块(您也可以使用 contains 用于包含的子程序,或使用 interface block 显式/手动为主程序提供接口(interface))然后为主程序提供所需的信息关于调用序列 - 例如,有一个 optional 参数 - 并且事情正常。

关于FORTRAN 95 : OPTIONAL statement does not work (using FTN95 and Plato),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18300229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com