编译多态要做什么设定吗
本帖最后由 shrine 于 2022-5-19 16:25 编辑这段在ivf里编译,能通过,但是结果不对啊
program Test
implicit none
integer::iorder
real(8)::xv1(2),abcd
real(8),external::GaussInteg_Tri
iorder=1
xv1=(/0.0_8,0.0_8/)
abcd=GaussInteg_Tri( fun,xv1 )
write(*,*)abcd
contains
real(8) function fun(xy)
real(8) :: xy(2),x,y
select case(iorder)
case(1)
fun= xy(1)
case(2)
fun= xy(2)
case default
write(*,*) 'error in iorder!',iorder; stop
end select
return
end function
end program Test
function GaussInteg_Tri( fun,xv1 )
real(8) :: GaussInteg_Tri, xv1(2)
real(8) ,external :: fun
GaussInteg_Tri = fun(xv1)
write(*,*)GaussInteg_Tri
return
end function
xv1是一个具有两个元素的数组,程序的本意是,如果iorder是1,就输出第一个元素,如果是2,就输出第二个元素
但是输出的结果却是无穷大
我做了输出调试,函数确实选的第一个,但是传数组的时候出了问题
你这个代码里也没有多态呀。
要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用。
Module testMod
implicit none
integer :: iorder = 1
contains
real(8) function fun(xy)
real(8) :: xy(2)
if(iorder<1.or.iorder>size(xy)) then
write(*,*) 'error in iorder!' , iorder
stop
end if
fun= xy(iorder)
end function
real(8) function GaussInteg_Tri( fun,xv1 )
real(8) :: xv1(2)
real(8) ,external :: fun
GaussInteg_Tri = fun(xv1)
write(*,*) GaussInteg_Tri
end function
End Module testMod
program Test
use testMod
implicit none
real(8)::xv1(2)=
write(*,*) GaussInteg_Tri( fun , xv1 )
end program Test 本帖最后由 shrine 于 2022-5-19 18:51 编辑
fcode 发表于 2022-5-19 16:48
你这个代码里也没有多态呀。
要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用。
fun这个子程序不是多态?它由iorder决定具体是哪个
程序被我简化了,导致错误消失了
不过我自己查出了问题所在,传数组的时候一个real,一个real(8)
不报错,能得到结果,但是是错的,这个bug差不多追了一个星期了
本帖最后由 vvt 于 2022-5-19 19:41 编辑
这肯定不是多态呀。多态的意思是,有个指针,指向一个结构。但这个结构可能是多个同继承系的。比如可能是某个父类,也可能是某个子类。
要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用。
你这样写。可能intel fortran是可以跑,但是 gfortran 跑不了。所以听版主的劝告。
本帖最后由 shrine 于 2022-6-9 10:39 编辑
fcode 发表于 2022-5-19 16:48
你这个代码里也没有多态呀。
要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用。
有几个问题:
1. iorder是在test主程序里定的,怎么改?
2. 另外还有个数据module,function和主程序里都要用到,那都要use吗?
3.多层级subroutine,是不是只在用到那个层级use就行了?
页:
[1]