数学建模社区-数学中国

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

作者: forcal    时间: 2011-10-30 20:17
标题: C/C++调用MLu的入门程序
C/C++调用MLu的入门程序

9 H( B( C& g- v1 X2 t% w/ ~& P    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
9 E8 u# V+ }  S
( A- C4 D" ~. @( o1 隐式加载例子2 p4 U8 y  \% `1 O; r2 l, R

1 w5 }/ c+ B/ x# G  G# R8 W& D    该例子需要以下支持文件:
! ?0 o# }& H) [% N2 ^! d' d/ Y2 b) J5 c
    (1)头文件lu32.h。# A) U% m! T1 U  c
    (2)导入库lu32.lib及mlu32.lib。: w0 m" c4 F/ ^5 W9 j1 i2 P
    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>8 i: f1 |- X( M' C/ F" {$ ?
  2. #include <iostream>
    " s( M5 q( ^3 R7 l- B  O, B' p, V
  3. #include "lu32.h"                        //Lu头文件' e' G6 z  i$ F
  4. #pragma comment( lib, "lu32.lib" )7 R7 y9 U' W9 Z
  5. #pragma comment( lib, "mlu32.lib" )
    & P) G' P  `% ^2 g
  6. using namespace std;4 z) z% F5 d+ B* b& \6 @4 u4 h
  7. void main(void)
    ) \7 G1 h$ ^; W" n4 {, e& G/ S1 E
  8. {
    ! w! ^: R% V$ i: S3 i+ B4 W
  9.         void *hModule;                //模块句柄
    2 P" x$ v; d& L
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置! ~: T5 i1 U5 @0 S: w( C- m
  11.         int i;                        //错误代码
    : @! S4 [/ T1 J9 E* C
  12.         void *hFor;                //表达式句柄$ ^2 i; n7 z1 O, [* E9 ~9 e
  13.         luVOID nModule=0;                //表达式所在模块6 y5 y" y* n; p0 w* O1 n1 q3 M
  14.         void *vPara;                //存放输入自变量的数组指针
    2 x- k3 K' j. l
  15.         LuData *pPara;                //存放输入自变量的数组指针
    ) |  t- B6 r2 E( @5 P& y9 f% B. o( }
  16.         luINT nPara;                //存放表达式的自变量个数
    + }! F1 R6 J, {  c4 ?
  17.         LuData Val;                //存放表达式的值
    5 i, X; g: n6 t
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    3 O$ m6 w7 z6 r8 v$ \
  19.         if(!InitMLu()) return;        //初始化MLu
    3 C* A& I% F5 `  x1 v+ l
  20.         if(!UseLu(2))                //申请使用Lu资源
    ' @$ r4 d1 i! Y  ~; ?
  21.         {
    ! h, T" c5 J3 G! P6 V5 ^
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    - \  o4 d1 E- b* k
  23.                 if(i)
    0 i7 f. t  ]# @, B  i4 B* `9 K
  24.                 {
    % F- k2 u: C' J. V7 {
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    ' F2 f4 r0 R+ f( t* T2 M1 Z
  26.                 }& D  M* f$ O" z+ J  d
  27.                 else- K7 d% |2 `, C# a. r
  28.                 {& v; X7 k3 a' R! `/ Z# e% \
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数
    : j' d. n: D/ a2 e; g  X' F! {- m
  30.                         {
    ! J3 H+ U+ F: g7 ?7 I2 Z
  31.                                 pPara=(LuData *)vPara;# ?; n: \+ A- _
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1& w. i- x7 D& n) u) O* Y
  33.                                 {
    , C& ~6 X- j) v# u7 d: p( E) u
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
    ( L; ~* |) {5 B3 |- M
  35.                                 }# Z/ |9 o% y; i- U( C
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值
    3 E6 }+ ^" }  b
  37.                                 cout<<Val.x<<endl;
    7 ?& [+ O$ I" U5 U
  38.                         }
    0 h" b# @9 B1 K. v+ H* e. J
  39.                         else. c8 B' h0 [; q7 K, B1 C/ u0 d) V
  40.                         {
    ' A% S; j" y4 V
  41.                                 cout<<"找不到指定的函数!"<<endl;4 S5 g- B7 J0 P9 G  x
  42.                         }2 b: H+ K* {" @+ k
  43.                 }
    * X! @: P4 g9 z6 V: d
  44.                 UseLu(0);                //归还Lu的使用权
    5 w$ t- _& W, L* p8 F. k
  45.         }' D% ?2 T/ U% G" u, h3 r6 a
  46.         FreeMLu();                //释放MLu- s' g5 A4 {! G6 Z
  47. }
复制代码
结果:
  1. 3
    ; X8 W6 M! W5 S
  2. 请按任意键继续. . .
复制代码
2 显式加载例子$ b0 l  ?. R- ]
+ u5 D* K2 a8 h. B( h4 r5 ^
    该例子需要以下支持文件:
1 K0 A- t7 c  y1 d7 Z2 P# _. g/ F- p/ A6 j! t* |, `. z" W
    (1)头文件lu32.h。5 k" h  T& z- s7 J9 {$ v, I) D
    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>
      E, D& R' Z/ J7 Q/ C' y7 N
  2. #include <iostream>0 y$ {1 M+ _. l3 j6 c  w& h
  3. #include "Lu32.h", R) a, {+ U, b( S
  4. using namespace std;
    3 M) S/ W0 S6 q# h
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄
    4 V6 Z# p* d/ R! }8 c5 j- e" T
  6. 8 P+ o  }9 B( d* N/ E
  7. //MLu输出函数
    ' O6 e, @, _; C7 o  \% J
  8. mluInitMLu pInitMLu;7 x3 v& A1 h/ R( E2 j' T. s
  9. mluFreeMLu pFreeMLu;* o) P/ K, d' S, R
  10. mluGetLuProc pGetLuProc;- c" S- v; d& d: R6 P
  11. mluUseLu pUseLu;
    7 ^/ |3 W* d+ @4 M) ?) X
  12. mluComModule pComModule;: W2 J: l' Q) {% c
  13. //Lu输出函数
    5 e; I& ?+ O6 F2 ^
  14. luGetFor pGetFor;+ o1 s; e1 m% e3 m
  15. luLuCal pLuCal;7 ?# U( u# p4 O7 m
  16. bool theInitMLu(void)        //初始化MLu  V. p2 n1 @- B- f3 x* B& [9 d
  17. {/ X9 e4 I; m1 P; y7 j0 P
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll" R# n. k+ K" o% f& Z& C; B
  19.         if(!hMLu)
    + N- C5 N! q1 L$ a
  20.         {
    8 K' t0 b* Y8 a$ ~* H! F: n' E
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
    ! D. g! l+ Y' G
  22.                 return false;
    2 X2 H1 Q/ Y6 ?1 G
  23.         }
    . _1 F+ X" N' w( o: J  h9 s
  24.         //以下几个语句获取MLu32.dll的输出函数' |- U0 |: V; `+ R
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");# a. N# _0 Y" ]) B) V
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
    ; W, y/ Q5 p  u- m/ n7 g+ @
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");5 W8 I  v# j" P4 D1 E( ?: [. k
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");" o$ A- B) f3 X. [
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
    3 Y) C) K1 G6 _
  30.         if(!pInitMLu())        //初始化MLu32.dll* F. x2 k# l  N6 h8 N' a
  31.         {8 ?' u+ k% a. I# j% A. D7 j* i
  32.                 FreeLibrary(hMLu);        //释放动态库
    : M0 o! K8 u4 q# d# m
  33.                 cout<<"MLu初始化失败!";6 P0 M0 ^) w6 g) \
  34.                 return false;
    ) o( c5 _" D- O- P  C, p) N- P
  35.         }
    # U4 j) X: D  Q) ^4 Z# K
  36.         //以下几个语句获取Lu32.dll的输出函数7 o6 y1 J5 y; H5 ]4 H
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");9 V7 y0 q% i* t. m  l
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");; B" C' B6 G* |: Y: q7 c5 c) x
  39.         return true;8 Q+ _1 ]  h0 @3 _4 `; `! _
  40. }
    $ S  d5 _+ I  _/ i% b
  41. void theFreeMLu(void)        //释放MLu! F4 m9 j( A! {( \# {+ z
  42. {; v/ u; \* P* X
  43.         pFreeMLu();        //释放MLu申请的空间
    9 Z, W+ G- D! N: _8 W" t
  44.         FreeLibrary(hMLu);        //释放动态库9 ?( T8 y, {" ?
  45. }, m$ @1 k; t  [) M
  46. void main(void)
    - h# W0 }- r7 V9 Q) k5 d% p% T
  47. {5 g- X) z, |1 z" x: k/ a
  48.         void *hModule;                //模块句柄
    4 U! y" N; p5 c  A: \* K
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置. ^! v# K- |# }: z- t& Z  Y
  50.         int i;                        //错误代码2 N' S5 ?, H0 O( Z( j
  51.         void *hFor;                //表达式句柄2 F9 ?0 c6 L# f' S) V3 b5 g& ^
  52.         luVOID nModule=0;                //表达式所在模块
    - ~, u- L2 |  M
  53.         void *vPara;                //存放输入自变量的数组指针
    0 Z. o0 z& J0 d* x) C4 n" V  A
  54.         LuData *pPara;                //存放输入自变量的数组指针& B0 }" s  N# B& o' p
  55.         luINT nPara;                //存放表达式的自变量个数2 X& B  d) B% i4 G& c  p5 ^
  56.         LuData Val;                //存放表达式的值
    : M) ]- S( ]" t4 Z
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    5 B; O( N/ H5 A6 {! t
  58.         if(!theInitMLu()) return;        //初始化MLu8 G. O' X8 x* ^1 h$ H0 k
  59.         if(!pUseLu(2))                //申请使用Lu资源
    ! B' f7 F% B1 ^
  60.         {2 J# o: r) L3 _% M# H8 ]
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    2 A% l9 Z  d. I- Y& V" u5 k
  62.                 if(i)
      D3 x$ ]2 W5 y1 Q4 R3 e
  63.                 {) `; G; x, E. M/ g
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;* Z2 k1 v0 `5 T
  65.                 }) E8 q3 R" I3 S! |3 ^0 ^- |3 ~; l
  66.                 else9 V7 H6 `) `! a7 Q& Q
  67.                 {
    6 b/ ?! U  {, \0 Z* f+ X" ?
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
    2 Y8 w. U9 h3 m! i* S7 y& ?7 m$ n
  69.                         {) l4 p8 ]) t0 q( V0 N
  70.                                 pPara=(LuData *)vPara;
    " g0 `( B5 @9 X( B; N6 F! Q# I
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为10 R/ w: E! U% K" Q
  72.                                 {: M% [, m9 f5 ^; Y
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
    . Z2 w  A$ l" h( c8 }; T+ Z
  74.                                 }
    # j. g) N/ _9 s" Z  _
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值% L( o4 c8 k5 ~6 l9 f5 z
  76.                                 cout<<Val.x<<endl;
    & }1 i) e+ d& F# W% ~. |  W* X: d
  77.                         }
    9 k7 G( d" k; L, W+ D4 z; U
  78.                         else! w1 e4 S) J- s! ?3 g* L
  79.                         {
    , {  t& I3 t# d, O# ~
  80.                                 cout<<"找不到指定的函数!"<<endl;& k+ f8 S9 E. D: S+ P
  81.                         }- Q$ g( r/ y: K8 T5 F3 T! O) D
  82.                 }
    3 }1 ?. ^. b) a; ^
  83.                 pUseLu(0);        //归还Lu的使用权8 H6 T4 @# I3 d+ d
  84.         }
    - E" Y  M9 y, A% @" d& i$ N
  85.         theFreeMLu();                //释放MLu
    7 E5 m% Q  q3 I# Q: a! c. x9 p* F
  86. }
复制代码
结果:
  1. 3
    2 n2 `  |9 i. h' O& \! {
  2. 请按任意键继续. . .
复制代码





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