主题:库函数的参数传递问题
youyou0507
[专家分:90] 发布于 2011-11-09 18:12:00
在编程中遇到一个问题,在调用一个库函数时,需要给它一个参数数组。这个库函数只预留了一个实数组接受外界参数。可是我要传递的不光有实型数,还有整型数。我看到在f77里面,可以做到整型数与实型数的相互传递,但是f90就不行,会报错,说类型不符。请教高手,用f90应怎么解决?
回复列表 (共7个回复)
沙发
fortran2008 [专家分:750] 发布于 2011-11-09 22:24:00
integer*4 a(4)
a=1
write(*,*)sin(real(a))
end
你在调用的时候用real()试一试。
板凳
臭石头雪球 [专家分:23030] 发布于 2011-11-10 09:00:00
严格的说,F90 发现参数不匹配会警告你。这是更好的编译器行为,便于你发现隐含的错误。
如果你真的需要转换类型,可以参考楼上的做法,进行转换 real 函数既可。
我的疑问是,这个函数是否返回值,如果你需要的是整型的返回,那么计算过程依然是实型的,可能会造成精度问题。
这是值得注意的,你应该了解,自己是否需要这个库函数的整型版本?而不是只要觉得转换以后能够调用就行。
3 楼
youyou0507 [专家分:90] 发布于 2011-11-10 09:14:00
数组比较大的话,楼上的方法可能效率不好
4 楼
youyou0507 [专家分:90] 发布于 2011-11-10 09:23:00
是这样的,比如用库函数求AX=B方程组,对于矩阵A,并不是显示的,A与物理数学模型相关,要得A,库函数提供了一个子程序接口mata,mata来完成A的计算,要完成A的计算,就必须给mata提供大量的参数,既有实型的,也有整型的,可能还有复数,但是能库函数只有一个可供传递参数的实型数组和一个记录数组中各种参数存储地址的整型数组。库函数是用f77编的,在f77中,各种类型的参数可以相互传递,不报错。现在用f90了,相互传递的话就不行了。
5 楼
cgl_lgs [专家分:21040] 发布于 2011-11-10 10:01:00
如果传的数据较固定,可以考虑使用自定义数据类型。
6 楼
臭石头雪球 [专家分:23030] 发布于 2011-11-10 13:45:00
楼主应该认识到几个道理:
1.任意传递参数类型是非常非常危险的!!F90 对参数类型的检查非常有必要,非常有好处。
2.库函数是用 F77 还是 F90 编写的没有丝毫关系。库函数已经是二进制汇编代码了,不再带有语言特征。
[quote]但是能库函数只有一个可供传递参数的实型数组和一个记录数组中各种参数存储地址的整型数组[/quote]
这句没看懂。麻烦解释一下。
mata 是你自己书写的函数,还是库提供的?如果是库提供的,那么你 call mata 时的实参,必须跟库函数要求的接口一一对应。
强制参数转换类型是非常危险,非常不科学的。
我还是未能理解你的库函数接口要求。但是不管怎样,参数类型都应该明确。这是不变的真理。
另外,如果你需要函数内部计算变成整数的,那么这个库函数无法满足你。因为整型和实型变量的计算方法,在二进制上完全不同。如果这样的话,你需要整型版本的库函数。
7 楼
youyou0507 [专家分:90] 发布于 2011-11-10 17:19:00
回:臭石头雪球
库函数为 Sub1(n,ia,a,……)
a中可以放一系列参数x1,x2,x3,……,相应的存放地址为d1,d2,d3,……,d1,d2,d3是存放在ia(1),ia(2),ia(3)中的,
而mata(n,ia,a,……)的参数个数是固定的,但是具体内容可以编写
于是到要用到x1时,先找到x1的地址ia(1),再把获取x1具体数值x1=a(ia(1))
这样就可以完成mata的具体任务了
在77中,a可以整数,也可以放实数,不考虑安全问题的话,还是比较方便的
但在90中,则编译不了,我说的问题主要是这个,用强制类型转换视乎可以解决,但也会有安全问题
我来回复