Fortran Coder

查看: 1283|回复: 5
打印 上一主题 下一主题

[数学库] 指针作为型参数传入函数以及接口的编写问题

[复制链接]

17

帖子

5

主题

0

精华

入门

F 币
78 元
贡献
42 点
跳转到指定楼层
楼主
发表于 2024-6-27 23:41:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调用IMSL函数库的曲面拟合问题,其代码中用到了指针变量作为结构体的一个成员变量随着结构体一起定义作为形参在函数中调用,我写了一个类似的代码,有幸QQ群里的高人指点了下,有几个地方还不明白:1、Type Api中,Real(Kind=8),Pointer::Bus(:)为什么要这样定义?能否定义为Real(Kind=8),Pointer::Bus(10)?
2、下述代码运行是OK的,但是逐步跟踪时,在函数Hello外部,Tiger%Bus是有值的,但是到了函数内部,Tiger%Bus 就变成了 Undefined Pointer/Array,现实没有进行内存分配,这是什么原因,但是计算结果又是对的。

      
[Fortran] 纯文本查看 复制代码
01Module Pointer_Mod
02          Implicit None
03 
04          Type Api
05          Integer::Id
06          Real(Kind=8),Pointer::Bus(:)
07          End Type Api
08 
09          Contains
10 
11          Subroutine Hello(Moon,Tiger,Fish)
12          Integer,Intent(In)::Moon
13          Type(Api),Intent(In)::Tiger
14          Real(Kind=8),Intent(Out)::Fish
15 
16          Integer::I
17          Fish=0.d0
18          If(Moon==1)Then
19          Do I=1,10,1
20          Fish=Fish+Tiger%Bus(I)
21          End Do
22          Else if(Moon==2)Then
23          Do I=1,10,1
24          Fish=Fish-Tiger%Bus(I)
25          End Do
26          End If   !!
27          End Subroutine       
28End Module   
29 
30    program Test_Pointer
31    Use Pointer_Mod
32    implicit none
33 
34    Integer::Moon,I
35    Type(Api)::Tiger
36    Real(Kind=8)::Fish
37 
38    Moon=1
39    Tiger%Id=10
40    Allocate(Tiger%Bus(10))
41 
42    Do I=1,10,1
43    Tiger%Bus(I)=I+1.d0
44    End Do   
45    Call Hello(Moon,Tiger,Fish)
46    Write(*,*)Fish
47    Pause
48    end program Test_Pointer

Ps:
3、还有一个问题,如果该帖子有幸被堂主见到,在前面的贴中,关于IMSL的Surface_Fitting和Surface_Values两个函数,堂主都进行了接口的重新编写,可以实现IMSL库中对应例子的调用,但是有如下的扩展问题,对于Surface_Values的接口,当时堂主编写如下:

[Fortran] 纯文本查看 复制代码
01interface SURFACE_VALUES   
02    function DV_SURFACE_VALUES(DERIVATIVE, VARIABLESX, VARIABLESY, KNOTSX, KNOTSY, COEFFS)
03      import
04      implicit none
05      integer :: DERIVATIVE(2)
06      real(kind(1d0)) :: VARIABLESX(:), VARIABLESY(:)
07      type (d_spline_knots) :: knotsx, knotsy
08      real(kind(1d0)) :: COEFFS(:,:)
09      real(kind(1d0)) :: DV_SURFACE_VALUES(size(VARIABLESX),size(VARIABLESY))
10    end function DV_SURFACE_VALUES
11  end interface SURFACE_VALUES


请问,上面的函数名字为什么要叫DV_SURFACE_VALUES,而改成D_SURFACE_VALUES时,调用就会报错?其次,VARIABLESX, VARIABLESY以及函数本身的返回值一定要是一维数组类型吗?能否使单纯的Real(Kind(1d0))类型?如果可以的话,是否可以做一个函数重载,再写一个function DV_SURFACE_VALUES(DERIVATIVE, VARIABLESX, VARIABLESY, KNOTSX, KNOTSY, COEFFS),其中对应的返回值与型参的是浮点型呢?
4、本人愚钝,堂主能否伸出您那充满光芒的双手再将另外一个IMSL库函数 Surface_Constraints也一并编写一个接口,我写了半天,调用老是不成功,不胜感激!跪谢!


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

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

沙发
发表于 2024-6-28 08:47:25 | 只看该作者
1. 指针的定义必须大小为假定的 (:) 。而不能是固定大小。
   不管是不是在一个Type中。
2. 调试器是人类设计最复杂的软件之一,所以经常有bug,仅作为参考。有时候要结合 write 输出到屏幕来判断。
3. 为什么要叫 DV_SURFACE_VALUES,我不知道。得问 IMSL 厂家为什么这么设定。有可能是历史遗留问题。我也是通过分析IMSL的*.mod和*.lib文件才知道的。
4. IMSL是闭源软件,你不能在他的基础上实现重载(除非你有独立书写SURFACE_VALUES函数的能力。)
闭源函数库,你必须严格遵循它本身的函数接口,故而VARIABLESX, VARIABLESY以及函数本身的返回值一定要是一维数组类型。否则调用就会失败。
5. 看到你的需求了,这两天有点忙,我看周末抽个时间帮你弄弄。

17

帖子

5

主题

0

精华

入门

F 币
78 元
贡献
42 点
板凳
 楼主| 发表于 2024-6-28 10:06:20 | 只看该作者
十分感谢版主大人的耐心细致的讲解,醍醐灌顶,受益匪浅!
对版主大人的无私付出,表示由衷的感谢和致敬!

17

帖子

5

主题

0

精华

入门

F 币
78 元
贡献
42 点
地板
 楼主| 发表于 2024-6-30 09:43:28 | 只看该作者
fcode 发表于 2024-6-28 08:47
1. 指针的定义必须大小为假定的 (:) 。而不能是固定大小。
   不管是不是在一个Type中。
2. 调试器是人类设 ...

Dear 堂主!
打扰您周末休息了,麻烦您看看我的需求,您有时间的话,麻烦帮我看看Surface_Constraints的接口文件的重写封装,谢谢您了!

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

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

5#
发表于 2024-7-3 09:14:02 | 只看该作者
[Fortran] 纯文本查看 复制代码
01Module surface_fitting_int
02  USE norm_int
03  implicit none
04  interface surface_fitting
05    function D_SURFACE_FITTING(DATA,KNOTSX,KNOTSY,CONSTRAINTS,COVARIANCE,IOPT,epack)
06      import
07      implicit none
08      type (d_spline_knots) :: knotsx, knotsy
09      real(kind(1d0)) :: DATA(:,:)
10      type (D_SURFACE_CONSTRAINTS) , optional :: CONSTRAINTS(:)
11      real(kind(1d0)) , optional :: COVARIANCE(:,:)
12      type (d_options) , optional :: iopt(:)
13      type (d_error) , optional :: epack
14      real(kind(1d0)) :: D_SURFACE_FITTING(size(KNOTSX%D_KNOTS)-KNOTSX%SPLINE_DEGREE-1,size(KNOTSY%D_KNOTS)-KNOTSY%SPLINE_DEGREE-1)
15    end function D_SURFACE_FITTING   
16  end interface surface_fitting
17 
18  interface SURFACE_VALUES   
19    function DV_SURFACE_VALUES(DERIVATIVE, VARIABLESX, VARIABLESY, KNOTSX, KNOTSY, COEFFS)
20      import
21      implicit none
22      integer :: DERIVATIVE(2)
23      real(kind(1d0)) :: VARIABLESX(:), VARIABLESY(:)
24      type (d_spline_knots) :: knotsx, knotsy
25      real(kind(1d0)) :: COEFFS(:,:)
26      real(kind(1d0)) :: DV_SURFACE_VALUES(size(VARIABLESX),size(VARIABLESY))
27    end function DV_SURFACE_VALUES
28  end interface SURFACE_VALUES
29   
30  interface SURFACE_CONSTRAINTS
31    function DSURFACE_CONSTRAINTS(derivative,point,value,type,periodic)
32      import
33      type (d_surface_constraints) :: DSURFACE_CONSTRAINTS
34      integer , optional :: derivative(:)
35      real(kind(1d0)) :: point(:)
36      real(kind(1d0)) , optional :: periodic(:)
37      real(kind(1d0)) , optional :: value
38      character(len=*):: type     
39    end function DSURFACE_CONSTRAINTS
40  end interface SURFACE_CONSTRAINTS
41 
42End Module surface_fitting_int

17

帖子

5

主题

0

精华

入门

F 币
78 元
贡献
42 点
6#
 楼主| 发表于 2024-7-3 14:55:25 | 只看该作者
fcode 发表于 2024-7-3 09:14
[mw_shl_code=fortran,true]Module surface_fitting_int
  USE norm_int
  implicit none

感谢堂主,您辛苦了,您费心了!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-29 17:11

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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