小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

急急急!IDL 與 C 如何互相調(diào)用?? 愛(ài)問(wèn)知識(shí)人

 siotutu 2010-03-18
已解決 急急急!IDL 與 C 如何互相調(diào)用?? 40分
回答:1   瀏覽:908   提問(wèn)時(shí)間:2006-07-11 11:15
請(qǐng)高手指教:在 UNIX (HP-UX)/WINDOWS環(huán)境下,IDL 如何調(diào)用 C 程序(直接調(diào)用和帶參數(shù)的)?反之,C 如何調(diào)用 IDL 程序(直接調(diào)用和帶參數(shù)的)?要例子程序,先謝謝了。
IDL-- Interactive Data Language
最佳答案 最佳答案 此答案由提問(wèn)者自己選擇,并不代表愛(ài)問(wèn)知識(shí)人的觀點(diǎn)

悄悄得瑟

[學(xué)弟] 向悄悄得瑟提問(wèn)
我對(duì)程序設(shè)計(jì)語(yǔ)言不是很懂的...
下面是我從別人那拿來(lái)的......文章名字是叫"在IDL中調(diào)用C語(yǔ)言程序步驟"..不知道是不是你要的...
============================================================
1. 準(zhǔn)備工作。你需要安裝Visual C++,注意要保證設(shè)置cl編譯器的環(huán)境變量,一個(gè)簡(jiǎn)單的檢驗(yàn)方法是在MS-Dos中鍵入cl命令,看是否正常運(yùn)行。打開(kāi)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系統(tǒng)變量中的參數(shù)來(lái)編譯c語(yǔ)言文件的。COMPILE_DIRECTORY表示編譯生成文件存放的地方,COMPILER_NAME是編譯器名稱,CC和LD分別是編譯命令和編譯選項(xiàng)。這是個(gè)參數(shù)是系統(tǒng)默認(rèn)值,都可以通過(guò)make_dll命令的參數(shù)改變。

2. 編寫(xiě)C語(yǔ)言文件,我們選用安裝目錄下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,該文件的目錄已經(jīng)在CC參數(shù)中設(shè)置,/I"D:\RSI\IDL62\external\include";
b) 定義一個(gè)適用于IDL調(diào)用的函數(shù)float sum_array(int argc, void *argv[]),該函數(shù)的參數(shù)必須是int argc和void *argv[]。該函數(shù)以后要被CALL_EXTERNAL調(diào)用,通用的形式是return_type example(int argc; void *argv[]);
c) 在sum_array函數(shù)中調(diào)用自己設(shè)計(jì)的函數(shù)sum_array_natural,有兩個(gè)參數(shù)通過(guò)指針數(shù)組argv[]傳遞,argv[0]是數(shù)組的指針,argv[1]是長(zhǎng)整型變量,關(guān)于參數(shù)的傳遞可參考幫助;

3. 利用make_dll命令編譯sum_array.c文件,
IDL> make_dll,'sum_array','sum_array_examples',['sum_array_natural','sum_array']
這時(shí)在COMPILE_DIRECTORY目錄中生成sum_array_examples.dll文件。這里'sum_array'是需要編譯的c語(yǔ)言文件名,省略擴(kuò)展名。'sum_array_examples'為生成dll文件的名稱,['sum_array_natural','sum_array']是需要輸出的函數(shù)。

4. 下面我們就可以利用CALL_EXTERNAL命令來(lái)調(diào)用sum_array_examples.dll中的函數(shù)了,例如
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的參數(shù):
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'是需要調(diào)用call_external_examples.dll里面的函數(shù);
c) Value選項(xiàng)定義參數(shù)傳遞的方式,指針傳遞用0表示,非0表示值傳遞;
d) /F_VALUE表示函數(shù)返回float類型變量;
e) /CDECL定義call_external_examples.dll文件傳遞參數(shù)的方式,適用于C語(yǔ)言,詳細(xì)參考dll文件的生成。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多