IDL CALL_EXTERNAL传递数组

时间:2015-03-10 19:31:34

标签: linker fortran idl

我目前正在尝试使用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位系统。

由于这对我来说是一个非常新的领域,我希望这里有一些愚蠢的错误,有人可以发现它。所有形式的帮助表示赞赏。感谢。

0 个答案:

没有答案