数学建模社区-数学中国
标题:
C/C++调用MLu的入门程序
[打印本页]
作者:
forcal
时间:
2011-10-30 20:17
标题:
C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
/ j0 ]/ n. W/ o6 v1 U/ g X
MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
% D" m0 ^5 ~, Z0 ^% ?0 Y: V' m4 E' t
, j. M9 d6 k( p" s" J* ?. p8 X+ X
1 隐式加载例子
, G/ g6 G/ c8 M: w; [) U/ b
. t: a* r. x' F* l$ K9 N
该例子需要以下支持文件:
% w( f, z, W4 S# I; X, \/ Q
6 {! {# g- I' M" `
(1)头文件lu32.h。
# F* k7 n# H) \% e I6 X
(2)导入库lu32.lib及mlu32.lib。
0 O+ B/ B7 {1 _( U8 |
(3)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
' ~4 q" M r8 |0 ~
#include <iostream>
5 t, K* ~1 n0 N
#include "lu32.h" //Lu头文件
& F6 h9 C0 ~' m' T0 \- d* f+ z
#pragma comment( lib, "lu32.lib" )
$ B* I( U; ?! K0 h5 h2 i
#pragma comment( lib, "mlu32.lib" )
1 O3 f/ D- n# w/ @" X" b0 N
using namespace std;
6 k7 t9 i# u- Z4 b# `
void main(void)
. E m( D1 C6 \) m, G, s' j
{
" S' r. r, g! l/ I$ \
void *hModule; //模块句柄
; d9 U* ~, Y8 Q) G. z
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
% \# K; U6 M5 f* J# j8 Y/ O
int i; //错误代码
% y$ T4 ?( A x2 U6 A& g
void *hFor; //表达式句柄
$ L$ _. [! E2 A; p' {5 S
luVOID nModule=0; //表达式所在模块
( `) `' A: a' ` } i% B
void *vPara; //存放输入自变量的数组指针
0 N3 n* l% E0 E0 H6 d6 H
LuData *pPara; //存放输入自变量的数组指针
5 v. V5 m+ X- W# ]3 v: J4 v
luINT nPara; //存放表达式的自变量个数
2 e) U: l4 R; n6 Y
LuData Val; //存放表达式的值
. w2 _7 p/ l4 `9 a0 F/ l
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
' [- _. I4 u$ f& n8 L1 b7 n
if(!InitMLu()) return; //初始化MLu
0 N3 C4 s1 f( ?: D/ t& C9 ?% r
if(!UseLu(2)) //申请使用Lu资源
( k/ i4 e% E0 H) w
{
8 t; s7 F s) s- q1 P4 K: H
i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
% D, \3 |- o7 p( t% q
if(i)
: @ p9 ] Z7 p, x4 O& N
{
. @3 a5 }9 r+ d6 M/ g4 L8 V
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
6 y4 u t/ `' @7 u, R( i; i
}
, F' Q+ `; ]6 f* q8 d* p
else
5 v' }6 v6 a9 F& G# s% L7 K) o, k
{
6 [9 a9 ^! J1 P. ~. _- U
if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara)) //查找全局函数
! J& H7 G7 R$ Y% L0 b4 w8 @# @
{
" V% \. T# p1 T: n; b o( _3 t
pPara=(LuData *)vPara;
6 z2 N& `$ n" @: f M
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
% h% M: T) z9 ]* d0 ?9 x: u
{
( e2 A( G; W( ~9 K: F* D; V
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
3 x7 D( F- o2 b' b9 L& ]2 H- @9 ^' K
}
- t1 p/ l8 { \$ ^; m4 B& {5 T
Val=LuCal(hFor,pPara); //计算表达式的值
" W/ g, ?/ g& X8 \ e) B( t& |* ?
cout<<Val.x<<endl;
- a; v2 ^8 D0 F
}
6 P. k# B7 J# ]( R+ L$ P6 O
else
! j$ [; N1 `' Z9 ~ p0 A
{
~ j' y u$ \( m$ p) L7 W
cout<<"找不到指定的函数!"<<endl;
3 E8 B4 _( @, [/ e X* r7 r0 j
}
3 N3 ^' x8 I& V( x, X7 n
}
2 P, Y* s/ l) I( @; Z
UseLu(0); //归还Lu的使用权
+ m' U. ~" J$ {; D% M
}
% X1 a5 ?! S% z2 r; U. v0 ]
FreeMLu(); //释放MLu
6 V3 j8 N8 @6 v% F
}
复制代码
结果:
3
9 W9 }, g5 O9 m3 w: r! G
请按任意键继续. . .
复制代码
2 显式加载例子
; T7 N; C# @8 F" d# o5 j
+ ~. a. S: Q0 U" d( @+ q
该例子需要以下支持文件:
3 F6 U+ G$ _( Q+ t! _1 \; ~
* z& N3 o% F- K
(1)头文件lu32.h。
9 G1 y: P8 ~, Y# O' o/ F
(2)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
+ T' M2 M ?: T6 K
#include <iostream>
% R. q* v7 v$ W
#include "Lu32.h"
! j- a: m! K/ P$ q0 I' l) Z. w! j
using namespace std;
# a; T+ V6 T* f) v
HINSTANCE hMLu=NULL; //动态库MLu32.dll的句柄
6 N4 k* @+ l! M( h, o: I
& e& ^' @; r2 T; g% G! M6 Z! r% V
//MLu输出函数
. m8 a! T4 f' w! a( H% |4 R
mluInitMLu pInitMLu;
6 @( \- n/ U# R8 k0 `, ?+ ]
mluFreeMLu pFreeMLu;
* A U/ A3 Q6 p9 M
mluGetLuProc pGetLuProc;
. R( N+ r! y. K3 l$ E: j! I
mluUseLu pUseLu;
) b8 y5 Z0 }2 x! @. Z& d- z# ]
mluComModule pComModule;
; \. c3 ?3 E2 x9 u5 G# z" T
//Lu输出函数
% L2 d9 j6 n @5 |5 ]4 ?
luGetFor pGetFor;
# c6 `9 l* ]" P) s: b! J
luLuCal pLuCal;
7 L8 v- `: Z+ `
bool theInitMLu(void) //初始化MLu
$ Q, n; M4 L/ h2 c9 I; r+ {" Z
{
" j6 v. M3 U) A/ k$ \
hMLu=LoadLibrary(L"MLu32.dll"); //加载动态库MLu32.dll
0 R3 W% m+ o; s9 E) |4 R0 J
if(!hMLu)
1 M @+ A$ t* G& e
{
' W) }! V5 S5 n( b9 @8 n; {
cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
, N& s/ C# ~5 V3 ^/ Y
return false;
0 b5 W+ ~( Q; S( J! C0 z
}
9 F5 a0 o8 S- q: {9 A1 Q
//以下几个语句获取MLu32.dll的输出函数
1 ]& T; J' S; E8 `
pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");
# H* q5 I0 d3 G! ~1 I
pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
`$ }; }% b) s+ m
pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
! H' Z0 H: G& ?9 u# n& _
pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
* D) ?! a* z, }0 |, r
pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
/ j6 ]% Z; ~, w; k9 o6 ?
if(!pInitMLu()) //初始化MLu32.dll
* I$ _; ]& n5 f* Q& N& y# E
{
2 Q# U- |1 F8 e& a4 Q* i
FreeLibrary(hMLu); //释放动态库
; S% ]4 F+ ^" |6 o5 V- `6 s- j1 t P
cout<<"MLu初始化失败!";
R3 e7 T" X0 z$ D+ }# }
return false;
# M, B& W' y/ c n5 v* \! K4 J
}
/ L! w& Q1 T+ {# `7 t5 ^; C
//以下几个语句获取Lu32.dll的输出函数
& U; b1 e$ [# n3 R% g# w% W& o* y9 H F
pGetFor=(luGetFor) pGetLuProc("GetFor");
8 M/ Z2 g* b! q. c' z
pLuCal=(luLuCal) pGetLuProc("LuCal");
" ]* v' N+ q1 r& ?7 ^; u1 V _& m
return true;
3 L$ v: \7 H4 h$ K1 _
}
+ s; C: {% Z5 r
void theFreeMLu(void) //释放MLu
9 |/ \3 x9 P* t' `' y
{
* z, @5 x, {; q o# X' B/ e: D9 d
pFreeMLu(); //释放MLu申请的空间
# r# V" r; j4 p6 j* P% `
FreeLibrary(hMLu); //释放动态库
7 t( [3 c' g2 Y7 m" i; c' v; y
}
' d4 I( F& f7 i2 A8 H7 l
void main(void)
/ c* z% a# E% w5 N( w' U9 E
{
q% _0 q" ?# b4 J Z& W5 z
void *hModule; //模块句柄
! ?$ a5 N) n1 K" m- y
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
2 w9 v& k4 |1 }8 p+ C0 t; W% ]
int i; //错误代码
5 \0 W; b* i8 a8 k5 U
void *hFor; //表达式句柄
0 \) o: h6 u& L+ R
luVOID nModule=0; //表达式所在模块
7 S) g! B; g2 u7 ^
void *vPara; //存放输入自变量的数组指针
6 X8 l5 c& t3 l) Z( d( i
LuData *pPara; //存放输入自变量的数组指针
- _4 S" C3 K _: H- J( C
luINT nPara; //存放表达式的自变量个数
) _4 e5 T5 D. w( B) Z
LuData Val; //存放表达式的值
& J$ s0 G( G5 H( K9 p
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
! M- I/ p a9 u
if(!theInitMLu()) return; //初始化MLu
- `. H: d4 h7 i. d, n N
if(!pUseLu(2)) //申请使用Lu资源
. B/ y' f3 q$ u. I9 X$ a( o
{
Z, y1 H o* j: \; A
i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
# z3 A c+ p2 ?8 ?
if(i)
1 W" T0 G$ j- l" o! M: o6 N" u
{
& a. ~7 v4 P, l" q( T u- l
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
! k6 N, C3 e/ C9 q
}
" \! n' @9 {; a: o
else
; O ~$ \) T! A3 ?' k2 z
{
( L- B( N* f1 S7 p) @$ j0 r6 q0 U- `
if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
" K& `" f* z& E% m
{
: z2 T, P) y) V7 ]- G
pPara=(LuData *)vPara;
5 A+ z @0 i$ S/ b7 r8 J
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
) U) R: `0 H; ~6 o
{
5 N' C8 f: M- }# r H' Y4 {
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
; t1 f; |5 j4 b7 k
}
5 }4 I( \! {1 U5 N% o' c9 \
Val=pLuCal(hFor,pPara); //计算表达式的值
6 _7 R, f: c. q/ \$ t/ k4 |/ H) J
cout<<Val.x<<endl;
' B2 @; S2 U# _" l: x
}
0 M6 W* y- h* _
else
+ x/ w3 {7 q1 Y' z; a l
{
0 _% a# [2 F o" W. ^) l7 v1 Y
cout<<"找不到指定的函数!"<<endl;
: b& p5 Q$ x( j" x2 ^
}
; ?9 X5 y6 q5 f
}
8 i" f, m( K5 X- D; V/ w$ N
pUseLu(0); //归还Lu的使用权
+ P2 ?" q) h m! E, P" ~/ V$ W
}
' u9 ?, u7 R+ p: g
theFreeMLu(); //释放MLu
J$ N6 Y0 d8 k$ R2 i: e3 q
}
复制代码
结果:
3
4 e/ C! Q4 r( n& }! e9 k3 u Y% S
请按任意键继续. . .
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5