我目前正在尝试使用IDL连接一些fortran例程,是的,它听起来很痛苦。首先,我试图让IDL文档中给出的示例工作,但在这里我遇到了一个非常奇怪的问题。当我尝试传递一个数组时,如http://www.exelisvis.com/docs/FORTRANExamples.html所示,代码只传递第一个元素。
这是我使用的代码。目前我使用上面链接中给出的c包装器。
fortran代码。 (clf.F)
SUBROUTINE SUM_ARRAY1(array, n, sum)
implicit none
INTEGER n,i
INTEGER array(3), sum
sum=0.0
DO i=1,n
st = sum + array(i)
sum = st
ENDDO
!sum = n
!sum = array(1)
RETURN
END
这是c代码。 (caller.c)
#include <stdio.h>
void sum_array(int argc, void *argv[])
{
extern void sum_array1_();/* Fortran routine */
int *n;
int *s, *f;
f = (int *) argv[0];/* Array pntr */
n = (int *) argv[1];/* Get # of elements */
s = (int *) argv[2];/* Pass back result a parameter */
sum_array1_(f, n, s);/* Compute sum */
}
我编译并链接
gfortran -c clf.F -fPIC
&& gcc -c caller.c -fPIC
&& gcc -shared -fpic clf.o caller.o -o mylb.so
用IDL调用
a = [5,6,7]
sm = 0
S = CALL_EXTERNAL('mylb.so','sum_array', a, N_ELEMENTS(a), sm)
print, sm,a
现在这应该返回我的数字的总和,换句话说sm = 18.但是,当我运行exelisvis给出的代码时,我得到一些随机数。现在我玩了它。如您所见,我试图设置sum = n和sum = array(1)。在这里,我得到正确的输出,3和5.但是,如果我尝试使用sum = array(2),我会回到奇怪的数字。
通过做一些调试我可以收集的是整个数组没有传递给fortran数组。我也尝试过使用fortran接口和不同的编译器。当我使用fortran包装器时,我试图在这里定义一个数组并将其传递给子程序,这就像一个魅力。
所以在我看来问题是从IDL到fortran / c的信息传递中继。让我感到惊讶的是,我甚至无法让网页上的示例工作。我目前使用64系统,明天我将尝试在32中编译,看看是否有任何改变,手册提到了这一点。但是,我需要让它适用于64位系统。
由于这对我来说是一个非常新的领域,我希望这里有一些愚蠢的错误,有人可以发现它。所有形式的帮助表示赞赏。感谢。