急急急!IDL 与 C 如何互相调用?? 爱问知识人

来源:百度文库 编辑:神马文学网 时间:2024/04/30 20:45:33
急急急!IDL 与 C 如何互相调用?? 40分回答:1   浏览:908   提问时间:2006-07-11 11:15请高手指教:在 UNIX (HP-UX)/WINDOWS环境下,IDL 如何调用 C 程序(直接调用和带参数的)?反之,C 如何调用 IDL 程序(直接调用和带参数的)?要例子程序,先谢谢了。
IDL-- Interactive Data Language 共0条评论...推荐资料: 黑天鹅:如何应对不可知的未来.pdf更多电子书>> 最佳答案 此答案由提问者自己选择,并不代表爱问知识人的观点 揪错 ┆ 评论 ┆ 举报
悄悄得瑟
[学弟] 我对程序设计语言不是很懂的...
下面是我从别人那拿来的......文章名字是叫"在IDL中调用C语言程序步骤"..不知道是不是你要的...
============================================================
1. 准备工作。你需要安装Visual C++,注意要保证设置cl编译器的环境变量,一个简单的检验方法是在MS-Dos中键入cl命令,看是否正常运行。打开IDL,在命令行中输入

IDL> help,!make_dll,/structure

我们可以得到:

** Structure !MAKE_DLL, 4 tags, length=48, data length=48:
COMPILE_DIRECTORY
STRING 'C:\Documents and Settings\Dave\.idl\rsi\compile_dir-118-idl_6_2-win32-x86-m32-f64'
COMPILER_NAME STRING 'Microsoft Visual C++ 7.0'
CC STRING 'cl %X -D_DLL -DMSWIN -DWIN32 -D_MT /nologo /I"D:\RSI\IDL62\external\include" /c %C /Fo%O'
LD STRING 'link /out:%L /nologo /nodefaultlib /dll %O /def:%E "D:\RSI\IDL62\bin\bin.x86\idl32.lib" msvcrt.lib kernel32.lib %X'

IDL中的make_dll命令就是利用!make_dll系统变量中的参数来编译c语言文件的。COMPILE_DIRECTORY表示编译生成文件存放的地方,COMPILER_NAME是编译器名称,CC和LD分别是编译命令和编译选项。这是个参数是系统默认值,都可以通过make_dll命令的参数改变。

2. 编写C语言文件,我们选用安装目录下external\call_external\C中的sum_array.c作为例子,如下
#include
#include "idl_export.h"
float sum_array_natural(float *fp, IDL_LONG n)
{
float s = 0.0;

while (n--) s += *fp++;
return(s);
}
float sum_array(int argc, void *argv[])
{
return sum_array_natural((float *) argv[0], (IDL_LONG) argv[1]);
}
为了方便,我们把sum_array.c放入COMPILE_DIRECTORY目录中。
从程序中我们注意到:
a) 需要包含头文件idl_export.h,该文件的目录已经在CC参数中设置,/I"D:\RSI\IDL62\external\include";
b) 定义一个适用于IDL调用的函数float sum_array(int argc, void *argv[]),该函数的参数必须是int argc和void *argv[]。该函数以后要被CALL_EXTERNAL调用,通用的形式是return_type example(int argc; void *argv[]);
c) 在sum_array函数中调用自己设计的函数sum_array_natural,有两个参数通过指针数组argv[]传递,argv[0]是数组的指针,argv[1]是长整型变量,关于参数的传递可参考帮助;

3. 利用make_dll命令编译sum_array.c文件,
IDL> make_dll,'sum_array','sum_array_examples',['sum_array_natural','sum_array']
这时在COMPILE_DIRECTORY目录中生成sum_array_examples.dll文件。这里'sum_array'是需要编译的c语言文件名,省略扩展名。'sum_array_examples'为生成dll文件的名称,['sum_array_natural','sum_array']是需要输出的函数。

4. 下面我们就可以利用CALL_EXTERNAL命令来调用sum_array_examples.dll中的函数了,例如
IDL> arr_l=FINDGEN(10)
IDL> result = CALL_EXTERNAL('C:\Documents and Settings\Dave\.idl\rsi\compile_dir-118-idl_6_2-win32-x86-m32-f64\call_external_examples.dll','sum_array',arr_l, n_elements(arr_l),VALUE=[0,1], /F_VALUE, /CDECL)
IDL> print,result
得到
45.0000
上面CALL_EXTERNAL的参数:
a) 'C:\Documents and Settings\Dave\.idl\rsi\compile_dir-118-idl_6_2-win32-x86-m32-f64\call_external_examples.dll'是call_external_examples.dll文件的目录
b) 'sum_array'是需要调用call_external_examples.dll里面的函数;
c) Value选项定义参数传递的方式,指针传递用0表示,非0表示值传递;
d) /F_VALUE表示函数返回float类型变量;
e) /CDECL定义call_external_examples.dll文件传递参数的方式,适用于C语言,详细参考dll文件的生成。