数学建模社区-数学中国
标题:
C/C++调用MLu的入门程序
[打印本页]
作者:
forcal
时间:
2011-10-30 20:17
标题:
C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
# K! W9 k" E# U* `) `, t8 j5 ?
MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
8 f* E, q3 Y8 y, \' l) r
+ K* f6 l$ O3 I) Q/ _
1 隐式加载例子
. {3 i3 m* A" h: n k0 _" j; X3 r
" u8 j& C9 L: N+ h, X* ?
该例子需要以下支持文件:
( P$ g% B+ f8 {) {$ |& p. D
" ~0 i* {3 W. V2 T- q, e" p
(1)头文件lu32.h。
% c8 \! Q7 t3 y* d }5 g
(2)导入库lu32.lib及mlu32.lib。
) m+ Y$ L# Y# f) e2 X
(3)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
8 \9 t0 H! k) `4 `
#include <iostream>
g2 J: l. `+ ?# s* s
#include "lu32.h" //Lu头文件
- z" f. o; Q( Z" j( Y U
#pragma comment( lib, "lu32.lib" )
' Z! T- |0 O" \" F* h
#pragma comment( lib, "mlu32.lib" )
& p& E8 S9 K, M6 J, z ~; h
using namespace std;
0 S. o+ \) w% Y% ]+ H
void main(void)
9 V, [, m' o( I, n% ^0 y7 J
{
& s: V3 \7 B/ z: d& e! k( M7 _
void *hModule; //模块句柄
- C0 ^ U' {2 Q: |; h( U N# p
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
9 v( m! k$ r2 l
int i; //错误代码
J! s8 E1 M3 \& P2 Y Z ]
void *hFor; //表达式句柄
4 J7 x/ ~/ P1 X2 P$ s3 y6 j8 W
luVOID nModule=0; //表达式所在模块
" ]+ }6 [! B6 F: p; r* _9 W
void *vPara; //存放输入自变量的数组指针
* q( I) |# |! D9 H/ O8 Q% y9 v6 |
LuData *pPara; //存放输入自变量的数组指针
4 ]: A* y# @4 o+ \
luINT nPara; //存放表达式的自变量个数
% n" U6 b) i- M& R
LuData Val; //存放表达式的值
$ P' u1 L" b* U& G+ n
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
( [1 i ^+ \3 H6 }" k
if(!InitMLu()) return; //初始化MLu
( u+ N+ ]2 w/ v0 [/ N
if(!UseLu(2)) //申请使用Lu资源
, S9 y1 M( u4 f2 _$ A0 S
{
6 |' S8 V& r$ s; y
i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
* J& L3 }6 ^ F* P U8 l3 W
if(i)
) f- z2 H7 u% I& y- r; f
{
3 W) S! n( n$ z @
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
; `, y3 H9 s+ G+ R
}
" g. X& \) L0 C9 e7 W
else
8 Q' y4 o/ L% [$ v) {
{
9 w1 M8 [; H; Y* P; k% Y+ R
if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara)) //查找全局函数
8 z' d7 _# a7 h6 u8 M# x1 v
{
6 A; V$ x; o' _- P8 U" L
pPara=(LuData *)vPara;
7 ~1 r7 o& }% w; }
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
; y& x& @7 |& f4 U8 {: L6 d
{
. _3 F5 m: e0 E# U0 b8 m. E
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
* y, D0 n; J; W. U4 v5 Y
}
# K, d3 l' ^7 f2 G) J8 ]) y
Val=LuCal(hFor,pPara); //计算表达式的值
0 s" \6 g* H: z# g8 H U: B4 t
cout<<Val.x<<endl;
" _2 ^7 b b: ~ j4 x! ~0 t6 r
}
" l- p4 W; I3 P u1 _
else
: H% q. h: q# Z9 L
{
; S# F2 v, W) X7 ^5 h5 D1 L
cout<<"找不到指定的函数!"<<endl;
& W3 R! T' L+ M% w: Q2 H* _
}
: w0 N, A6 {) I% v+ y9 D6 {
}
4 ]9 A- m5 K" H* q# M, |# e
UseLu(0); //归还Lu的使用权
8 U5 D# G& c" G; T1 ^9 K
}
9 @+ A* i, p% s% i
FreeMLu(); //释放MLu
& m( d. y6 d5 k6 C
}
复制代码
结果:
3
" I/ W/ n" _. M6 @! b; M: R' H
请按任意键继续. . .
复制代码
2 显式加载例子
, G8 D5 p" i; d1 s
/ w! D% P! _8 l! S, Y( M* }
该例子需要以下支持文件:
. O% X( h T% P1 @" {7 h
3 a/ o `& Y' ^) `$ E. |
(1)头文件lu32.h。
$ t @2 E. o; [" ?" k. G3 U, @
(2)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
; P6 L: s I" C9 }" n# M
#include <iostream>
7 X: V8 e; d0 B5 I& U
#include "Lu32.h"
3 f0 _5 j* V& s+ ]: Y) [
using namespace std;
# ~0 H1 G( ^) F3 O4 a% Z
HINSTANCE hMLu=NULL; //动态库MLu32.dll的句柄
9 f# N$ L: \, ?# D& d6 ^
- _" P! Y3 H/ W0 z5 u9 }, l5 c
//MLu输出函数
. n% B! K6 O; m
mluInitMLu pInitMLu;
5 H& |6 k* D6 f2 T* N" Q8 M
mluFreeMLu pFreeMLu;
3 F+ k& i$ x r/ V: h
mluGetLuProc pGetLuProc;
# m( B' J" ]2 ?/ a
mluUseLu pUseLu;
0 i; K: v7 p/ m. H0 G
mluComModule pComModule;
. r: d7 u3 J# c& s2 o' m5 q, v; g
//Lu输出函数
* I$ u7 |. X+ X7 c3 R
luGetFor pGetFor;
* F- y' M: {4 m; `. D
luLuCal pLuCal;
+ Z5 a$ U! G. s2 q" g2 q I9 K
bool theInitMLu(void) //初始化MLu
0 i: l/ q3 J1 @: Y0 S" Z
{
0 _! K2 ]* E5 }# c
hMLu=LoadLibrary(L"MLu32.dll"); //加载动态库MLu32.dll
- n0 v4 j7 n7 @4 O- N
if(!hMLu)
, Q6 e! N; I8 c6 S9 \6 E
{
1 L1 b# f, j! G2 |/ u$ [0 p( o
cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
- D' V. a5 H$ l2 \% h5 d
return false;
& E$ K& v/ t3 U% H
}
6 I# c+ `( B) {! o1 @
//以下几个语句获取MLu32.dll的输出函数
9 G- \* k$ f8 v* M7 @
pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");
) Z, u. Z' t5 D$ H
pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
$ D" v6 _/ a! k( w& n) u; m0 N
pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
0 E( |: K1 a9 w$ _6 N9 G6 l0 M
pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
9 @, C7 ~7 a% b" P. V
pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
8 [) _9 ?7 W; p: q' k
if(!pInitMLu()) //初始化MLu32.dll
# M e* d3 |: k
{
0 V# h# t/ z7 p# L' O
FreeLibrary(hMLu); //释放动态库
8 K. @ @6 Y" d
cout<<"MLu初始化失败!";
8 J9 I+ Z3 y8 r' k9 K1 ]. t3 Q* ]
return false;
3 t3 S5 e$ l" P% L
}
$ n/ p# j. y1 C6 t H; x
//以下几个语句获取Lu32.dll的输出函数
/ T* d8 Q/ Q( C6 p1 F, N2 D
pGetFor=(luGetFor) pGetLuProc("GetFor");
/ X% B( ?+ o& N3 q3 W. S2 M6 `' r }
pLuCal=(luLuCal) pGetLuProc("LuCal");
( J. R" V% ~( i' y' T
return true;
) y% N7 L# n" g1 n# m* l
}
# d+ o# n& f1 K9 q
void theFreeMLu(void) //释放MLu
' m" P+ N# e9 f4 S# i& q% K( Z
{
$ z0 ?4 ^6 }, x w( _2 S6 D
pFreeMLu(); //释放MLu申请的空间
9 @; \. q9 J/ F- v8 Y( _
FreeLibrary(hMLu); //释放动态库
+ B% M. z4 `3 y' P+ K# l
}
! E5 r3 _+ \3 L$ u7 k& J6 D. a' ~
void main(void)
+ d" C( D5 ~/ o2 X$ g2 f/ f- L( x) M
{
+ y$ s. A' h6 {6 f
void *hModule; //模块句柄
4 G7 R, w' g! h
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
: ?7 q0 W# s8 p
int i; //错误代码
7 w# M/ S3 X" o+ E0 p9 K' i
void *hFor; //表达式句柄
1 x2 Q8 D6 Z8 _! ~' ~5 r
luVOID nModule=0; //表达式所在模块
8 s/ M" t. i: ?3 e/ L
void *vPara; //存放输入自变量的数组指针
% Y- y) ^# [7 D
LuData *pPara; //存放输入自变量的数组指针
7 J* m3 J! e" N$ Q0 t
luINT nPara; //存放表达式的自变量个数
9 f$ ~/ K* T9 m; Z6 k) `. M
LuData Val; //存放表达式的值
; x/ A1 g" v: ^# A p0 F; i x6 N
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
. b8 x% Q% x4 S2 l8 W; ?
if(!theInitMLu()) return; //初始化MLu
+ U. u- w7 P/ ?5 ]2 G. Z
if(!pUseLu(2)) //申请使用Lu资源
) B$ M/ g8 U7 b" M
{
" s5 ^$ k- `" `; s6 _% |# C
i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
0 R9 S1 _1 @9 T
if(i)
6 ^4 U, Z2 t; _* I* u% C
{
. E0 ]/ e, v" \8 O9 R0 t& {& k2 I5 ? Y
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
3 \+ Z; K& |3 p" J; U. w5 i: L0 q
}
- Q9 l8 ^, \9 E8 E4 u) H
else
* t0 ^0 ~. p) ]0 E9 @
{
: R) j p$ m( ^
if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
0 ` Z3 W& A0 \( y6 d
{
3 C3 \6 o; u2 D M
pPara=(LuData *)vPara;
) r+ J) B* a; I6 ^1 i+ ? V! X
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
" z" z* N# X$ V8 n& C# M
{
( [& y7 v6 n' }# S8 [
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
% _9 B( C" T+ N; _
}
! A3 m( O" k# |8 C7 f$ x" }" X$ n% \
Val=pLuCal(hFor,pPara); //计算表达式的值
! p' L5 Y2 m* s4 z2 @: j$ c
cout<<Val.x<<endl;
1 Z* b A* Y$ z9 f2 z# t' e
}
) ?' z( ]8 o! n4 k
else
! e5 R* h, X& O. i
{
2 T q+ m/ B; P) ^1 I
cout<<"找不到指定的函数!"<<endl;
3 D* y& P: X5 C2 r
}
9 I5 a, E* ]* }4 x& W
}
, x$ L; K; G* o* {9 t, H
pUseLu(0); //归还Lu的使用权
1 B# @& [8 O' Z3 I7 a
}
7 Z: S$ q9 q2 R" ? j6 T
theFreeMLu(); //释放MLu
$ ^2 ^" M( g; x; V' P
}
复制代码
结果:
3
+ J3 i& {* A2 t v# ]# _' D) B
请按任意键继续. . .
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5