C C 呼叫MLu的入門程式

2021-12-30 00:39:07 字數 3994 閱讀 6884

mlu是程式和lu核心庫之間的乙個介面庫,mlu會自動載入lu核心庫和動態載入多個lu擴充套件庫,簡化了lu系統的使用;mlu可對lu源程式進行模組化編譯,能夠編譯執行具有固定格式的源程式(字串表示式),源程式中可以使用c++風格的注釋。此外,mlu還提供了多個執行緒互斥地訪問lu資源的功能;提供了lu執行監視器,以退出耗時較長的程式;提供在指令碼中動態編譯函式的功能;提供錯誤處理函式,實現錯誤(異常)處理的恢復模型等等。

1 隱式載入例子

該例子需要以下支援檔案:

(1)標頭檔案lu32.h。

(2)導入庫lu32.lib及mlu32.lib。

(3)核心庫lu32.dll和模組化編譯執行庫mlu32.dll。

#include  

#include  

#include "lu32.h"           //lu標頭檔案 

#pragma comment( lib, "lu32.lib" ) 

#pragma comment( lib, "mlu32.lib" ) 

using namespace std; 

void main(void) 

void *hmodule;      //模組控制代碼 

luint errbegin,errend;  //表示式編譯出錯的初始位置和結束位置 

int i;          //錯誤** 

void *hfor;     //表示式控制代碼 

luvoid nmodule=0;       //表示式所在模組 

void *vpara;        //存放輸入自變數的陣列指標 

ludata *ppara;      //存放輸入自變數的陣列指標 

luint npara;        //存放表示式的自變數個數 

ludata val;     //存放表示式的值 

wchar_t forstr=l"f(x)=x+1; :::ff(x,y)=f(x)+y;";   //lu模組化源程式 

if(!initmlu()) return;  //初始化mlu 

if(!uselu(2))       //申請使用lu資源 

i=commodule(forstr,nmodule,hmodule,errbegin,errend);    //編譯lu源程式 

if(i) 

cout<

else 

if(getfor(l"ff",1,null,nmodule,hfor,vpara,npara))   //查詢全域性函式 

ppara=(ludata *)vpara; 

for(i=0;i<=npara;i++)    //表示式自變數賦值,均賦值為1 

ppara[i].btype=lustadata_int64; ppara[i].vtype=lustadata_int64; ppara[i].x=1; 

val=lucal(hfor,ppara);  //計算表示式的值 

cout<

else 

cout<

uselu(0);       //歸還lu的使用權 

freemlu();      //釋放mlu 

結果:3 請按任意鍵繼續. . .

2 顯式載入例子

該例子需要以下支援檔案:

(1)標頭檔案lu32.h。

(2)核心庫lu32.dll和模組化編譯執行庫mlu32.dll。

#include  

#include  

#include "lu32.h" 

using namespace std; 

hinstance hmlu=null;    //動態庫mlu32.dll的控制代碼 

//mlu輸出函式 

mluinitmlu pinitmlu; 

mlufreemlu pfreemlu; 

mlugetluproc pgetluproc; 

mluuselu puselu; 

mlucommodule pcommodule; 

//lu輸出函式 

lugetfor pgetfor; 

lulucal plucal; 

bool theinitmlu(void)   //初始化mlu 

hmlu=loadlibrary(l"mlu32.dll"); //載入動態庫mlu32.dll 

if(!hmlu) 

cout<

return false; 

//以下幾個語句獲取mlu32.dll的輸出函式 

pinitmlu=(mluinitmlu) getprocaddress(hmlu,"initmlu"); 

pfreemlu=(mlufreemlu) getprocaddress(hmlu,"freemlu"); 

pgetluproc=(mlugetluproc) getprocaddress(hmlu,"getluproc"); 

puselu=(mluuselu) getprocaddress(hmlu,"uselu"); 

pcommodule=(mlucommodule) getprocaddress(hmlu,"commodule"); 

if(!pinitmlu()) //初始化mlu32.dll 

freelibrary(hmlu);  //釋放動態庫 

cout<

return false; 

//以下幾個語句獲取lu32.dll的輸出函式 

pgetfor=(lugetfor) pgetluproc("getfor"); 

plucal=(lulucal) pgetluproc("lucal"); 

return true; 

void thefreemlu(void)   //釋放mlu 

pfreemlu(); //釋放mlu申請的空間 

freelibrary(hmlu);  //釋放動態庫 

void main(void) 

void *hmodule;      //模組控制代碼 

luint errbegin,errend;  //表示式編譯出錯的初始位置和結束位置 

int i;          //錯誤** 

void *hfor;     //表示式控制代碼 

luvoid nmodule=0;       //表示式所在模組 

void *vpara;        //存放輸入自變數的陣列指標 

ludata *ppara;      //存放輸入自變數的陣列指標 

luint npara;        //存放表示式的自變數個數 

ludata val;     //存放表示式的值 

wchar_t forstr=l"f(x)=x+1; :::ff(x,y)=f(x)+y;";   //lu模組化源程式 

if(!theinitmlu()) return;   //初始化mlu 

if(!puselu(2))      //申請使用lu資源 

i=pcommodule(forstr,nmodule,hmodule,errbegin,errend);   //編譯lu源程式 

if(i) 

cout<

else 

if(pgetfor(l"ff",1,null,nmodule,hfor,vpara,npara)) 

ppara=(ludata *)vpara; 

for(i=0;i<=npara;i++)    //表示式自變數賦值,均賦值為1 

ppara[i].btype=lustadata_int64; ppara[i].vtype=lustadata_int64; ppara[i].x=1; 

val=plucal(hfor,ppara); //計算表示式的值 

cout<

else 

cout<

puselu(0);  //歸還lu的使用權 

thefreemlu();       //釋放mlu 

結果:3 請按任意鍵繼續.

摘自 forcal的專欄

C C 程式呼叫shell命令

c c 程式呼叫shell命令可以通過以下函式實現 1 file popen const char command const char mode 過程 popen 會呼叫fork 產生子程序,然後從子程序中呼叫 bin sh c來執行引數command的指令。引數mode可使用r代表讀取,w代表寫...

matlab練習程式(c c 呼叫matlab)

就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...

C C 呼叫Python程式的List列表介面

該介面檔案為屬於python2.7的include python2.7 listobject.h。這裡的 刪除了原有的注釋。在linux中,可以使用如下的命令找到相關的檔案 sudo find grep listobject.h grep python2.7關於python3的版本,不在此處列舉。i...