数学建模社区-数学中国

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

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

1 }0 O; M8 W+ U7 W    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。- N1 s. T. A0 z+ r( Y, A9 M2 q

* u1 I- H' P. P% f! C6 `) Y1 隐式加载例子% S. V8 X+ j2 t

1 R. r( L& W; O: `: G' A1 a( p: _    该例子需要以下支持文件:
; X7 w& T8 x2 z3 o6 M) p
6 t. p4 q1 `5 w5 m    (1)头文件lu32.h。0 f( Y8 Y0 z2 H% r/ d5 f( ]$ _
    (2)导入库lu32.lib及mlu32.lib。
8 r) |% T  y  ^  E/ S9 e- y; M, _    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>- @* k1 {  j, A4 C( q4 u' {1 _( s' Q7 _
  2. #include <iostream>/ i* e( j. ?/ d& Q
  3. #include "lu32.h"                        //Lu头文件# F9 p% e6 Q* c* X/ ?
  4. #pragma comment( lib, "lu32.lib" )7 W' y% A, S! K# L' Z
  5. #pragma comment( lib, "mlu32.lib" )4 n+ d9 P/ F* V" {4 X$ U% O
  6. using namespace std;! L/ |* y' X5 M4 l
  7. void main(void)
    5 [* J* v: e; {. b3 @+ j1 D
  8. {
    6 i. f5 j; C8 U' \! i. D" `; J
  9.         void *hModule;                //模块句柄3 t0 p0 v! t* d( R4 H6 V. w9 s0 L
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    : j9 l  v% G; V* f2 }3 g4 w
  11.         int i;                        //错误代码$ q; @7 j+ M- K/ K6 D
  12.         void *hFor;                //表达式句柄
    0 s" }: s+ N2 f" i. r
  13.         luVOID nModule=0;                //表达式所在模块, r% p0 {* j2 D; o
  14.         void *vPara;                //存放输入自变量的数组指针- ^3 Y' D, L/ l8 Z) S+ I& b8 r! e3 v
  15.         LuData *pPara;                //存放输入自变量的数组指针
    * {. K  f: J/ M3 O1 z. P& ~: B
  16.         luINT nPara;                //存放表达式的自变量个数
    ) F2 z% c7 R8 p- V4 |0 ^) g
  17.         LuData Val;                //存放表达式的值
    ( {/ h: O! K: `* @$ K# t; z9 z& I5 }
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序1 P. k/ K5 t2 L3 _+ o
  19.         if(!InitMLu()) return;        //初始化MLu
    2 |4 E8 l) ]$ Q; N: H/ U* y' t
  20.         if(!UseLu(2))                //申请使用Lu资源; C$ t- D0 m  X$ e
  21.         {
    " F* Q; \/ l) o; B+ S) K, D
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序4 a) b7 _8 P2 B* @* I$ O1 i) t
  23.                 if(i)4 k! u4 Y' K! ?; C6 E
  24.                 {& p# j& ~: F4 ^$ M
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    ) M% a  I" [! \$ v& y7 J
  26.                 }) ]( ^  @4 P) q' i  k$ {) }% N
  27.                 else+ ~, P) E$ x3 U' \
  28.                 {
    0 E) N1 n( L  x& x0 j  b
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数
    : \2 ~% S9 H; r
  30.                         {; ~7 `3 w* v  C7 a* T
  31.                                 pPara=(LuData *)vPara;. J: G+ F0 }0 S4 X- q* d! v
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1& S. V7 Z7 ]4 g$ Q
  33.                                 {8 Z9 |$ b) R! j6 B( ?
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;( s9 z0 N& |# h  g" q! H. J  R
  35.                                 }/ c: `4 d5 ~, e# W& N
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值
    4 g# K) a# n) r1 ]7 G
  37.                                 cout<<Val.x<<endl;
    6 w: N4 i# C; C7 f! u; L6 p* s* a, J2 a
  38.                         }
    % M# ?# u% O+ O
  39.                         else( D9 p8 W. G- J" M( s
  40.                         {: O* N; T4 P9 U+ [2 _
  41.                                 cout<<"找不到指定的函数!"<<endl;
    ! t, L# h& p: m8 @+ f7 M
  42.                         }. B0 O# v: e2 E- D
  43.                 }  Y, K6 Z* m' Q4 k' D, d8 ~
  44.                 UseLu(0);                //归还Lu的使用权
    8 k1 W: w" b. ]' C# X, h3 {
  45.         }% Y! W+ Q9 t. R* m( n5 I
  46.         FreeMLu();                //释放MLu6 n2 `4 y# J- b
  47. }
复制代码
结果:
  1. 37 U/ V# |) `; {  V& I" @& T0 R
  2. 请按任意键继续. . .
复制代码
2 显式加载例子! N2 \: R; O% ]% y4 h/ k6 p  A4 a
( u8 `. j# T/ v. [$ ^
    该例子需要以下支持文件:
7 B$ U0 w) a( K/ c3 d. Q
% j) R' ~6 o* v    (1)头文件lu32.h。* t; }6 O0 t3 ]& v
    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>; P. u7 n: F3 s$ K: w2 ^; B% `: I
  2. #include <iostream>
    . _* k; _! ^( Z( @+ B$ F7 t* }0 i
  3. #include "Lu32.h"
    5 \5 W+ `- g# }6 b
  4. using namespace std;
    : B8 X/ j" T8 H( C2 c2 G5 O' s* P8 Z
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄
    # s  a+ N: u) {( @! T5 T6 U# P

  6. " O8 A+ F. u# j; [3 i7 f- J
  7. //MLu输出函数# w! [& ?* W$ g3 e$ G+ A* r7 T" M
  8. mluInitMLu pInitMLu;
    + {" R, W# T; L) @
  9. mluFreeMLu pFreeMLu;  ^* v* L4 |4 m( ?
  10. mluGetLuProc pGetLuProc;
    9 R+ s3 N7 I' L4 r4 c
  11. mluUseLu pUseLu;8 o% P$ N5 l1 \9 _4 |+ _. `
  12. mluComModule pComModule;
    ' I  b5 t6 Y% M& L/ C0 D
  13. //Lu输出函数, a, D1 L( _! J. G3 ~+ A% R
  14. luGetFor pGetFor;' g$ h+ B8 E+ U& d5 @" \
  15. luLuCal pLuCal;, \1 e, y$ D( Q0 Y- Y- g/ a
  16. bool theInitMLu(void)        //初始化MLu5 L6 w6 F1 \, F" o# E9 D
  17. {
    6 X* `$ y6 W8 Z0 H
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll! e: O2 D& U& x9 }; o  ?9 q
  19.         if(!hMLu)! H7 F7 ^7 `+ f; f8 L$ L
  20.         {- g( F+ g9 f, f
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";2 \  k9 `+ \& J: ?  [4 _' y3 x
  22.                 return false;4 ]" q4 n0 U6 t1 m. e
  23.         }1 N+ y6 h; i% ^3 ?2 p) d; o9 R
  24.         //以下几个语句获取MLu32.dll的输出函数
      y! R! J1 g( W) I3 Y% R5 T- Q
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");/ f0 A, O, h/ }  O8 \6 X5 F! c
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");) P7 b6 a8 c7 G; S$ T/ B
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
    ' }. r4 b4 ]! s& w  ^
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");; I5 T5 f7 F. n$ _
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
    / ?. `; O) H- P& q) P% D
  30.         if(!pInitMLu())        //初始化MLu32.dll! |) @2 N9 V/ f$ t; ^4 i1 W9 `! `9 D0 I
  31.         {( Q8 u, g+ Z# ]- T) x' L3 E
  32.                 FreeLibrary(hMLu);        //释放动态库. p. Y+ e& N8 n
  33.                 cout<<"MLu初始化失败!";
    * I* W5 O  a: R9 {& ~
  34.                 return false;- V1 M% r( l& c: a, c3 d: z; a- B/ a
  35.         }
    ( m- \. E! _$ N7 A8 r
  36.         //以下几个语句获取Lu32.dll的输出函数
    6 o9 U3 ]; ], ~8 G% E2 o
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");
    5 p2 F5 @. C+ s; B
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");8 q; h9 n+ B: _
  39.         return true;6 I" y5 j) ~$ H7 x6 {
  40. }8 E: l) m$ ]: q0 O/ O8 Q
  41. void theFreeMLu(void)        //释放MLu' s& ~0 l/ K+ \5 V+ D
  42. {
    / j$ i' z: g% v( y0 q  i
  43.         pFreeMLu();        //释放MLu申请的空间
    / X5 }; p; V& n- s, k
  44.         FreeLibrary(hMLu);        //释放动态库
    & \8 A+ M. H1 o$ b" v
  45. }: X, d: |# z7 f* b6 I3 X
  46. void main(void)
    - r" C' S) ~3 k7 c1 Z
  47. {
    8 e( E3 ^! I8 `, {6 M
  48.         void *hModule;                //模块句柄
    8 y  {6 h) ~5 N8 s/ q
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置& Q( [* r$ ?- E. p
  50.         int i;                        //错误代码
    & h- X$ U* c  _2 R* j! M
  51.         void *hFor;                //表达式句柄, ]! i0 _3 U5 V, i( L
  52.         luVOID nModule=0;                //表达式所在模块$ V6 s& u& l9 x+ b# Q5 L; {
  53.         void *vPara;                //存放输入自变量的数组指针
    # \7 K( h6 m& @! a6 ?. ~" U
  54.         LuData *pPara;                //存放输入自变量的数组指针
    ! B6 ~4 H5 o- `1 A/ `
  55.         luINT nPara;                //存放表达式的自变量个数
    2 I1 z' B2 l6 N8 h$ F
  56.         LuData Val;                //存放表达式的值* F0 K/ U, \6 S+ _
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序+ `9 e& L' h# n3 Y/ K
  58.         if(!theInitMLu()) return;        //初始化MLu
    7 f5 z4 A; r/ u. T' K
  59.         if(!pUseLu(2))                //申请使用Lu资源
    3 ^0 g! H& e- {" b& L  d8 y
  60.         {
    1 y3 W* P4 p9 J3 N
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序6 v, \; ^; u- N! O6 M% l, A
  62.                 if(i)1 A- g6 n8 s) k5 Y4 C
  63.                 {
      s% x( y! J8 g6 Y/ Y
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    6 o9 F. k& d  ~3 x
  65.                 }: W% J! \: n8 u: `
  66.                 else
    * F5 M  B0 u8 L5 y1 [- \/ N
  67.                 {3 x2 J- P3 v8 `" @6 R- R) R
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))4 D2 m  }6 Q3 e! N6 Q
  69.                         {% P% {5 @0 D! I! j
  70.                                 pPara=(LuData *)vPara;) [0 ~+ O5 T& A, S0 n  M# U
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    9 [. `* r3 @7 r/ g; R( ^; ^* X; f
  72.                                 {
    " ^. p# [4 G5 Q7 d
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;7 x' l, E. H3 H0 K1 `7 _
  74.                                 }
    8 p$ q2 p  ]9 o/ Q" s, ?, k6 O4 |
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值+ s$ g1 x. r3 J# H. I* T
  76.                                 cout<<Val.x<<endl;
    # b# o. K8 c7 G' f
  77.                         }
    ; C. D' D( `8 |# D: w& B% T
  78.                         else' t2 c! R( }3 j8 n$ r  w
  79.                         {+ P' I9 e3 `! x+ q" y; r. w2 Z
  80.                                 cout<<"找不到指定的函数!"<<endl;6 ]0 I: Q& l7 X
  81.                         }
    2 i! p% r) Q; F9 k
  82.                 }  s# z" x6 o1 w
  83.                 pUseLu(0);        //归还Lu的使用权
    4 r7 N& m5 m! ]( j0 j
  84.         }
    ' G% [3 j/ R( Q* S$ @7 V
  85.         theFreeMLu();                //释放MLu; \: @. I4 C* M. _/ r: |& W
  86. }
复制代码
结果:
  1. 3
    , ]+ U, Y; J/ q; {% u% P
  2. 请按任意键继续. . .
复制代码





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