Fortran Coder

标题: 编译多态要做什么设定吗 [打印本页]

作者: shrine    时间: 2022-5-19 16:16
标题: 编译多态要做什么设定吗
本帖最后由 shrine 于 2022-5-19 16:25 编辑

这段在ivf里编译,能通过,但是结果不对啊
[Fortran] 纯文本查看 复制代码
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
你这个代码里也没有多态呀。

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

[Fortran] 纯文本查看 复制代码
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)=[11.0_8,22.0_8]
  write(*,*) GaussInteg_Tri( fun , xv1 )
end program Test

作者: shrine    时间: 2022-5-19 18:45
本帖最后由 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
本帖最后由 vvt 于 2022-5-19 19:41 编辑

这肯定不是多态呀。多态的意思是,有个指针,指向一个结构。但这个结构可能是多个同继承系的。比如可能是某个父类,也可能是某个子类。
要避免把本程序单元contains下的过程传递给本程序单元之外的过程使用

你这样写。可能intel fortran是可以跑,但是 gfortran 跑不了。所以听版主的劝告。

作者: shrine    时间: 2022-6-9 09:59
本帖最后由 shrine 于 2022-6-9 10:39 编辑
fcode 发表于 2022-5-19 16:48
你这个代码里也没有多态呀。

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

有几个问题:
1. iorder是在test主程序里定的,怎么改?
2. 另外还有个数据module,function和主程序里都要用到,那都要use吗?
3.多层级subroutine,是不是只在用到那个层级use就行了?





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2