数学建模社区-数学中国
标题:
C/C++调用MLu的入门程序
[打印本页]
作者:
forcal
时间:
2011-10-30 20:17
标题:
C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
& z" e6 r h1 W5 ^
MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
/ A) }( z! v# }( [/ Z: T. ]
% |+ ~% F8 R" s, v: P$ H" G
1 隐式加载例子
) d+ K0 z! M n2 O
4 N) i. V0 V. b. T; ^
该例子需要以下支持文件:
/ ]6 K7 k: y! p7 I" d
^+ @7 l3 `8 D' l, O& M
(1)头文件lu32.h。
( l/ X: h: u' ?( s
(2)导入库lu32.lib及mlu32.lib。
1 a0 }; m8 N' U: \1 X
(3)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
5 X* `$ X& a! V: ?4 E+ y
#include <iostream>
- k$ p9 ?# ?. n _' D0 d
#include "lu32.h" //Lu头文件
8 g( b# S1 N: w7 E& l1 u% R9 [
#pragma comment( lib, "lu32.lib" )
9 b( P5 r; f2 s/ w+ r
#pragma comment( lib, "mlu32.lib" )
9 ] A5 i/ v y# [! o- {/ ~+ D: f
using namespace std;
8 X7 f( P4 S3 J1 o. s3 ~ Q
void main(void)
; E. N9 `3 ^! H
{
$ E* H( D5 y( B2 E
void *hModule; //模块句柄
$ H$ T& k# ]! I9 E! [
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
- Q/ \' }1 R) w" p3 @3 I; {; n
int i; //错误代码
! Y* G: m/ {8 V" p4 z6 _
void *hFor; //表达式句柄
k$ r- `: K# W6 B1 d
luVOID nModule=0; //表达式所在模块
& O+ p& E0 ^- W$ Z2 l( J
void *vPara; //存放输入自变量的数组指针
+ v# R- t7 h# G
LuData *pPara; //存放输入自变量的数组指针
+ Q, _1 x$ h0 y" t6 S
luINT nPara; //存放表达式的自变量个数
; u0 u1 N. Z& N3 c) @4 c( ?' S
LuData Val; //存放表达式的值
- _" R8 F: e( |0 f7 v; p) f
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
# m) H+ ` C! E" p% B
if(!InitMLu()) return; //初始化MLu
, } O: }1 r: d: L! d
if(!UseLu(2)) //申请使用Lu资源
5 y o7 G1 b6 T
{
j) C9 D+ [9 n" e# K; L7 u- F9 q- u
i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
: M+ E. E5 V% A2 A; `8 @5 u
if(i)
: X- m5 |2 q4 B: j9 }
{
) i% u! Q' i- s) H# Q; M% z; o2 H5 h
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
$ V6 ?4 M1 m+ N) L. g
}
0 c8 V% _9 ?/ S1 O# P c
else
* |" p% k$ V1 u% F
{
3 U( S: t* g; s$ P$ m+ T- [( r
if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara)) //查找全局函数
* m7 I, x* f+ Q! J% |6 _, H
{
, A( ~$ y( l9 F5 C% \' Y1 G
pPara=(LuData *)vPara;
4 b3 b- ?+ Q# F! L% L1 e) `- l
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
7 R/ P- H5 k# @( x/ m. L
{
7 G& Z' t4 {# y1 t8 V
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
, ~. y4 N- Q* _ t) z
}
7 \0 \/ q! U. G- p! |
Val=LuCal(hFor,pPara); //计算表达式的值
; e- A/ Q' ~5 V+ r* L/ ]( j7 e6 Y
cout<<Val.x<<endl;
( H6 ^* ~) U6 W) k+ a+ c1 `
}
! ]2 i: m! l6 ~1 \
else
$ u3 [/ t" c1 _5 a! ?* p* ~
{
2 }* H; y/ t, H. ?& ]
cout<<"找不到指定的函数!"<<endl;
/ v3 e$ S0 @, a& R, ~
}
9 g3 F4 U4 k8 Y3 n! o0 a
}
* \& m- i& k! M7 [ u: v
UseLu(0); //归还Lu的使用权
( b, k/ V/ k% R; _+ ^
}
8 v) h$ H+ S2 S* U8 f8 V
FreeMLu(); //释放MLu
. w2 \9 ]# k% U8 k
}
复制代码
结果:
3
% ?* y l) z, b( [; d; G6 C8 M* V6 m
请按任意键继续. . .
复制代码
2 显式加载例子
- d% n1 E( V# A o% R* X4 q7 L3 t
/ \: R& J" L9 e1 y& p/ r: _
该例子需要以下支持文件:
- Z: k3 \) B i7 y7 k' j
' x. L3 `4 M/ e/ g3 [8 W8 C
(1)头文件lu32.h。
f# c3 o, u6 l% f# ?
(2)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
! A( j8 _' S$ b4 W1 R% W
#include <iostream>
8 T7 s( m4 `6 `9 K& L" y9 M
#include "Lu32.h"
( n" r/ c/ h* k a3 {7 `
using namespace std;
?3 }5 \' k0 g- R5 C1 `0 x$ [8 G
HINSTANCE hMLu=NULL; //动态库MLu32.dll的句柄
( e8 ]5 P) f+ I# E9 A
5 @- \& k- h1 T
//MLu输出函数
3 ?+ K, s! R' P3 x5 [# j, V4 @1 |3 P1 j
mluInitMLu pInitMLu;
/ l4 K( | w1 O$ }1 n1 y4 e
mluFreeMLu pFreeMLu;
' q& L/ H% m4 Q4 m
mluGetLuProc pGetLuProc;
6 C/ W4 l: o! ~ |+ p6 |7 s
mluUseLu pUseLu;
. _: J8 B( L/ i) U8 x4 o
mluComModule pComModule;
. U8 T9 P( v% I5 Z5 S
//Lu输出函数
/ K9 L9 I9 I7 R3 y! B7 G1 @+ K
luGetFor pGetFor;
7 R0 n+ M H! m* A& |$ J( g
luLuCal pLuCal;
' W# ^: s" r2 F9 Z J1 u
bool theInitMLu(void) //初始化MLu
$ L* g. e5 W( g3 N* s
{
7 f8 \/ [' ?: D: M+ U, F
hMLu=LoadLibrary(L"MLu32.dll"); //加载动态库MLu32.dll
6 M. v+ ]9 L1 z
if(!hMLu)
9 h& m. u1 F1 |8 M% r: q% b- r
{
2 o8 ?4 Q$ a8 X4 S/ p
cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
1 o V# Y/ X) u/ L2 Q
return false;
, Z' E& w% r2 a$ [8 z+ \$ S( X
}
1 T6 ?! y4 d! g: Z+ f4 Q% D
//以下几个语句获取MLu32.dll的输出函数
2 u7 m/ G9 j) m& B2 E; N$ m" Q
pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");
) B5 d4 K! C% _
pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
9 O9 x( Y; M, T, U( z* C" e8 y0 x
pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
; v9 A8 K- E4 V
pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
( P: D1 n# v5 h( N @# u: ~+ w
pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
& V1 o$ ?- K( E* H7 P5 C7 R
if(!pInitMLu()) //初始化MLu32.dll
" \* B1 Z$ V1 t' G# V& y
{
|8 e: z3 l( r1 a& K, P& _ E
FreeLibrary(hMLu); //释放动态库
' P) n! N v ^7 \( j- J
cout<<"MLu初始化失败!";
' {" P' z$ @5 f1 k! x
return false;
4 j- `) ^( t) R
}
E" z. G' X5 p/ R3 a/ c
//以下几个语句获取Lu32.dll的输出函数
$ x% n9 `+ `( T- y2 [6 g: C2 ^! S
pGetFor=(luGetFor) pGetLuProc("GetFor");
k3 q- A4 R2 T, _7 `* `7 a$ m
pLuCal=(luLuCal) pGetLuProc("LuCal");
# c* W& N; y' H/ u, c4 G
return true;
, I& k8 ]! S: V8 Z, ~7 H4 z
}
# q( M# u5 v# f% Y/ {" v9 o
void theFreeMLu(void) //释放MLu
8 \1 Q* m- ]. C% U
{
6 C: o$ D4 Z/ r! w3 l, K# Q+ U
pFreeMLu(); //释放MLu申请的空间
, F) a4 E s: A7 J
FreeLibrary(hMLu); //释放动态库
* e X0 [$ p* Y& w
}
7 F) z! M) ~# Y* c( l
void main(void)
/ A1 X) A" C, q' S* U
{
q+ y# ~ Y* K. A: B, E
void *hModule; //模块句柄
/ c, E) w: I: C- X
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
) H, c7 P) a& T' z" ^" t2 t
int i; //错误代码
0 w# \. Q& s$ J& k2 C) S0 V
void *hFor; //表达式句柄
. H" e" ]- a% G% U2 k
luVOID nModule=0; //表达式所在模块
/ g5 ]# R: d2 U6 I: k, l
void *vPara; //存放输入自变量的数组指针
h, M0 u) _* ~5 `
LuData *pPara; //存放输入自变量的数组指针
% i8 V9 G+ L: {! w C. X7 m# t' H
luINT nPara; //存放表达式的自变量个数
0 Z+ n) G8 z; Y5 `" y/ m, o
LuData Val; //存放表达式的值
( n: i6 n" s) F: S/ L: y, W& w
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
) T q& R) i' b7 T$ e. S n/ {9 u D
if(!theInitMLu()) return; //初始化MLu
: T( N; F1 P- O( H" v' T; q1 d" g
if(!pUseLu(2)) //申请使用Lu资源
: m+ y9 }9 S3 [6 C* [3 p2 m z
{
8 Z3 Y: S/ i, |3 f4 @5 f1 |
i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
8 F1 a+ z" }7 Y) E3 E7 Z6 R+ A4 |
if(i)
' [4 l9 |; p, w: S& x2 z, @- H
{
. F6 t( C0 U( c' t
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
$ `2 O3 }0 S* W' h! w4 U
}
9 Q4 @& L6 F6 g
else
1 I2 \! Z1 }4 Z; h* _+ ]
{
* c3 X* _* U( F. K& S! e
if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
$ g, I6 Y3 \- R0 K9 }
{
0 D% D' {% S/ G S
pPara=(LuData *)vPara;
5 ^) I$ t9 I s8 L/ f
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
, u# [' b: i, D$ |! c
{
6 C& |# |* j0 Z* ]1 l! @3 U
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
% x- y8 U4 D6 }/ M
}
8 K( _. |/ J' M; G4 @, Q$ A/ F. J4 J
Val=pLuCal(hFor,pPara); //计算表达式的值
+ R$ [* r/ w0 m
cout<<Val.x<<endl;
3 U1 Q) ]" a8 k/ P# x O7 `& U
}
& @6 |. G1 O" y- C
else
0 m+ w- \& I8 C
{
0 W" n" y7 }4 L0 ^ J
cout<<"找不到指定的函数!"<<endl;
7 p7 S; j, u% `0 Q, d
}
" D/ {( r) c1 w1 b
}
1 y% H% k. C3 H/ G
pUseLu(0); //归还Lu的使用权
/ X' ]2 Z0 U) e6 l- }8 P
}
0 P% N; {8 r% d% h. n
theFreeMLu(); //释放MLu
# ~4 J# t y( j K$ o
}
复制代码
结果:
3
% ?$ k7 w l9 c0 r: U0 @
请按任意键继续. . .
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5