数学建模社区-数学中国

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

作者: forcal    时间: 2011-10-30 20:17
标题: C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
+ q+ [- d( C4 O+ D/ \, g+ \
    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。( _; |9 Z0 ^. G% C" g; J
. o1 V5 I; @2 Q! ]8 `: d
1 隐式加载例子/ O' d/ `4 ~) Z# I/ Z7 L0 b

4 x8 d* s: r6 x4 c    该例子需要以下支持文件:
( [, m% _+ U/ ]2 O/ Q. |  m; }3 X/ E- F5 M2 @2 d1 x6 `6 z6 m
    (1)头文件lu32.h。; _( {% \) @" C' |% x
    (2)导入库lu32.lib及mlu32.lib。( E* a( ?; E% R3 [  G
    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>  z' i4 X+ r* ~) k
  2. #include <iostream>5 k# o: H# F2 j. M
  3. #include "lu32.h"                        //Lu头文件: z7 x, J- h$ d* ?7 t2 j7 U8 a
  4. #pragma comment( lib, "lu32.lib" )7 x( S& |; o* L) \3 o
  5. #pragma comment( lib, "mlu32.lib" )
    3 E$ v/ B3 z# L# y+ h# R
  6. using namespace std;
    5 s+ e; h( ?0 [
  7. void main(void); H# n. M5 J: @0 Z7 d
  8. {
    ; C% M0 U5 Y$ U, z( ^# R5 W6 ~
  9.         void *hModule;                //模块句柄
    ' E; v  m5 @* E2 c6 I
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置9 `" Q9 D  z5 m( D; z- y
  11.         int i;                        //错误代码* J; T% N8 k) }# i
  12.         void *hFor;                //表达式句柄4 x, M; w/ C; ~+ J) u* Y; C
  13.         luVOID nModule=0;                //表达式所在模块* R4 {( k; C' P3 U9 ?
  14.         void *vPara;                //存放输入自变量的数组指针
    3 A% }( _3 w/ b( I
  15.         LuData *pPara;                //存放输入自变量的数组指针7 O9 A) [$ \! v" b2 B
  16.         luINT nPara;                //存放表达式的自变量个数
    ' p* @* ?3 Z; _, r
  17.         LuData Val;                //存放表达式的值$ X- P) F( ?* }7 G# P
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    4 }; Q3 W( N3 x. Z
  19.         if(!InitMLu()) return;        //初始化MLu
    1 O" q& M+ q( M
  20.         if(!UseLu(2))                //申请使用Lu资源5 M' q$ a% u( y2 @" U: |( L
  21.         {
    + R8 M" H! h" ?* v4 ~. D9 ]
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    7 _+ A3 I9 z7 x9 W$ N
  23.                 if(i)3 `; m# _, [* y! X& ]  ^6 C2 P
  24.                 {
    ' n; f3 h! u& J+ o
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;5 ?! b+ e. k$ Q2 g
  26.                 }
    & B( i" r) h/ I' U2 n; i) ]8 o
  27.                 else
    $ E9 S6 L2 H( l. b) i
  28.                 {1 g" L; l/ g2 M. ~
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数. h/ \# j* D- `4 x8 S
  30.                         {
    " ^  k  Y! D0 V3 |3 d. P3 H; f7 A
  31.                                 pPara=(LuData *)vPara;
    : G7 p) [- v7 _5 E# Z
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    9 J+ j) O# Z  Q5 z. d  g
  33.                                 {
    % ~/ x/ {* _  v  _" _
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;, q8 L& w0 ^5 J0 x6 }' |+ _
  35.                                 }& \( j% u( ?# m2 i* @4 L
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值
    6 M/ S% x5 L2 F2 K: B* K
  37.                                 cout<<Val.x<<endl;
    . W; e0 `1 q. ]$ [
  38.                         }0 E' I5 F1 h5 U
  39.                         else0 g4 S$ U2 O* ^$ U% K/ q% X3 c
  40.                         {
    % h! E% N# ]. t/ z  n4 |
  41.                                 cout<<"找不到指定的函数!"<<endl;6 Q+ E1 r( p% p5 x$ N! F1 f' z
  42.                         }4 d7 z+ |0 ~* [( l. @( {/ b) Y( a
  43.                 }
    & j' @& Z7 ?' v; t$ Z/ A8 X6 g! t
  44.                 UseLu(0);                //归还Lu的使用权
      `( W6 s% H1 q& v& g7 u
  45.         }
    " G, I7 g$ _5 q
  46.         FreeMLu();                //释放MLu7 R! x4 ~$ P" M+ G, ~
  47. }
复制代码
结果:
  1. 3
    - L7 d5 h+ }( f# J* o' m! y
  2. 请按任意键继续. . .
复制代码
2 显式加载例子
/ F# b( ?# G% Y% w# ^& a
' D5 l8 x: K( x4 |( C) |- A: Z    该例子需要以下支持文件:- U( c+ |$ V( J) B
% s5 |( A$ \; Y: ^8 \" E1 i* X- l- B
    (1)头文件lu32.h。4 s9 z6 F9 t" T. }; g: U% ]
    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>. Z$ Z& l% M8 U: L4 @* n
  2. #include <iostream>
    6 a. ~* V* M6 i, o/ T! I
  3. #include "Lu32.h"
    ' L$ T) A* s2 x3 C
  4. using namespace std;
    . V- Y6 d$ P- b8 r
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄7 Y+ w+ I- h' j" I8 T9 b: n% d
  6. ( l: X" V( o! A9 S
  7. //MLu输出函数
    6 v) T9 F4 Z5 r1 W% w8 ~
  8. mluInitMLu pInitMLu;
    2 g8 {  k8 w) R' N4 F( U% h. w
  9. mluFreeMLu pFreeMLu;3 D2 \9 x  W" p
  10. mluGetLuProc pGetLuProc;. w8 r2 y5 J. M
  11. mluUseLu pUseLu;( W" Z6 ~6 }: `/ X  ^: U
  12. mluComModule pComModule;
    ' E% _5 W9 H/ @" T9 D" J, d
  13. //Lu输出函数* v$ d& o2 G9 |& `
  14. luGetFor pGetFor;  Q; T6 K- o/ O* T4 a, w2 Z  j
  15. luLuCal pLuCal;; m' E: s4 Z  y. u8 G1 C& d" T4 X
  16. bool theInitMLu(void)        //初始化MLu
    : s: y" |8 l- r0 X0 n8 r4 u2 q
  17. {
    5 c; r0 B2 k$ v- e, C* O$ P/ }
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll
    0 G4 _; g  D$ f& M  I: R
  19.         if(!hMLu)9 \( B  s1 c) a$ v! n9 z
  20.         {
    0 u) `% o& K9 [; w7 f. |
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";* H, Y; M8 v: H- y8 w% e
  22.                 return false;! E5 A; E3 P4 J7 [8 V
  23.         }
    / V; z, z( v( T6 U# }
  24.         //以下几个语句获取MLu32.dll的输出函数7 Y0 b5 z9 a0 z/ r
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");& W  e8 t, A- @. l1 m
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
    ' k; y$ g: l3 q- [
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
    0 [/ X* f1 G- X
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");( b( Q/ {' t+ Q2 S" r' r/ S
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");# q7 J2 d5 d  M/ m: q/ a
  30.         if(!pInitMLu())        //初始化MLu32.dll
    4 A& W" }$ Z$ ~  d) Q) H
  31.         {( z6 A$ j& E" k4 F
  32.                 FreeLibrary(hMLu);        //释放动态库
    3 f/ A: P6 O8 p) b- s& b" v2 y
  33.                 cout<<"MLu初始化失败!";# Z  x$ {! L9 s$ n; b
  34.                 return false;
    ! ]6 L" \# N" L! Y0 U$ {/ t' @
  35.         }
    ! ]- R$ f0 f9 g# q9 c6 ~/ y
  36.         //以下几个语句获取Lu32.dll的输出函数- b5 G  r. g$ w# {
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");. b, M& e2 a" }
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");0 ]1 s! p7 x  o) M
  39.         return true;$ k( V8 G- y/ a# P4 A
  40. }8 s) O+ u6 P0 _9 h# k
  41. void theFreeMLu(void)        //释放MLu
    3 w$ R" ?5 w5 Y
  42. {; K4 ~& P: F* |; m) {9 W4 v: c
  43.         pFreeMLu();        //释放MLu申请的空间9 Z. A3 p# ~7 F' y  l3 O
  44.         FreeLibrary(hMLu);        //释放动态库
    / k! k9 k: x7 [2 N
  45. }( _% Q7 `' W/ B+ H
  46. void main(void)
    / Z; `6 K+ T7 [! W+ M! f
  47. {3 ?. i5 z4 ?7 N& B; M) ^
  48.         void *hModule;                //模块句柄# k& P. F( g0 B+ D2 z- t
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    $ a4 c; v3 [  ~2 z0 b7 M
  50.         int i;                        //错误代码
    ! f, ?" u; e) Z- @% |
  51.         void *hFor;                //表达式句柄5 g9 D5 x4 B) [
  52.         luVOID nModule=0;                //表达式所在模块
    : X3 ?, h9 k6 |
  53.         void *vPara;                //存放输入自变量的数组指针# p1 O! n' ?0 p. ^- ~9 a4 |
  54.         LuData *pPara;                //存放输入自变量的数组指针
    , @+ _/ A& i. H
  55.         luINT nPara;                //存放表达式的自变量个数
    + `" V+ K* [$ h: O8 i! Z# |4 Z
  56.         LuData Val;                //存放表达式的值
    , h5 i) l' n' s! V4 V6 Y
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    7 }8 k2 D+ g% I: u
  58.         if(!theInitMLu()) return;        //初始化MLu
    # u1 w1 A2 X( y/ |
  59.         if(!pUseLu(2))                //申请使用Lu资源$ k+ u) x- p* ]
  60.         {6 v1 ?2 G2 G) x; k
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    6 i# p7 Q3 _% e
  62.                 if(i)
    9 l: J8 B5 S* O' L# c
  63.                 {
    ! k* V5 H% S' R
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;$ h+ r2 c2 D3 B4 O) Q' ~& b
  65.                 }  [6 ^3 G/ V& D9 ]4 @
  66.                 else
    " O7 ~5 p( s% f1 O4 V
  67.                 {
    & W' e4 U9 n, s8 p, z: }
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))  y9 F0 x* I2 {7 I& m: K
  69.                         {
      U6 o! m  @7 ~/ f, p+ A
  70.                                 pPara=(LuData *)vPara;% E9 j# ^! G4 \  p& N+ }; D( Q# y
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1; @& i# u+ l  c
  72.                                 {" j& P- V% [4 V, @9 {5 v* E; y
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
    % \1 h8 T8 [# F8 H  i4 ?  I
  74.                                 }
    ; o) D" j0 W" I
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值6 @& O5 ~* e$ m, {
  76.                                 cout<<Val.x<<endl;  _; G9 _+ l# Z
  77.                         }
    ) U6 F2 B9 i: H: t
  78.                         else
    - H' ]5 C  q8 _2 I3 o% Z4 |8 Y
  79.                         {2 r3 B7 H& T& n1 x. x
  80.                                 cout<<"找不到指定的函数!"<<endl;
    # G( N( F" J6 t8 C, R, ?/ `! I5 X+ N
  81.                         }
    - {3 X# U  w# w9 n2 x& c; c. h) i
  82.                 }
    ' L/ g* j2 e! W7 U" y. M7 [
  83.                 pUseLu(0);        //归还Lu的使用权
    ' T( Q& h: L7 G: M
  84.         }
    7 p8 ^0 d# y6 ^- ^1 Z, `1 a6 n! a+ m
  85.         theFreeMLu();                //释放MLu
    : O1 E$ F9 u* ?% A. Y& L* o
  86. }
复制代码
结果:
  1. 3
    $ C- \  N  J0 a+ u- r
  2. 请按任意键继续. . .
复制代码





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