Fortran Coder

查看: 2515|回复: 4
打印 上一主题 下一主题

[子程序] 编译多态要做什么设定吗

[复制链接]

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
跳转到指定楼层
楼主
发表于 2022-5-19 16:16:11 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 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,就输出第二个元素

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

我做了输出调试,函数确实选的第一个,但是传数组的时候出了问题
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
5#
 楼主| 发表于 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就行了?

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2022-5-19 19:39:38 | 只看该作者
本帖最后由 vvt 于 2022-5-19 19:41 编辑

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

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

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
板凳
 楼主| 发表于 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差不多追了一个星期了

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2022-5-19 16:48:58 | 只看该作者
你这个代码里也没有多态呀。

要避免把本程序单元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
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 04:06

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表