数学建模社区-数学中国

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

作者: forcal    时间: 2011-10-30 20:17
标题: C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
1 g( C& {8 Y& c0 {* V' ?  M: L5 @
    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
  w! x8 W  w0 b' a4 V1 T5 Z* m) ]; C" ~( A: i7 @5 O
1 隐式加载例子8 }3 k  b* e+ L

% ?( [4 \4 p: |0 X    该例子需要以下支持文件:" K  t, I9 s$ a+ `1 A

4 H' R8 s! k* H* I& r) S    (1)头文件lu32.h。
- N+ g; O; R  M% Q0 e! d    (2)导入库lu32.lib及mlu32.lib。7 n3 E6 r+ S+ i; @
    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h># R- Q" z; z2 ]/ o# b9 t4 Q
  2. #include <iostream>
    - M9 E1 _+ E" A6 F! {' R
  3. #include "lu32.h"                        //Lu头文件
    ' J0 L( f, c5 [% p8 B- ^8 Y
  4. #pragma comment( lib, "lu32.lib" )8 ?6 G" L# V* |  z* X+ G+ O. u
  5. #pragma comment( lib, "mlu32.lib" )
    / y- Q# M: l2 x' d! N+ S% h
  6. using namespace std;: {, U" U+ d; I1 J3 R# w
  7. void main(void)+ K; g4 p5 j8 j1 f
  8. {2 i  h  F+ c$ l* B3 O
  9.         void *hModule;                //模块句柄4 K& X$ K, j! t' K% H% K
  10.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置# `, Y1 y& E" W( O3 R- ?
  11.         int i;                        //错误代码
    & S1 i# I, F& G% v; k( |
  12.         void *hFor;                //表达式句柄0 Y% @! b, P3 M0 M, |
  13.         luVOID nModule=0;                //表达式所在模块3 u! W; C3 d/ ^& P2 r" m3 O
  14.         void *vPara;                //存放输入自变量的数组指针# N- \) ~; z  t
  15.         LuData *pPara;                //存放输入自变量的数组指针7 v1 ?0 J2 K1 M* p$ `) G
  16.         luINT nPara;                //存放表达式的自变量个数
    0 y+ u0 e3 C6 c
  17.         LuData Val;                //存放表达式的值" }4 U. |. {$ X) i( v# T. d
  18.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序$ x' s9 K! V: `
  19.         if(!InitMLu()) return;        //初始化MLu
      {# n' F! i- S# l
  20.         if(!UseLu(2))                //申请使用Lu资源7 l8 e" b* q- h) L7 Q8 u3 E% M
  21.         {
    ! R6 x5 n6 l, {  q+ h& |
  22.                 i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序& W1 m' A8 e$ J: a# x
  23.                 if(i)4 w: t6 N% `, F& z  _. R
  24.                 {
    ) W' n3 T' b) S
  25.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
    2 ?( M/ a9 U1 _0 V, f
  26.                 }
    ! M* l- _4 W& K9 M% }
  27.                 else
    ; A9 L6 b6 a0 X5 g7 H, @7 T
  28.                 {! W6 ^, t) r5 x: S: @) y
  29.                         if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数+ W6 Q- z0 I0 [0 V, B( k
  30.                         {
    0 V2 x; C7 b, o4 X% [. f
  31.                                 pPara=(LuData *)vPara;
    8 `  j  ]/ r7 {- X4 d( }1 q5 m) t
  32.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    ; G! f9 a. H5 P* G% L
  33.                                 {1 y/ X2 @+ N+ W9 c( i1 d
  34.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;( x8 y4 X* Q& _" d) h; F9 d
  35.                                 }
    # A+ i, `) S4 L) I' O! E/ T
  36.                                 Val=LuCal(hFor,pPara);        //计算表达式的值7 P" y$ ?) _  u, x0 d  [
  37.                                 cout<<Val.x<<endl;  N2 I; f1 g6 e8 Z5 \1 G; L) I
  38.                         }
    . i* T5 B8 v% J9 p4 W! S' Z
  39.                         else
    9 V& |* e, W( W, a& x( L1 z
  40.                         {
    $ s4 W  q5 V2 w2 j, ~
  41.                                 cout<<"找不到指定的函数!"<<endl;
    2 ~3 j& |  N! _' ^
  42.                         }
    , Q. z1 @) v! V  H( o  u8 n6 A' |; W
  43.                 }
      p( ]& j6 V# ^1 Z* w/ Q9 D( t
  44.                 UseLu(0);                //归还Lu的使用权
    6 y% Z% a# e) q' U% Z8 y
  45.         }
    $ u) M- |) g6 X' R9 a( R
  46.         FreeMLu();                //释放MLu
    0 N2 ^2 Z& }6 ]3 v& X) B
  47. }
复制代码
结果:
  1. 3
    2 x! ]1 |; t8 U6 h) Q$ _
  2. 请按任意键继续. . .
复制代码
2 显式加载例子. d7 q. s0 M: e4 T% K$ Q9 V* i

# n+ q  J) h; ?2 H    该例子需要以下支持文件:
% X6 V" r3 Y3 l  P- x5 Z* ]% v7 M2 i% f2 ], J0 c
    (1)头文件lu32.h。
% Z2 l4 h7 M, i% y4 A    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。
  1. #include <windows.h>$ Z# O$ \8 `0 `5 Z3 n4 e
  2. #include <iostream>+ T  k' n) Z/ I" C
  3. #include "Lu32.h"
    # g( H) V: ]3 C8 N# h5 P: W# p
  4. using namespace std;
    ( Q3 [* P: Z8 u# t! x# R9 u% F- J' _6 Q
  5. HINSTANCE hMLu=NULL;        //动态库MLu32.dll的句柄
    4 I. L; r- u. f- a, `& X
  6. 2 C) z$ N0 r, t
  7. //MLu输出函数, @: _# R- C% x
  8. mluInitMLu pInitMLu;
    * C2 h- w/ }+ T& F
  9. mluFreeMLu pFreeMLu;0 L4 D* v3 p4 c! h- U. t
  10. mluGetLuProc pGetLuProc;. {! i" }) E" }: K. r% b% D0 s
  11. mluUseLu pUseLu;
    8 O. b. V- ^" b+ P; S. S5 E
  12. mluComModule pComModule;
    5 `) j1 m. p2 o1 p
  13. //Lu输出函数& j7 f2 H6 T; e
  14. luGetFor pGetFor;/ Q# Q1 Z0 z0 F' _$ z  z$ w  J1 @
  15. luLuCal pLuCal;8 @- b. t- f5 Z$ L: Y" f
  16. bool theInitMLu(void)        //初始化MLu/ g) |( ?3 o& h+ z% m# R- i
  17. {
    . C- h4 P) e- p, k# j; X# p
  18.         hMLu=LoadLibrary(L"MLu32.dll");        //加载动态库MLu32.dll; q% M* D5 J5 t, s; l) L
  19.         if(!hMLu)/ u% E7 M. \6 w: j! R0 b- R/ j) N) v
  20.         {
    * ^. c- @$ t6 @: g
  21.                 cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
    2 d/ A6 G% k1 L5 w
  22.                 return false;
    # d* n2 e8 y6 k- Q
  23.         }' W! a/ `0 X3 h2 q
  24.         //以下几个语句获取MLu32.dll的输出函数
    , I2 b: M9 H, Y
  25.         pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");! f: k: H4 T) F2 F6 m
  26.         pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
    : f' v0 c9 a7 |% i: A, K
  27.         pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");+ K3 a6 Y  L4 U7 Z6 A0 d5 ]
  28.         pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
    * d- W( R$ l8 w  [6 m( F
  29.         pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");: |6 D& |: T' k( e
  30.         if(!pInitMLu())        //初始化MLu32.dll
    # s; N$ n% Y/ m' G' C" @
  31.         {" S9 ~+ r+ I+ r' D( J! ~
  32.                 FreeLibrary(hMLu);        //释放动态库7 I1 g/ Z  g4 p) x
  33.                 cout<<"MLu初始化失败!";
      g6 ?3 H% l1 q6 U( e7 ^2 m9 _6 N* }
  34.                 return false;
    + P9 h+ o0 `) a* \" M% o
  35.         }
    & g+ u, y  C! y7 }
  36.         //以下几个语句获取Lu32.dll的输出函数# M( S  g# R+ t$ q# C# W  n+ S
  37.         pGetFor=(luGetFor) pGetLuProc("GetFor");7 T7 g* n- _9 z& G
  38.         pLuCal=(luLuCal) pGetLuProc("LuCal");+ W3 F! q5 h( I; U! ^1 y
  39.         return true;
    8 g$ A) q6 ^2 W( R. s' W; D& q' |
  40. }7 _$ J& }) s6 Z
  41. void theFreeMLu(void)        //释放MLu
    + L2 n; t% H6 H( ]% u1 W% w3 T
  42. {) k& g1 r2 [4 j8 B% W
  43.         pFreeMLu();        //释放MLu申请的空间
    ( }( X: N/ N9 p2 F0 Z
  44.         FreeLibrary(hMLu);        //释放动态库
    + h5 y; ~% y8 h7 L9 S% @
  45. }
    5 I  q) \0 L9 |6 l
  46. void main(void)
    8 c! }3 T5 k* O% I( u# C
  47. {
    ' l3 [8 @% M; B+ g
  48.         void *hModule;                //模块句柄
    9 ~) ]5 P, }9 s; H
  49.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置* ?4 h- I" B$ r) U) y9 C+ V
  50.         int i;                        //错误代码
    % m" v* t1 K* y* Z% V6 o3 b
  51.         void *hFor;                //表达式句柄
    - u% ?1 U% E* q8 e' Y. ~- Y
  52.         luVOID nModule=0;                //表达式所在模块
    1 c; r, _2 |! l1 t
  53.         void *vPara;                //存放输入自变量的数组指针
    / o# \9 }  y3 a! p8 e; C; N
  54.         LuData *pPara;                //存放输入自变量的数组指针
    2 e1 a: V: f0 A& Y
  55.         luINT nPara;                //存放表达式的自变量个数
    : \+ _9 ]( W4 ?
  56.         LuData Val;                //存放表达式的值$ g( L! ^- y' @5 ^
  57.         wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序* d+ ?, j0 r% k' ?- H
  58.         if(!theInitMLu()) return;        //初始化MLu, M" ~2 G% N* B: L
  59.         if(!pUseLu(2))                //申请使用Lu资源
    2 |5 |$ f0 G9 s+ j1 K% |
  60.         {
    ! k/ G" b4 E" B) _& b
  61.                 i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
    4 U9 l1 Q! v* }$ ]& k
  62.                 if(i)
    3 N# x- z7 i, ^8 _! `
  63.                 {% q4 Q2 U+ y$ J: l1 o" w+ Z) J5 P
  64.                         cout<<"Lu源程序有错误!错误代码:"<<i<<endl;. C( D) ]  H; t- ^* [
  65.                 }
    3 P% J) k* [* D( u  Z
  66.                 else
    2 O+ b# _( E) Z
  67.                 {. l, T  g9 f# w  b7 C
  68.                         if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))$ d: v, x4 T" h6 V
  69.                         {$ J: z/ Z! E$ v' |- h+ I5 K3 \/ f8 h
  70.                                 pPara=(LuData *)vPara;: j8 m: x' \" g7 W
  71.                                 for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
    # g" I3 o0 [! D" S
  72.                                 {: I1 q! r" e7 q2 y2 ^
  73.                                         pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;  C& d" h' X, d
  74.                                 }
    , c1 E0 Z" u9 @9 T
  75.                                 Val=pLuCal(hFor,pPara);        //计算表达式的值7 ^3 G, Z. T3 ^0 N
  76.                                 cout<<Val.x<<endl;
    ; t9 @8 t+ e* o& s
  77.                         }: u! R4 H3 {% c% C; ]! H
  78.                         else
    & x8 B" U: M- L1 T' v+ j1 N
  79.                         {$ T5 |& P% w8 ]0 r# X8 |  \
  80.                                 cout<<"找不到指定的函数!"<<endl;
    # m3 ]8 }; R5 a$ M* f: ~& t
  81.                         }
    : w0 s& i, m2 v; x
  82.                 }6 c' y, t; f+ U' R& J
  83.                 pUseLu(0);        //归还Lu的使用权* l1 h8 ?' ^- u! l
  84.         }% k# U/ r/ W2 y, h
  85.         theFreeMLu();                //释放MLu% v! W: E& a; o+ z, U' G7 q
  86. }
复制代码
结果:
  1. 3
    5 H. o* h# [9 P$ e5 r2 F  C
  2. 请按任意键继续. . .
复制代码





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