数学建模社区-数学中国

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

作者: forcal    时间: 2011-10-30 20:17
标题: C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
. L% R' z( w8 C. n; K# {) p9 t2 I
    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。* U1 N, g1 L9 X9 p% s
$ Y: M) l. X1 i, i
1 隐式加载例子6 T+ Q4 s4 k. T2 C
! R7 B' N' ~: u+ }8 O) u
    该例子需要以下支持文件:
% q) N3 t* J9 R0 x% @1 ^
  I# V# H1 |* p+ g    (1)头文件lu32.h。
) |) O/ n% B; H$ R) e8 P& Q, b    (2)导入库lu32.lib及mlu32.lib。
& P7 Z+ N$ r5 t( O# ?) p    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>9 A3 \: ?; U7 h, h# s
  2. #include <iostream>
    - {( T. P' R& s" s' n7 F2 a
  3. #include "lu32.h"                        //Lu头文件
    # f7 o# T$ M2 y2 K, D
  4. #pragma comment( lib, "lu32.lib" )
    ' ~. w. s* l6 j: L2 j; o3 H
  5. #pragma comment( lib, "mlu32.lib" )! }/ g! W* a9 U: f9 H0 `- w6 v
  6. using namespace std;0 X  [6 j$ x* B/ C* p
  7. void main(void)$ r4 v# h8 G9 U' s2 o  R
  8. {+ u' f3 b0 h; X. C
  9.         void *hModule;                //模块句柄
    * J& k/ k) ^; M% G
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置; o, E" B" i* x, S
  11.         int i;                        //错误代码
    5 g: I5 P, H, N
  12.         void *hFor;                //表达式句柄( E0 X4 c. _6 G" t! v
  13.         luVOID nModule=0;                //表达式所在模块* J8 a& ?/ C- K
  14.         void *vPara;                //存放输入自变量的数组指针
    8 {. q+ B5 w2 `) M  p" O, C
  15.         LuData *pPara;                //存放输入自变量的数组指针
    0 |) j$ N* _" Z, ~/ m9 a
  16.         luINT nPara;                //存放表达式的自变量个数! ?' U' |$ E: ^: n* |$ F$ z2 q, [
  17.         LuData Val;                //存放表达式的值
    & t7 |! r8 ^! X6 C& @  U1 J
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    # @, D( d, m1 e! Y: H
  19.         if(!InitMLu()) return;        //初始化MLu% j" H% }/ a0 e9 e- I
  20.         if(!UseLu(2))                //申请使用Lu资源' L: O/ z% H; L' M
  21.         {' g2 c) r0 @$ t: W9 j
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序' L9 ]. |. p; r  e) n
  23.                 if(i)) C1 G: h& R; d/ T7 O) c4 H
  24.                 {$ b1 `4 F9 e$ j$ K
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;* @, D& ^: B7 `6 e5 B1 l
  26.                 }
    2 f$ c9 Q% R. M. N2 C1 }' r. I4 Z
  27.                 else
    , O: w( X$ j( y- E) q
  28.                 {% `6 }! S3 d/ }3 a) _
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数
    4 s& V- \4 G; `4 ?4 [. @$ n! N
  30.                         {' H7 T, d, [8 @7 @
  31.                                 pPara=(LuData *)vPara;
    ) ?; N, l8 A/ G
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    8 `6 C, T" t7 u! Z& Y% ?( d6 \" l! E
  33.                                 {( L6 f# A7 s6 g9 ~2 n9 `8 t6 J
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;, v5 v- ?, M1 `) u0 K
  35.                                 }
    0 \; v) t6 l- |. i( Z
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值5 ?  O* O( q$ k9 e
  37.                                 cout<<Val.x<<endl;. |+ v$ x7 d4 X+ C6 v2 K
  38.                         }
    * p# t5 {1 U+ R
  39.                         else$ G; v2 K& e! Q( X
  40.                         {8 r/ @7 n/ L& D$ v8 |
  41.                                 cout<<"找不到指定的函数!"<<endl;
    ' c6 H& e( z# g7 |! o
  42.                         }; G  B; X0 {( w- Z; Y
  43.                 }! A9 r& X/ g) W' P6 ^# l' j0 L
  44.                 UseLu(0);                //归还Lu的使用权) ]* h) a7 [/ a" K
  45.         }
    # k* A, t" q. w9 w# q0 u3 _" \. ~3 r) F
  46.         FreeMLu();                //释放MLu: q0 W% v- M8 w& ~3 a/ c/ N
  47. }
复制代码
结果:
  1. 3
    + R3 e8 G4 [; _1 n! i
  2. 请按任意键继续. . .
复制代码
2 显式加载例子
+ e* f/ [/ J! N& p: n5 x5 |* S, P$ G# x- ?3 ]
    该例子需要以下支持文件:9 T4 b% U& F- I) b
1 I4 E3 w" ?% m' b
    (1)头文件lu32.h。
; U! T" A7 V3 U4 H4 B    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>+ e6 t) \+ T) N  s0 J% u
  2. #include <iostream>2 l, G1 _0 X3 E
  3. #include "Lu32.h"9 Q. M5 d- w" a
  4. using namespace std;
    4 t; F0 N7 A6 N
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄
    3 \1 |& x9 N' Q# C) a/ g( k
  6. & ^) g' J5 `2 n+ F
  7. //MLu输出函数
    & m! [. D; I2 _
  8. mluInitMLu pInitMLu;( V/ A2 n9 Q+ G0 a; t. x
  9. mluFreeMLu pFreeMLu;" S! X+ c7 v0 ]& L( S, A% D- r
  10. mluGetLuProc pGetLuProc;
    : t* Y; }0 S( R2 A' O3 t2 {
  11. mluUseLu pUseLu;
    + d+ {5 r5 O$ T2 Y* S: k
  12. mluComModule pComModule;
    3 Y  m1 f4 ~8 B- I, p0 i( T3 I/ T$ {
  13. //Lu输出函数+ G& i1 P7 n$ ^2 ]
  14. luGetFor pGetFor;
    2 }- |6 ^$ x  ]
  15. luLuCal pLuCal;$ f6 b3 v9 B3 @
  16. bool theInitMLu(void)        //初始化MLu
    3 C0 N5 }5 j. F( D7 m4 h
  17. {7 z$ T# Z* I. ~2 s. v+ Y  h
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll! f% E- o7 j3 R1 ^2 F
  19.         if(!hMLu)
    0 ^& s* p5 y1 x
  20.         {
    ; d0 e* |0 v9 h& {
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";" q7 L! K! T7 B
  22.                 return false;7 p( z2 l9 e6 Z
  23.         }
    $ y2 k7 c  a: [) P* w% H
  24.         //以下几个语句获取MLu32.dll的输出函数! B4 S6 j" a+ l' D4 A' g, g) A* y- h
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");8 c& F7 K6 U% _! V- A' B
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
    6 U- ]- B; W6 {* S: H& q! Z
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");5 s2 M9 G% {* j' Y) y1 c' K
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");7 f- s$ A: B7 q5 ]+ G# J( H
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
    3 P/ j5 Q) B9 _
  30.         if(!pInitMLu())        //初始化MLu32.dll
    4 T& u! h6 \! \3 S# E3 J
  31.         {; E8 z: b9 z* q7 F/ C9 b2 g
  32.                 FreeLibrary(hMLu);        //释放动态库: H; ]2 g2 F$ G% V+ a; {5 Y. i
  33.                 cout<<"MLu初始化失败!";
    # e2 Y( Y2 n) i' ~6 h
  34.                 return false;5 o- n, N  q: j0 L/ W1 a( k
  35.         }4 m: Q, E" T- x; y
  36.         //以下几个语句获取Lu32.dll的输出函数5 C$ B( A" s% ^$ d0 ^- y8 d* I. K
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");1 Z8 T/ r) F0 F
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");! k/ i" j6 Y. ~- N* A
  39.         return true;
    ) M) i+ c4 q3 Q; X4 K
  40. }
    ( I  I: V! D4 I$ W, D+ W5 x4 H7 j
  41. void theFreeMLu(void)        //释放MLu) Z* R& g" `7 v9 l3 ^
  42. {
    # n4 w3 _! z, a
  43.         pFreeMLu();        //释放MLu申请的空间4 Y) {& B3 V- u) P' c3 v
  44.         FreeLibrary(hMLu);        //释放动态库8 j5 A  N/ k% q( b/ D
  45. }8 X( g4 n; Z+ e
  46. void main(void)
    # h$ G2 R& _5 L9 I
  47. {
    : U. ~4 b' `2 s
  48.         void *hModule;                //模块句柄
    : S! K1 C$ @2 q( C8 I
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    ! K0 t' [$ Z! E: u: g; B
  50.         int i;                        //错误代码
    " t. |3 _: O/ n$ W4 s
  51.         void *hFor;                //表达式句柄
    . _" e6 S2 K$ ~5 B4 J; M* `$ u
  52.         luVOID nModule=0;                //表达式所在模块
    # U# {' |5 u& v+ X, O& V
  53.         void *vPara;                //存放输入自变量的数组指针
    / }8 v1 C7 o4 l8 a) P
  54.         LuData *pPara;                //存放输入自变量的数组指针* d6 V: z' @2 X/ Z
  55.         luINT nPara;                //存放表达式的自变量个数
    ! ~9 B$ {* W8 j  l. J  |
  56.         LuData Val;                //存放表达式的值
    3 M8 K* F' ]' J
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序& ^1 u* U0 ?, f; N2 i  X1 H# m) a
  58.         if(!theInitMLu()) return;        //初始化MLu9 X, S1 J; V* I: Q" _& Y
  59.         if(!pUseLu(2))                //申请使用Lu资源
    . {* m% n3 Y; ^) {1 |1 _/ |" U
  60.         {# f1 a' V  L% B5 G; X6 v
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序7 _! i+ J6 s+ ^# y5 A, T& }
  62.                 if(i)
    0 Y" U' E) ~4 u& V" M0 k
  63.                 {
    ' J/ W  ^, ^" }0 A, U; |) y$ N
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    : O; j7 [/ v! _: u
  65.                 }! T$ F- }8 ?2 a* y1 D
  66.                 else
    # H* M, s0 P  l' x" ?
  67.                 {5 x) L2 T! s* Q. {! \$ D
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
    ) Z4 S1 C* y1 R) n0 T
  69.                         {1 F# X# H* ?- o: A* E: n- b" i
  70.                                 pPara=(LuData *)vPara;) r8 H' m5 ]8 i& Z  M) E" d; X
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    5 l& @; R% ]4 t+ \0 V) H8 \' [# U
  72.                                 {
    ) ]  ^- Q: u* i1 f! f' z
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
    5 e5 x! v. }4 J! B$ v- o
  74.                                 }" a3 ]7 a6 N) T
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值2 k6 [, _+ {& Y$ k0 q! D
  76.                                 cout<<Val.x<<endl;
    5 y8 n7 \1 `2 N8 ]# `1 ~
  77.                         }  h7 u/ `- y9 g' q
  78.                         else) n: _: c7 P2 l7 z0 ~
  79.                         {4 l0 j1 [9 o/ M; ~  ]2 T+ N
  80.                                 cout<<"找不到指定的函数!"<<endl;
    % F7 s, u, @1 S2 K0 @
  81.                         }: ^& p: D# N+ s  U( P2 n1 x
  82.                 }
    / ^& H6 U7 g* W9 c! g
  83.                 pUseLu(0);        //归还Lu的使用权/ W! v1 |0 I1 K. |2 k' E" h
  84.         }
    0 D+ L, K' L0 j! J
  85.         theFreeMLu();                //释放MLu
    $ a& E/ z( Q. y3 `9 H# m8 K0 s0 x0 z
  86. }
复制代码
结果:
  1. 38 a3 M  @. X- A( e* Y% r
  2. 请按任意键继续. . .
复制代码





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