shrine 发表于 2022-5-19 16:16:11

编译多态要做什么设定吗

本帖最后由 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,就输出第二个元素

但是输出的结果却是无穷大

我做了输出调试,函数确实选的第一个,但是传数组的时候出了问题

fcode 发表于 2022-5-19 16:48:58

你这个代码里也没有多态呀。

要避免把本程序单元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:45:22

本帖最后由 shrine 于 2022-5-19 18:51 编辑

fcode 发表于 2022-5-19 16:48
你这个代码里也没有多态呀。

要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用。

fun这个子程序不是多态?它由iorder决定具体是哪个

程序被我简化了,导致错误消失了

不过我自己查出了问题所在,传数组的时候一个real,一个real(8)

不报错,能得到结果,但是是错的,这个bug差不多追了一个星期了

vvt 发表于 2022-5-19 19:39:38

本帖最后由 vvt 于 2022-5-19 19:41 编辑

这肯定不是多态呀。多态的意思是,有个指针,指向一个结构。但这个结构可能是多个同继承系的。比如可能是某个父类,也可能是某个子类。
要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用。
你这样写。可能intel fortran是可以跑,但是 gfortran 跑不了。所以听版主的劝告。

shrine 发表于 2022-6-9 09:59:17

本帖最后由 shrine 于 2022-6-9 10:39 编辑

fcode 发表于 2022-5-19 16:48
你这个代码里也没有多态呀。

要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用。

有几个问题:
1. iorder是在test主程序里定的,怎么改?
2. 另外还有个数据module,function和主程序里都要用到,那都要use吗?
3.多层级subroutine,是不是只在用到那个层级use就行了?
页: [1]
查看完整版本: 编译多态要做什么设定吗