数学建模社区-数学中国

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

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

/ j0 ]/ n. W/ o6 v1 U/ g  X    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。% D" m0 ^5 ~, Z0 ^% ?0 Y: V' m4 E' t
, j. M9 d6 k( p" s" J* ?. p8 X+ X
1 隐式加载例子
, G/ g6 G/ c8 M: w; [) U/ b. t: a* r. x' F* l$ K9 N
    该例子需要以下支持文件:% w( f, z, W4 S# I; X, \/ Q
6 {! {# g- I' M" `
    (1)头文件lu32.h。
# F* k7 n# H) \% e  I6 X    (2)导入库lu32.lib及mlu32.lib。0 O+ B/ B7 {1 _( U8 |
    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>
    ' ~4 q" M  r8 |0 ~
  2. #include <iostream>5 t, K* ~1 n0 N
  3. #include "lu32.h"                        //Lu头文件& F6 h9 C0 ~' m' T0 \- d* f+ z
  4. #pragma comment( lib, "lu32.lib" )$ B* I( U; ?! K0 h5 h2 i
  5. #pragma comment( lib, "mlu32.lib" )
    1 O3 f/ D- n# w/ @" X" b0 N
  6. using namespace std;6 k7 t9 i# u- Z4 b# `
  7. void main(void)
    . E  m( D1 C6 \) m, G, s' j
  8. {
    " S' r. r, g! l/ I$ \
  9.         void *hModule;                //模块句柄
    ; d9 U* ~, Y8 Q) G. z
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置% \# K; U6 M5 f* J# j8 Y/ O
  11.         int i;                        //错误代码
    % y$ T4 ?( A  x2 U6 A& g
  12.         void *hFor;                //表达式句柄$ L$ _. [! E2 A; p' {5 S
  13.         luVOID nModule=0;                //表达式所在模块( `) `' A: a' `  }  i% B
  14.         void *vPara;                //存放输入自变量的数组指针0 N3 n* l% E0 E0 H6 d6 H
  15.         LuData *pPara;                //存放输入自变量的数组指针5 v. V5 m+ X- W# ]3 v: J4 v
  16.         luINT nPara;                //存放表达式的自变量个数
    2 e) U: l4 R; n6 Y
  17.         LuData Val;                //存放表达式的值. w2 _7 p/ l4 `9 a0 F/ l
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    ' [- _. I4 u$ f& n8 L1 b7 n
  19.         if(!InitMLu()) return;        //初始化MLu0 N3 C4 s1 f( ?: D/ t& C9 ?% r
  20.         if(!UseLu(2))                //申请使用Lu资源
    ( k/ i4 e% E0 H) w
  21.         {
    8 t; s7 F  s) s- q1 P4 K: H
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    % D, \3 |- o7 p( t% q
  23.                 if(i)
    : @  p9 ]  Z7 p, x4 O& N
  24.                 {
    . @3 a5 }9 r+ d6 M/ g4 L8 V
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    6 y4 u  t/ `' @7 u, R( i; i
  26.                 }
    , F' Q+ `; ]6 f* q8 d* p
  27.                 else5 v' }6 v6 a9 F& G# s% L7 K) o, k
  28.                 {
    6 [9 a9 ^! J1 P. ~. _- U
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数! J& H7 G7 R$ Y% L0 b4 w8 @# @
  30.                         {
    " V% \. T# p1 T: n; b  o( _3 t
  31.                                 pPara=(LuData *)vPara;
    6 z2 N& `$ n" @: f  M
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1% h% M: T) z9 ]* d0 ?9 x: u
  33.                                 {( e2 A( G; W( ~9 K: F* D; V
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;3 x7 D( F- o2 b' b9 L& ]2 H- @9 ^' K
  35.                                 }
    - t1 p/ l8 {  \$ ^; m4 B& {5 T
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值
    " W/ g, ?/ g& X8 \  e) B( t& |* ?
  37.                                 cout<<Val.x<<endl;- a; v2 ^8 D0 F
  38.                         }
    6 P. k# B7 J# ]( R+ L$ P6 O
  39.                         else! j$ [; N1 `' Z9 ~  p0 A
  40.                         {
      ~  j' y  u$ \( m$ p) L7 W
  41.                                 cout<<"找不到指定的函数!"<<endl;3 E8 B4 _( @, [/ e  X* r7 r0 j
  42.                         }
    3 N3 ^' x8 I& V( x, X7 n
  43.                 }2 P, Y* s/ l) I( @; Z
  44.                 UseLu(0);                //归还Lu的使用权
    + m' U. ~" J$ {; D% M
  45.         }% X1 a5 ?! S% z2 r; U. v0 ]
  46.         FreeMLu();                //释放MLu
    6 V3 j8 N8 @6 v% F
  47. }
复制代码
结果:
  1. 39 W9 }, g5 O9 m3 w: r! G
  2. 请按任意键继续. . .
复制代码
2 显式加载例子
; T7 N; C# @8 F" d# o5 j
+ ~. a. S: Q0 U" d( @+ q    该例子需要以下支持文件:3 F6 U+ G$ _( Q+ t! _1 \; ~

* z& N3 o% F- K    (1)头文件lu32.h。
9 G1 y: P8 ~, Y# O' o/ F    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>
    + T' M2 M  ?: T6 K
  2. #include <iostream>% R. q* v7 v$ W
  3. #include "Lu32.h"! j- a: m! K/ P$ q0 I' l) Z. w! j
  4. using namespace std;# a; T+ V6 T* f) v
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄
    6 N4 k* @+ l! M( h, o: I
  6. & e& ^' @; r2 T; g% G! M6 Z! r% V
  7. //MLu输出函数. m8 a! T4 f' w! a( H% |4 R
  8. mluInitMLu pInitMLu;6 @( \- n/ U# R8 k0 `, ?+ ]
  9. mluFreeMLu pFreeMLu;
    * A  U/ A3 Q6 p9 M
  10. mluGetLuProc pGetLuProc;. R( N+ r! y. K3 l$ E: j! I
  11. mluUseLu pUseLu;
    ) b8 y5 Z0 }2 x! @. Z& d- z# ]
  12. mluComModule pComModule;
    ; \. c3 ?3 E2 x9 u5 G# z" T
  13. //Lu输出函数% L2 d9 j6 n  @5 |5 ]4 ?
  14. luGetFor pGetFor;# c6 `9 l* ]" P) s: b! J
  15. luLuCal pLuCal;7 L8 v- `: Z+ `
  16. bool theInitMLu(void)        //初始化MLu
    $ Q, n; M4 L/ h2 c9 I; r+ {" Z
  17. {
    " j6 v. M3 U) A/ k$ \
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll
    0 R3 W% m+ o; s9 E) |4 R0 J
  19.         if(!hMLu)1 M  @+ A$ t* G& e
  20.         {
    ' W) }! V5 S5 n( b9 @8 n; {
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";, N& s/ C# ~5 V3 ^/ Y
  22.                 return false;0 b5 W+ ~( Q; S( J! C0 z
  23.         }9 F5 a0 o8 S- q: {9 A1 Q
  24.         //以下几个语句获取MLu32.dll的输出函数
    1 ]& T; J' S; E8 `
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");# H* q5 I0 d3 G! ~1 I
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");  `$ }; }% b) s+ m
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");! H' Z0 H: G& ?9 u# n& _
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
    * D) ?! a* z, }0 |, r
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");/ j6 ]% Z; ~, w; k9 o6 ?
  30.         if(!pInitMLu())        //初始化MLu32.dll* I$ _; ]& n5 f* Q& N& y# E
  31.         {2 Q# U- |1 F8 e& a4 Q* i
  32.                 FreeLibrary(hMLu);        //释放动态库; S% ]4 F+ ^" |6 o5 V- `6 s- j1 t  P
  33.                 cout<<"MLu初始化失败!";  R3 e7 T" X0 z$ D+ }# }
  34.                 return false;# M, B& W' y/ c  n5 v* \! K4 J
  35.         }/ L! w& Q1 T+ {# `7 t5 ^; C
  36.         //以下几个语句获取Lu32.dll的输出函数& U; b1 e$ [# n3 R% g# w% W& o* y9 H  F
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");
    8 M/ Z2 g* b! q. c' z
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");
    " ]* v' N+ q1 r& ?7 ^; u1 V  _& m
  39.         return true;
    3 L$ v: \7 H4 h$ K1 _
  40. }+ s; C: {% Z5 r
  41. void theFreeMLu(void)        //释放MLu9 |/ \3 x9 P* t' `' y
  42. {
    * z, @5 x, {; q  o# X' B/ e: D9 d
  43.         pFreeMLu();        //释放MLu申请的空间# r# V" r; j4 p6 j* P% `
  44.         FreeLibrary(hMLu);        //释放动态库7 t( [3 c' g2 Y7 m" i; c' v; y
  45. }' d4 I( F& f7 i2 A8 H7 l
  46. void main(void)
    / c* z% a# E% w5 N( w' U9 E
  47. {  q% _0 q" ?# b4 J  Z& W5 z
  48.         void *hModule;                //模块句柄! ?$ a5 N) n1 K" m- y
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置2 w9 v& k4 |1 }8 p+ C0 t; W% ]
  50.         int i;                        //错误代码
    5 \0 W; b* i8 a8 k5 U
  51.         void *hFor;                //表达式句柄
    0 \) o: h6 u& L+ R
  52.         luVOID nModule=0;                //表达式所在模块7 S) g! B; g2 u7 ^
  53.         void *vPara;                //存放输入自变量的数组指针6 X8 l5 c& t3 l) Z( d( i
  54.         LuData *pPara;                //存放输入自变量的数组指针
    - _4 S" C3 K  _: H- J( C
  55.         luINT nPara;                //存放表达式的自变量个数) _4 e5 T5 D. w( B) Z
  56.         LuData Val;                //存放表达式的值& J$ s0 G( G5 H( K9 p
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    ! M- I/ p  a9 u
  58.         if(!theInitMLu()) return;        //初始化MLu
    - `. H: d4 h7 i. d, n  N
  59.         if(!pUseLu(2))                //申请使用Lu资源
    . B/ y' f3 q$ u. I9 X$ a( o
  60.         {  Z, y1 H  o* j: \; A
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序# z3 A  c+ p2 ?8 ?
  62.                 if(i)1 W" T0 G$ j- l" o! M: o6 N" u
  63.                 {
    & a. ~7 v4 P, l" q( T  u- l
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    ! k6 N, C3 e/ C9 q
  65.                 }" \! n' @9 {; a: o
  66.                 else; O  ~$ \) T! A3 ?' k2 z
  67.                 {
    ( L- B( N* f1 S7 p) @$ j0 r6 q0 U- `
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
    " K& `" f* z& E% m
  69.                         {
    : z2 T, P) y) V7 ]- G
  70.                                 pPara=(LuData *)vPara;5 A+ z  @0 i$ S/ b7 r8 J
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    ) U) R: `0 H; ~6 o
  72.                                 {
    5 N' C8 f: M- }# r  H' Y4 {
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
    ; t1 f; |5 j4 b7 k
  74.                                 }
    5 }4 I( \! {1 U5 N% o' c9 \
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值
    6 _7 R, f: c. q/ \$ t/ k4 |/ H) J
  76.                                 cout<<Val.x<<endl;' B2 @; S2 U# _" l: x
  77.                         }0 M6 W* y- h* _
  78.                         else
    + x/ w3 {7 q1 Y' z; a  l
  79.                         {0 _% a# [2 F  o" W. ^) l7 v1 Y
  80.                                 cout<<"找不到指定的函数!"<<endl;: b& p5 Q$ x( j" x2 ^
  81.                         }
    ; ?9 X5 y6 q5 f
  82.                 }8 i" f, m( K5 X- D; V/ w$ N
  83.                 pUseLu(0);        //归还Lu的使用权
    + P2 ?" q) h  m! E, P" ~/ V$ W
  84.         }
    ' u9 ?, u7 R+ p: g
  85.         theFreeMLu();                //释放MLu
      J$ N6 Y0 d8 k$ R2 i: e3 q
  86. }
复制代码
结果:
  1. 3
    4 e/ C! Q4 r( n& }! e9 k3 u  Y% S
  2. 请按任意键继续. . .
复制代码





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