数学建模社区-数学中国

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

作者: forcal    时间: 2011-10-30 20:17
标题: C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
! m8 r2 {; D4 w( \$ _
    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
) i6 P$ J0 n% J( R( W
0 b" I3 i: h) |$ g! i% D! r1 隐式加载例子! x: I# o8 [5 r: Y6 m+ N) _

" v, v' p8 V  R: W    该例子需要以下支持文件:
1 q! J+ y: w5 H$ G7 _# g' A
. s+ ]9 A6 K3 t$ a3 }2 D- o    (1)头文件lu32.h。
! x( j9 Q$ c; [3 A1 `* `1 H7 u    (2)导入库lu32.lib及mlu32.lib。
3 i$ s8 X; r3 r* Z, l9 [! u    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>  A% r. o' c. j/ e8 G7 {6 s! l
  2. #include <iostream>- M6 }% k) Y, {5 b1 a
  3. #include "lu32.h"                        //Lu头文件
    - H# ~! c  K. V/ F$ |( _( r# N
  4. #pragma comment( lib, "lu32.lib" )
    ; v* b+ l  _* N) |2 b+ w
  5. #pragma comment( lib, "mlu32.lib" )8 H" q0 @% C5 k  T6 T' E$ n( l
  6. using namespace std;* i# z, q4 b" `" p; Z4 ~
  7. void main(void)6 b% O/ f4 L2 B- I6 w" X0 P3 D
  8. {7 u% z  Y0 j* L# \; k! |8 I' |
  9.         void *hModule;                //模块句柄
    * Z8 e: b' G. p6 \( b3 {
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置& `; m. t3 `- ?# J- X3 r
  11.         int i;                        //错误代码/ C/ d+ C1 _: M( I* N/ N% ?
  12.         void *hFor;                //表达式句柄
    - @9 \& l: x7 @
  13.         luVOID nModule=0;                //表达式所在模块
    9 l- B) B! R, o
  14.         void *vPara;                //存放输入自变量的数组指针2 _* ^& ^; K( J, a+ b
  15.         LuData *pPara;                //存放输入自变量的数组指针/ \3 W7 T' Y# j7 a
  16.         luINT nPara;                //存放表达式的自变量个数4 ]' m3 A& O6 A* S3 X0 O8 ]
  17.         LuData Val;                //存放表达式的值1 h/ V# D7 o7 W% b: B- }" G  |  m
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    3 Q/ a2 h+ s! O6 h8 @  Y  [
  19.         if(!InitMLu()) return;        //初始化MLu+ i1 \! D" C$ y
  20.         if(!UseLu(2))                //申请使用Lu资源
    ( r) R. j/ S7 P- y, j* J- O/ [
  21.         {" W4 \. L. j  r0 C% F' i) {
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序. Q% P+ d, O. y6 }# D9 \" c
  23.                 if(i)) \+ b# r6 \( p/ B
  24.                 {& v, T! p9 Z( q6 K. F6 G0 @- x
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    ! b% P/ T% s4 |& L! O3 Z
  26.                 }
    ) j, b0 f3 q' `7 E9 m
  27.                 else
    & y7 W8 N1 ^  D* G& r+ p
  28.                 {# r" D; P& K8 _7 x1 \6 R
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数
    4 p3 T: X6 d0 V: w8 u: ^6 N1 u% }
  30.                         {' L) Z, x6 Y( u6 |3 M) W  b
  31.                                 pPara=(LuData *)vPara;
    " ~, N' o; f* y# d8 y4 `4 s6 M
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    2 l9 s% U) ^0 Z" c- ~; }
  33.                                 {' }+ _! q& A# @/ a9 i
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
    : X" h$ T% d" e5 m6 q$ {* K" w1 c
  35.                                 }
    * O: O2 n+ b7 h' c( B4 I
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值
    + q$ L6 W! F7 U1 ?+ `
  37.                                 cout<<Val.x<<endl;
    5 [0 T" \! J. V3 g6 f" W5 u
  38.                         }
    , X4 a# J3 L+ V  j5 k; H  ?
  39.                         else
    % s- [/ ^( s1 b, y/ F
  40.                         {
    ; _! b! T; h" N$ b( o* n
  41.                                 cout<<"找不到指定的函数!"<<endl;5 ~9 c* A& [$ W, x! s* ]$ ^. }
  42.                         }
    ! @% v3 g3 n1 x& V: n. d4 U( I! J5 Q! M
  43.                 }7 j3 F3 a: B% o! h) c6 N
  44.                 UseLu(0);                //归还Lu的使用权
    ) V* H  z/ a( |2 ?
  45.         }* c( W4 g+ o5 q6 C& a3 g$ B
  46.         FreeMLu();                //释放MLu
    ! q( l% p. S. \/ n' ^
  47. }
复制代码
结果:
  1. 3  A% J- l: I: Z  d
  2. 请按任意键继续. . .
复制代码
2 显式加载例子
  X" O# d4 r6 C5 A( j" e$ r, [) a. }6 u# ]' [) f. [
    该例子需要以下支持文件:" [/ K( Z. L/ Z# ?3 F

0 N7 o% R; I  q. ?4 V# \7 j    (1)头文件lu32.h。
: A' A# r2 J( P3 J+ W( u    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>
    6 H+ u& U/ i# X0 e% J
  2. #include <iostream>% [( [9 P+ f" A7 m+ }
  3. #include "Lu32.h"# C$ T% B& O* _
  4. using namespace std;9 h. g7 S- U' q" p0 z( z4 ]
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄4 y$ g9 `& H  n$ J0 {. X

  6. 1 e9 ?; l2 w+ i7 W5 G6 d9 x1 e7 |
  7. //MLu输出函数
    ! R( }! ^2 ~. y
  8. mluInitMLu pInitMLu;, U. {4 j6 ]; X5 e2 o( C- l
  9. mluFreeMLu pFreeMLu;
    + N- `% Z' h! ~1 E
  10. mluGetLuProc pGetLuProc;+ g0 X6 r6 v. W( V# h
  11. mluUseLu pUseLu;
    8 a6 E1 P: C. y
  12. mluComModule pComModule;: @. Y1 _' k! A' @" ~
  13. //Lu输出函数: g; L7 X0 Q$ d
  14. luGetFor pGetFor;, }" M2 _) ]  h4 d
  15. luLuCal pLuCal;( \! h+ R) Q0 h- x
  16. bool theInitMLu(void)        //初始化MLu; y9 G! A. l2 W) t; D6 A1 C
  17. {4 y) R* e+ u' b. z' {9 p
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll
    ) b. Z8 |0 {8 k7 d; B7 C
  19.         if(!hMLu)
      S$ o  f' ?  D& f
  20.         {
    ! w+ o* }4 Y1 J# V' ?4 H
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
    * s# h0 E# F4 }/ m( u8 t1 [
  22.                 return false;
    ( _! W5 c( ]  @
  23.         }
    * A, X+ d% B1 O5 c4 ?/ F3 X
  24.         //以下几个语句获取MLu32.dll的输出函数
    ) ^$ ^: w+ A2 D
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");: v2 k! w3 Y' [
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");7 C' g. a$ Q% ~- r0 a2 a, z
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");  ~% [/ Y* ?' p. s0 `) E2 l
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
    % r+ W# m3 Q/ ?. V9 q7 j: E. ]
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
      @: G3 s4 h- F; t9 N' J; D/ X8 X
  30.         if(!pInitMLu())        //初始化MLu32.dll
    . e0 P4 A; S& A% O% l- }
  31.         {
    7 I3 C) P- d) v% c8 X# P) M
  32.                 FreeLibrary(hMLu);        //释放动态库
    4 }6 E/ }' G5 M- V
  33.                 cout<<"MLu初始化失败!";4 k+ J) |' _6 }' g5 E0 X8 K
  34.                 return false;
    # G) i8 @. v) @
  35.         }
    ; X  X* c/ X" V) o/ H
  36.         //以下几个语句获取Lu32.dll的输出函数
    ' i" V! _4 w' p  l5 o# I0 V
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");5 v8 D; e- O$ S) ]+ O, r' a
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");
    6 A+ m" y- `: t1 b! u
  39.         return true;
    & L4 x+ m7 G, s3 D$ o* U2 h
  40. }' Z3 `6 Y. k& f! h" `+ j7 ]
  41. void theFreeMLu(void)        //释放MLu
    ! g, G- x& O6 G' W, \. h
  42. {# U, i- I( {! z
  43.         pFreeMLu();        //释放MLu申请的空间3 [7 [# l, R' g6 g
  44.         FreeLibrary(hMLu);        //释放动态库
    * P5 w$ H4 y2 Y% f1 h& g% s- J
  45. }
    7 I3 M  K( I, U9 V- N+ `
  46. void main(void)
    . @4 K( @* ~! H; H0 p
  47. {
    1 n. X' l) s* T
  48.         void *hModule;                //模块句柄
    0 P8 c2 h, _6 o1 r" `. v2 Q
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置5 v  g8 s$ V# Q3 b2 h( N. D
  50.         int i;                        //错误代码) P8 I* C0 `6 x1 b1 U( G3 g
  51.         void *hFor;                //表达式句柄( V% G* Y5 B& T1 ]* A
  52.         luVOID nModule=0;                //表达式所在模块9 G" N" Z( P/ I4 c' B  o' ^
  53.         void *vPara;                //存放输入自变量的数组指针, {, v5 j2 x7 Q! u9 ^; }6 B
  54.         LuData *pPara;                //存放输入自变量的数组指针
    , w, m/ L7 Q! X4 f6 c6 [- f; [" x
  55.         luINT nPara;                //存放表达式的自变量个数
    & X3 U' n% x. v
  56.         LuData Val;                //存放表达式的值' c6 R' S; E+ r2 K! W
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
    ; s3 H, o# }! E; C
  58.         if(!theInitMLu()) return;        //初始化MLu& `* F+ p* n( P, R) V
  59.         if(!pUseLu(2))                //申请使用Lu资源4 H1 V. U1 _$ Y( q7 b
  60.         {
    1 n& m8 K# B  i0 c5 O3 g
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序% O5 Y# C2 c& e+ R2 V0 g
  62.                 if(i)
    & N) n9 I- @/ n, p
  63.                 {0 ]8 x" V( x. j) ^& q4 F+ p
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;% y+ C$ w- Q0 l  b# D
  65.                 }
    / x$ }2 N1 j/ q: O! G+ \9 Z
  66.                 else
    , v- j7 l+ E5 U, b- K; [
  67.                 {* k  T1 X! f& {" ~, M0 m
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
    5 c6 q! ?# f! G
  69.                         {8 i% W, X, e0 |- c
  70.                                 pPara=(LuData *)vPara;" T  V. T0 }" ^; p; x" j
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为14 P1 l: O/ Q- R+ ^; T- z
  72.                                 {
      j- d% b5 ?" Q$ ]$ V% P2 ?
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;& V7 b+ @3 c- ^
  74.                                 }  M( c" x- {# n. |* ?6 i% D# |
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值. q3 o0 C1 T# ]. h3 F$ p& W- d
  76.                                 cout<<Val.x<<endl;
    $ u5 Q6 E8 b: {7 E" {' b" u4 i/ m
  77.                         }
    , k& O) g$ B- W
  78.                         else
    , w. A) P4 p, V) \2 o9 A
  79.                         {' _, f7 C' r, r% Y* D1 p3 ]7 T- p
  80.                                 cout<<"找不到指定的函数!"<<endl;
    3 Y9 T; r3 Q9 @. s: W" {
  81.                         }" @/ r3 z; ]& y7 S( v; U
  82.                 }  l0 H2 O, [# e) H0 @: m" t: y
  83.                 pUseLu(0);        //归还Lu的使用权
      n# A: @. R7 k( |6 |. y6 P
  84.         }
    5 z, d( o0 }, i7 K; j. _
  85.         theFreeMLu();                //释放MLu% {6 ^/ R- a. L4 I/ h* T8 |5 |
  86. }
复制代码
结果:
  1. 3
    5 Q. f0 ]2 m0 e; r  j. S
  2. 请按任意键继续. . .
复制代码





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