数学建模社区-数学中国

标题: C/C++调用MLu的入门程序 [打印本页]

作者: forcal    时间: 2011-10-30 20:17
标题: C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
& z" e6 r  h1 W5 ^
    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
/ A) }( z! v# }( [/ Z: T. ]% |+ ~% F8 R" s, v: P$ H" G
1 隐式加载例子) d+ K0 z! M  n2 O
4 N) i. V0 V. b. T; ^
    该例子需要以下支持文件:
/ ]6 K7 k: y! p7 I" d  ^+ @7 l3 `8 D' l, O& M
    (1)头文件lu32.h。( l/ X: h: u' ?( s
    (2)导入库lu32.lib及mlu32.lib。
1 a0 }; m8 N' U: \1 X    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>
    5 X* `$ X& a! V: ?4 E+ y
  2. #include <iostream>- k$ p9 ?# ?. n  _' D0 d
  3. #include "lu32.h"                        //Lu头文件8 g( b# S1 N: w7 E& l1 u% R9 [
  4. #pragma comment( lib, "lu32.lib" )9 b( P5 r; f2 s/ w+ r
  5. #pragma comment( lib, "mlu32.lib" )9 ]  A5 i/ v  y# [! o- {/ ~+ D: f
  6. using namespace std;8 X7 f( P4 S3 J1 o. s3 ~  Q
  7. void main(void)
    ; E. N9 `3 ^! H
  8. {$ E* H( D5 y( B2 E
  9.         void *hModule;                //模块句柄$ H$ T& k# ]! I9 E! [
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置- Q/ \' }1 R) w" p3 @3 I; {; n
  11.         int i;                        //错误代码! Y* G: m/ {8 V" p4 z6 _
  12.         void *hFor;                //表达式句柄  k$ r- `: K# W6 B1 d
  13.         luVOID nModule=0;                //表达式所在模块
    & O+ p& E0 ^- W$ Z2 l( J
  14.         void *vPara;                //存放输入自变量的数组指针+ v# R- t7 h# G
  15.         LuData *pPara;                //存放输入自变量的数组指针
    + Q, _1 x$ h0 y" t6 S
  16.         luINT nPara;                //存放表达式的自变量个数
    ; u0 u1 N. Z& N3 c) @4 c( ?' S
  17.         LuData Val;                //存放表达式的值
    - _" R8 F: e( |0 f7 v; p) f
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    # m) H+ `  C! E" p% B
  19.         if(!InitMLu()) return;        //初始化MLu, }  O: }1 r: d: L! d
  20.         if(!UseLu(2))                //申请使用Lu资源
    5 y  o7 G1 b6 T
  21.         {
      j) C9 D+ [9 n" e# K; L7 u- F9 q- u
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    : M+ E. E5 V% A2 A; `8 @5 u
  23.                 if(i): X- m5 |2 q4 B: j9 }
  24.                 {) i% u! Q' i- s) H# Q; M% z; o2 H5 h
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;$ V6 ?4 M1 m+ N) L. g
  26.                 }
    0 c8 V% _9 ?/ S1 O# P  c
  27.                 else
    * |" p% k$ V1 u% F
  28.                 {
    3 U( S: t* g; s$ P$ m+ T- [( r
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数
    * m7 I, x* f+ Q! J% |6 _, H
  30.                         {
    , A( ~$ y( l9 F5 C% \' Y1 G
  31.                                 pPara=(LuData *)vPara;
    4 b3 b- ?+ Q# F! L% L1 e) `- l
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    7 R/ P- H5 k# @( x/ m. L
  33.                                 {7 G& Z' t4 {# y1 t8 V
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
    , ~. y4 N- Q* _  t) z
  35.                                 }7 \0 \/ q! U. G- p! |
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值; e- A/ Q' ~5 V+ r* L/ ]( j7 e6 Y
  37.                                 cout<<Val.x<<endl;
    ( H6 ^* ~) U6 W) k+ a+ c1 `
  38.                         }
    ! ]2 i: m! l6 ~1 \
  39.                         else
    $ u3 [/ t" c1 _5 a! ?* p* ~
  40.                         {
    2 }* H; y/ t, H. ?& ]
  41.                                 cout<<"找不到指定的函数!"<<endl;
    / v3 e$ S0 @, a& R, ~
  42.                         }9 g3 F4 U4 k8 Y3 n! o0 a
  43.                 }
    * \& m- i& k! M7 [  u: v
  44.                 UseLu(0);                //归还Lu的使用权( b, k/ V/ k% R; _+ ^
  45.         }8 v) h$ H+ S2 S* U8 f8 V
  46.         FreeMLu();                //释放MLu. w2 \9 ]# k% U8 k
  47. }
复制代码
结果:
  1. 3
    % ?* y  l) z, b( [; d; G6 C8 M* V6 m
  2. 请按任意键继续. . .
复制代码
2 显式加载例子- d% n1 E( V# A  o% R* X4 q7 L3 t
/ \: R& J" L9 e1 y& p/ r: _
    该例子需要以下支持文件:
- Z: k3 \) B  i7 y7 k' j' x. L3 `4 M/ e/ g3 [8 W8 C
    (1)头文件lu32.h。  f# c3 o, u6 l% f# ?
    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>
    ! A( j8 _' S$ b4 W1 R% W
  2. #include <iostream>
    8 T7 s( m4 `6 `9 K& L" y9 M
  3. #include "Lu32.h"
    ( n" r/ c/ h* k  a3 {7 `
  4. using namespace std;  ?3 }5 \' k0 g- R5 C1 `0 x$ [8 G
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄( e8 ]5 P) f+ I# E9 A

  6. 5 @- \& k- h1 T
  7. //MLu输出函数3 ?+ K, s! R' P3 x5 [# j, V4 @1 |3 P1 j
  8. mluInitMLu pInitMLu;
    / l4 K( |  w1 O$ }1 n1 y4 e
  9. mluFreeMLu pFreeMLu;' q& L/ H% m4 Q4 m
  10. mluGetLuProc pGetLuProc;
    6 C/ W4 l: o! ~  |+ p6 |7 s
  11. mluUseLu pUseLu;. _: J8 B( L/ i) U8 x4 o
  12. mluComModule pComModule;
    . U8 T9 P( v% I5 Z5 S
  13. //Lu输出函数
    / K9 L9 I9 I7 R3 y! B7 G1 @+ K
  14. luGetFor pGetFor;7 R0 n+ M  H! m* A& |$ J( g
  15. luLuCal pLuCal;' W# ^: s" r2 F9 Z  J1 u
  16. bool theInitMLu(void)        //初始化MLu$ L* g. e5 W( g3 N* s
  17. {
    7 f8 \/ [' ?: D: M+ U, F
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll6 M. v+ ]9 L1 z
  19.         if(!hMLu)
    9 h& m. u1 F1 |8 M% r: q% b- r
  20.         {
    2 o8 ?4 Q$ a8 X4 S/ p
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
    1 o  V# Y/ X) u/ L2 Q
  22.                 return false;
    , Z' E& w% r2 a$ [8 z+ \$ S( X
  23.         }1 T6 ?! y4 d! g: Z+ f4 Q% D
  24.         //以下几个语句获取MLu32.dll的输出函数2 u7 m/ G9 j) m& B2 E; N$ m" Q
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");) B5 d4 K! C% _
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
    9 O9 x( Y; M, T, U( z* C" e8 y0 x
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
    ; v9 A8 K- E4 V
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");( P: D1 n# v5 h( N  @# u: ~+ w
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");& V1 o$ ?- K( E* H7 P5 C7 R
  30.         if(!pInitMLu())        //初始化MLu32.dll" \* B1 Z$ V1 t' G# V& y
  31.         {  |8 e: z3 l( r1 a& K, P& _  E
  32.                 FreeLibrary(hMLu);        //释放动态库
    ' P) n! N  v  ^7 \( j- J
  33.                 cout<<"MLu初始化失败!";' {" P' z$ @5 f1 k! x
  34.                 return false;4 j- `) ^( t) R
  35.         }  E" z. G' X5 p/ R3 a/ c
  36.         //以下几个语句获取Lu32.dll的输出函数$ x% n9 `+ `( T- y2 [6 g: C2 ^! S
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");
      k3 q- A4 R2 T, _7 `* `7 a$ m
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");
    # c* W& N; y' H/ u, c4 G
  39.         return true;
    , I& k8 ]! S: V8 Z, ~7 H4 z
  40. }# q( M# u5 v# f% Y/ {" v9 o
  41. void theFreeMLu(void)        //释放MLu8 \1 Q* m- ]. C% U
  42. {
    6 C: o$ D4 Z/ r! w3 l, K# Q+ U
  43.         pFreeMLu();        //释放MLu申请的空间
    , F) a4 E  s: A7 J
  44.         FreeLibrary(hMLu);        //释放动态库* e  X0 [$ p* Y& w
  45. }
    7 F) z! M) ~# Y* c( l
  46. void main(void)
    / A1 X) A" C, q' S* U
  47. {
      q+ y# ~  Y* K. A: B, E
  48.         void *hModule;                //模块句柄/ c, E) w: I: C- X
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置) H, c7 P) a& T' z" ^" t2 t
  50.         int i;                        //错误代码0 w# \. Q& s$ J& k2 C) S0 V
  51.         void *hFor;                //表达式句柄. H" e" ]- a% G% U2 k
  52.         luVOID nModule=0;                //表达式所在模块
    / g5 ]# R: d2 U6 I: k, l
  53.         void *vPara;                //存放输入自变量的数组指针  h, M0 u) _* ~5 `
  54.         LuData *pPara;                //存放输入自变量的数组指针
    % i8 V9 G+ L: {! w  C. X7 m# t' H
  55.         luINT nPara;                //存放表达式的自变量个数
    0 Z+ n) G8 z; Y5 `" y/ m, o
  56.         LuData Val;                //存放表达式的值
    ( n: i6 n" s) F: S/ L: y, W& w
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    ) T  q& R) i' b7 T$ e. S  n/ {9 u  D
  58.         if(!theInitMLu()) return;        //初始化MLu: T( N; F1 P- O( H" v' T; q1 d" g
  59.         if(!pUseLu(2))                //申请使用Lu资源
    : m+ y9 }9 S3 [6 C* [3 p2 m  z
  60.         {8 Z3 Y: S/ i, |3 f4 @5 f1 |
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    8 F1 a+ z" }7 Y) E3 E7 Z6 R+ A4 |
  62.                 if(i)
    ' [4 l9 |; p, w: S& x2 z, @- H
  63.                 {
    . F6 t( C0 U( c' t
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;$ `2 O3 }0 S* W' h! w4 U
  65.                 }9 Q4 @& L6 F6 g
  66.                 else
    1 I2 \! Z1 }4 Z; h* _+ ]
  67.                 {
    * c3 X* _* U( F. K& S! e
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))$ g, I6 Y3 \- R0 K9 }
  69.                         {0 D% D' {% S/ G  S
  70.                                 pPara=(LuData *)vPara;5 ^) I$ t9 I  s8 L/ f
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    , u# [' b: i, D$ |! c
  72.                                 {6 C& |# |* j0 Z* ]1 l! @3 U
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;% x- y8 U4 D6 }/ M
  74.                                 }
    8 K( _. |/ J' M; G4 @, Q$ A/ F. J4 J
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值+ R$ [* r/ w0 m
  76.                                 cout<<Val.x<<endl;
    3 U1 Q) ]" a8 k/ P# x  O7 `& U
  77.                         }& @6 |. G1 O" y- C
  78.                         else0 m+ w- \& I8 C
  79.                         {
    0 W" n" y7 }4 L0 ^  J
  80.                                 cout<<"找不到指定的函数!"<<endl;
    7 p7 S; j, u% `0 Q, d
  81.                         }" D/ {( r) c1 w1 b
  82.                 }
    1 y% H% k. C3 H/ G
  83.                 pUseLu(0);        //归还Lu的使用权/ X' ]2 Z0 U) e6 l- }8 P
  84.         }
    0 P% N; {8 r% d% h. n
  85.         theFreeMLu();                //释放MLu# ~4 J# t  y( j  K$ o
  86. }
复制代码
结果:
  1. 3
    % ?$ k7 w  l9 c0 r: U0 @
  2. 请按任意键继续. . .
复制代码





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5