数学建模社区-数学中国
标题:
C/C++调用MLu的入门程序
[打印本页]
作者:
forcal
时间:
2011-10-30 20:17
标题:
C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
+ q+ [- d( C4 O+ D/ \, g+ \
MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
( _; |9 Z0 ^. G% C" g; J
. o1 V5 I; @2 Q! ]8 `: d
1 隐式加载例子
/ O' d/ `4 ~) Z# I/ Z7 L0 b
4 x8 d* s: r6 x4 c
该例子需要以下支持文件:
( [, m% _+ U/ ]2 O/ Q. | m; }3 X
/ E- F5 M2 @2 d1 x6 `6 z6 m
(1)头文件lu32.h。
; _( {% \) @" C' |% x
(2)导入库lu32.lib及mlu32.lib。
( E* a( ?; E% R3 [ G
(3)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
z' i4 X+ r* ~) k
#include <iostream>
5 k# o: H# F2 j. M
#include "lu32.h" //Lu头文件
: z7 x, J- h$ d* ?7 t2 j7 U8 a
#pragma comment( lib, "lu32.lib" )
7 x( S& |; o* L) \3 o
#pragma comment( lib, "mlu32.lib" )
3 E$ v/ B3 z# L# y+ h# R
using namespace std;
5 s+ e; h( ?0 [
void main(void)
; H# n. M5 J: @0 Z7 d
{
; C% M0 U5 Y$ U, z( ^# R5 W6 ~
void *hModule; //模块句柄
' E; v m5 @* E2 c6 I
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
9 `" Q9 D z5 m( D; z- y
int i; //错误代码
* J; T% N8 k) }# i
void *hFor; //表达式句柄
4 x, M; w/ C; ~+ J) u* Y; C
luVOID nModule=0; //表达式所在模块
* R4 {( k; C' P3 U9 ?
void *vPara; //存放输入自变量的数组指针
3 A% }( _3 w/ b( I
LuData *pPara; //存放输入自变量的数组指针
7 O9 A) [$ \! v" b2 B
luINT nPara; //存放表达式的自变量个数
' p* @* ?3 Z; _, r
LuData Val; //存放表达式的值
$ X- P) F( ?* }7 G# P
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
4 }; Q3 W( N3 x. Z
if(!InitMLu()) return; //初始化MLu
1 O" q& M+ q( M
if(!UseLu(2)) //申请使用Lu资源
5 M' q$ a% u( y2 @" U: |( L
{
+ R8 M" H! h" ?* v4 ~. D9 ]
i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
7 _+ A3 I9 z7 x9 W$ N
if(i)
3 `; m# _, [* y! X& ] ^6 C2 P
{
' n; f3 h! u& J+ o
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
5 ?! b+ e. k$ Q2 g
}
& B( i" r) h/ I' U2 n; i) ]8 o
else
$ E9 S6 L2 H( l. b) i
{
1 g" L; l/ g2 M. ~
if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara)) //查找全局函数
. h/ \# j* D- `4 x8 S
{
" ^ k Y! D0 V3 |3 d. P3 H; f7 A
pPara=(LuData *)vPara;
: G7 p) [- v7 _5 E# Z
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
9 J+ j) O# Z Q5 z. d g
{
% ~/ x/ {* _ v _" _
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
, q8 L& w0 ^5 J0 x6 }' |+ _
}
& \( j% u( ?# m2 i* @4 L
Val=LuCal(hFor,pPara); //计算表达式的值
6 M/ S% x5 L2 F2 K: B* K
cout<<Val.x<<endl;
. W; e0 `1 q. ]$ [
}
0 E' I5 F1 h5 U
else
0 g4 S$ U2 O* ^$ U% K/ q% X3 c
{
% h! E% N# ]. t/ z n4 |
cout<<"找不到指定的函数!"<<endl;
6 Q+ E1 r( p% p5 x$ N! F1 f' z
}
4 d7 z+ |0 ~* [( l. @( {/ b) Y( a
}
& j' @& Z7 ?' v; t$ Z/ A8 X6 g! t
UseLu(0); //归还Lu的使用权
`( W6 s% H1 q& v& g7 u
}
" G, I7 g$ _5 q
FreeMLu(); //释放MLu
7 R! x4 ~$ P" M+ G, ~
}
复制代码
结果:
3
- L7 d5 h+ }( f# J* o' m! y
请按任意键继续. . .
复制代码
2 显式加载例子
/ F# b( ?# G% Y% w# ^& a
' D5 l8 x: K( x4 |( C) |- A: Z
该例子需要以下支持文件:
- U( c+ |$ V( J) B
% s5 |( A$ \; Y: ^8 \" E1 i* X- l- B
(1)头文件lu32.h。
4 s9 z6 F9 t" T. }; g: U% ]
(2)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
. Z$ Z& l% M8 U: L4 @* n
#include <iostream>
6 a. ~* V* M6 i, o/ T! I
#include "Lu32.h"
' L$ T) A* s2 x3 C
using namespace std;
. V- Y6 d$ P- b8 r
HINSTANCE hMLu=NULL; //动态库MLu32.dll的句柄
7 Y+ w+ I- h' j" I8 T9 b: n% d
( l: X" V( o! A9 S
//MLu输出函数
6 v) T9 F4 Z5 r1 W% w8 ~
mluInitMLu pInitMLu;
2 g8 { k8 w) R' N4 F( U% h. w
mluFreeMLu pFreeMLu;
3 D2 \9 x W" p
mluGetLuProc pGetLuProc;
. w8 r2 y5 J. M
mluUseLu pUseLu;
( W" Z6 ~6 }: `/ X ^: U
mluComModule pComModule;
' E% _5 W9 H/ @" T9 D" J, d
//Lu输出函数
* v$ d& o2 G9 |& `
luGetFor pGetFor;
Q; T6 K- o/ O* T4 a, w2 Z j
luLuCal pLuCal;
; m' E: s4 Z y. u8 G1 C& d" T4 X
bool theInitMLu(void) //初始化MLu
: s: y" |8 l- r0 X0 n8 r4 u2 q
{
5 c; r0 B2 k$ v- e, C* O$ P/ }
hMLu=LoadLibrary(L"MLu32.dll"); //加载动态库MLu32.dll
0 G4 _; g D$ f& M I: R
if(!hMLu)
9 \( B s1 c) a$ v! n9 z
{
0 u) `% o& K9 [; w7 f. |
cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
* H, Y; M8 v: H- y8 w% e
return false;
! E5 A; E3 P4 J7 [8 V
}
/ V; z, z( v( T6 U# }
//以下几个语句获取MLu32.dll的输出函数
7 Y0 b5 z9 a0 z/ r
pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");
& W e8 t, A- @. l1 m
pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
' k; y$ g: l3 q- [
pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
0 [/ X* f1 G- X
pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
( b( Q/ {' t+ Q2 S" r' r/ S
pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
# q7 J2 d5 d M/ m: q/ a
if(!pInitMLu()) //初始化MLu32.dll
4 A& W" }$ Z$ ~ d) Q) H
{
( z6 A$ j& E" k4 F
FreeLibrary(hMLu); //释放动态库
3 f/ A: P6 O8 p) b- s& b" v2 y
cout<<"MLu初始化失败!";
# Z x$ {! L9 s$ n; b
return false;
! ]6 L" \# N" L! Y0 U$ {/ t' @
}
! ]- R$ f0 f9 g# q9 c6 ~/ y
//以下几个语句获取Lu32.dll的输出函数
- b5 G r. g$ w# {
pGetFor=(luGetFor) pGetLuProc("GetFor");
. b, M& e2 a" }
pLuCal=(luLuCal) pGetLuProc("LuCal");
0 ]1 s! p7 x o) M
return true;
$ k( V8 G- y/ a# P4 A
}
8 s) O+ u6 P0 _9 h# k
void theFreeMLu(void) //释放MLu
3 w$ R" ?5 w5 Y
{
; K4 ~& P: F* |; m) {9 W4 v: c
pFreeMLu(); //释放MLu申请的空间
9 Z. A3 p# ~7 F' y l3 O
FreeLibrary(hMLu); //释放动态库
/ k! k9 k: x7 [2 N
}
( _% Q7 `' W/ B+ H
void main(void)
/ Z; `6 K+ T7 [! W+ M! f
{
3 ?. i5 z4 ?7 N& B; M) ^
void *hModule; //模块句柄
# k& P. F( g0 B+ D2 z- t
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
$ a4 c; v3 [ ~2 z0 b7 M
int i; //错误代码
! f, ?" u; e) Z- @% |
void *hFor; //表达式句柄
5 g9 D5 x4 B) [
luVOID nModule=0; //表达式所在模块
: X3 ?, h9 k6 |
void *vPara; //存放输入自变量的数组指针
# p1 O! n' ?0 p. ^- ~9 a4 |
LuData *pPara; //存放输入自变量的数组指针
, @+ _/ A& i. H
luINT nPara; //存放表达式的自变量个数
+ `" V+ K* [$ h: O8 i! Z# |4 Z
LuData Val; //存放表达式的值
, h5 i) l' n' s! V4 V6 Y
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
7 }8 k2 D+ g% I: u
if(!theInitMLu()) return; //初始化MLu
# u1 w1 A2 X( y/ |
if(!pUseLu(2)) //申请使用Lu资源
$ k+ u) x- p* ]
{
6 v1 ?2 G2 G) x; k
i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
6 i# p7 Q3 _% e
if(i)
9 l: J8 B5 S* O' L# c
{
! k* V5 H% S' R
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
$ h+ r2 c2 D3 B4 O) Q' ~& b
}
[6 ^3 G/ V& D9 ]4 @
else
" O7 ~5 p( s% f1 O4 V
{
& W' e4 U9 n, s8 p, z: }
if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
y9 F0 x* I2 {7 I& m: K
{
U6 o! m @7 ~/ f, p+ A
pPara=(LuData *)vPara;
% E9 j# ^! G4 \ p& N+ }; D( Q# y
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
; @& i# u+ l c
{
" j& P- V% [4 V, @9 {5 v* E; y
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
% \1 h8 T8 [# F8 H i4 ? I
}
; o) D" j0 W" I
Val=pLuCal(hFor,pPara); //计算表达式的值
6 @& O5 ~* e$ m, {
cout<<Val.x<<endl;
_; G9 _+ l# Z
}
) U6 F2 B9 i: H: t
else
- H' ]5 C q8 _2 I3 o% Z4 |8 Y
{
2 r3 B7 H& T& n1 x. x
cout<<"找不到指定的函数!"<<endl;
# G( N( F" J6 t8 C, R, ?/ `! I5 X+ N
}
- {3 X# U w# w9 n2 x& c; c. h) i
}
' L/ g* j2 e! W7 U" y. M7 [
pUseLu(0); //归还Lu的使用权
' T( Q& h: L7 G: M
}
7 p8 ^0 d# y6 ^- ^1 Z, `1 a6 n! a+ m
theFreeMLu(); //释放MLu
: O1 E$ F9 u* ?% A. Y& L* o
}
复制代码
结果:
3
$ C- \ N J0 a+ u- r
请按任意键继续. . .
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5