Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker IDL调用\u外部传递数组_Linker_Fortran_Idl - Fatal编程技术网

Linker IDL调用\u外部传递数组

Linker IDL调用\u外部传递数组,linker,fortran,idl,Linker,Fortran,Idl,我目前正在尝试将一些fortran例程与IDL接口,是的,这听起来很痛苦。首先,我试图让IDL文档中给出的示例正常工作,但在这里遇到了一个非常奇怪的问题。当我试图传递一个数组时,如这里所示,代码只传递第一个元素 这是我使用的代码。目前我使用上面链接中给出的c包装器 fortran代码。clf.F SUBROUTINE SUM_ARRAY1(array, n, sum) implicit none INTEGER n,i INTEGER array(3), sum sum=0.

我目前正在尝试将一些fortran例程与IDL接口,是的,这听起来很痛苦。首先,我试图让IDL文档中给出的示例正常工作,但在这里遇到了一个非常奇怪的问题。当我试图传递一个数组时,如这里所示,代码只传递第一个元素

这是我使用的代码。目前我使用上面链接中给出的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代码。来电者

  #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 */
  }
并调用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=array1。这里我得到了正确的输出,3和5。然而,如果我尝试使用sum=array2,我会返回到奇怪的数字

通过进行一些调试,我可以得出结论,整个数组没有传递给fortran数组。我也尝试过使用fortran接口和不同的编译器。当我使用fortran包装器时,我试图在这里定义一个数组,并将其传递给子例程,这非常有效

因此,在我看来,问题在于从IDL到fortran/c的信息传递中的中继。令我惊讶的是,我甚至无法让网页上的例子发挥作用。我目前使用的是64系统,明天我将尝试在32系统中编译,看看这是否会改变什么,手册中提到了这一点。然而,我需要让它为64位系统工作


因为这对我来说是一个非常新的领域,我希望在这里的某个地方有一些愚蠢的错误,有人能发现它。感谢所有形式的帮助。谢谢。

你看了吗?我没有特别看那一个。不。不管怎样,我想出来了,它与一个IDL_INT在fortran中等于一个短整数和一个整数*2这一事实有关。我肯定我是喜欢这个,但我想我没有。因此,如果将来有人遇到这种情况,请确保您的数据类型100%正确。对不起,提出了不必要的问题。
a = [5,6,7]                                            
sm = 0                                                     
S = CALL_EXTERNAL('mylb.so','sum_array', a, N_ELEMENTS(a), sm)
print, sm,a