数学建模社区-数学中国
标题:
C/C++调用MLu的入门程序
[打印本页]
作者:
forcal
时间:
2011-10-30 20:17
标题:
C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
! m8 r2 {; D4 w( \$ _
MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
) i6 P$ J0 n% J( R( W
0 b" I3 i: h) |$ g! i% D! r
1 隐式加载例子
! x: I# o8 [5 r: Y6 m+ N) _
" v, v' p8 V R: W
该例子需要以下支持文件:
1 q! J+ y: w5 H$ G7 _# g' A
. s+ ]9 A6 K3 t$ a3 }2 D- o
(1)头文件lu32.h。
! x( j9 Q$ c; [3 A1 `* `1 H7 u
(2)导入库lu32.lib及mlu32.lib。
3 i$ s8 X; r3 r* Z, l9 [! u
(3)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
A% r. o' c. j/ e8 G7 {6 s! l
#include <iostream>
- M6 }% k) Y, {5 b1 a
#include "lu32.h" //Lu头文件
- H# ~! c K. V/ F$ |( _( r# N
#pragma comment( lib, "lu32.lib" )
; v* b+ l _* N) |2 b+ w
#pragma comment( lib, "mlu32.lib" )
8 H" q0 @% C5 k T6 T' E$ n( l
using namespace std;
* i# z, q4 b" `" p; Z4 ~
void main(void)
6 b% O/ f4 L2 B- I6 w" X0 P3 D
{
7 u% z Y0 j* L# \; k! |8 I' |
void *hModule; //模块句柄
* Z8 e: b' G. p6 \( b3 {
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
& `; m. t3 `- ?# J- X3 r
int i; //错误代码
/ C/ d+ C1 _: M( I* N/ N% ?
void *hFor; //表达式句柄
- @9 \& l: x7 @
luVOID nModule=0; //表达式所在模块
9 l- B) B! R, o
void *vPara; //存放输入自变量的数组指针
2 _* ^& ^; K( J, a+ b
LuData *pPara; //存放输入自变量的数组指针
/ \3 W7 T' Y# j7 a
luINT nPara; //存放表达式的自变量个数
4 ]' m3 A& O6 A* S3 X0 O8 ]
LuData Val; //存放表达式的值
1 h/ V# D7 o7 W% b: B- }" G | m
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
3 Q/ a2 h+ s! O6 h8 @ Y [
if(!InitMLu()) return; //初始化MLu
+ i1 \! D" C$ y
if(!UseLu(2)) //申请使用Lu资源
( r) R. j/ S7 P- y, j* J- O/ [
{
" W4 \. L. j r0 C% F' i) {
i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
. Q% P+ d, O. y6 }# D9 \" c
if(i)
) \+ b# r6 \( p/ B
{
& v, T! p9 Z( q6 K. F6 G0 @- x
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
! b% P/ T% s4 |& L! O3 Z
}
) j, b0 f3 q' `7 E9 m
else
& y7 W8 N1 ^ D* G& r+ p
{
# r" D; P& K8 _7 x1 \6 R
if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara)) //查找全局函数
4 p3 T: X6 d0 V: w8 u: ^6 N1 u% }
{
' L) Z, x6 Y( u6 |3 M) W b
pPara=(LuData *)vPara;
" ~, N' o; f* y# d8 y4 `4 s6 M
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
2 l9 s% U) ^0 Z" c- ~; }
{
' }+ _! q& A# @/ a9 i
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
: X" h$ T% d" e5 m6 q$ {* K" w1 c
}
* O: O2 n+ b7 h' c( B4 I
Val=LuCal(hFor,pPara); //计算表达式的值
+ q$ L6 W! F7 U1 ?+ `
cout<<Val.x<<endl;
5 [0 T" \! J. V3 g6 f" W5 u
}
, X4 a# J3 L+ V j5 k; H ?
else
% s- [/ ^( s1 b, y/ F
{
; _! b! T; h" N$ b( o* n
cout<<"找不到指定的函数!"<<endl;
5 ~9 c* A& [$ W, x! s* ]$ ^. }
}
! @% v3 g3 n1 x& V: n. d4 U( I! J5 Q! M
}
7 j3 F3 a: B% o! h) c6 N
UseLu(0); //归还Lu的使用权
) V* H z/ a( |2 ?
}
* c( W4 g+ o5 q6 C& a3 g$ B
FreeMLu(); //释放MLu
! q( l% p. S. \/ n' ^
}
复制代码
结果:
3
A% J- l: I: Z d
请按任意键继续. . .
复制代码
2 显式加载例子
X" O# d4 r6 C5 A( j" e$ r
, [) a. }6 u# ]' [) f. [
该例子需要以下支持文件:
" [/ K( Z. L/ Z# ?3 F
0 N7 o% R; I q. ?4 V# \7 j
(1)头文件lu32.h。
: A' A# r2 J( P3 J+ W( u
(2)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
6 H+ u& U/ i# X0 e% J
#include <iostream>
% [( [9 P+ f" A7 m+ }
#include "Lu32.h"
# C$ T% B& O* _
using namespace std;
9 h. g7 S- U' q" p0 z( z4 ]
HINSTANCE hMLu=NULL; //动态库MLu32.dll的句柄
4 y$ g9 `& H n$ J0 {. X
1 e9 ?; l2 w+ i7 W5 G6 d9 x1 e7 |
//MLu输出函数
! R( }! ^2 ~. y
mluInitMLu pInitMLu;
, U. {4 j6 ]; X5 e2 o( C- l
mluFreeMLu pFreeMLu;
+ N- `% Z' h! ~1 E
mluGetLuProc pGetLuProc;
+ g0 X6 r6 v. W( V# h
mluUseLu pUseLu;
8 a6 E1 P: C. y
mluComModule pComModule;
: @. Y1 _' k! A' @" ~
//Lu输出函数
: g; L7 X0 Q$ d
luGetFor pGetFor;
, }" M2 _) ] h4 d
luLuCal pLuCal;
( \! h+ R) Q0 h- x
bool theInitMLu(void) //初始化MLu
; y9 G! A. l2 W) t; D6 A1 C
{
4 y) R* e+ u' b. z' {9 p
hMLu=LoadLibrary(L"MLu32.dll"); //加载动态库MLu32.dll
) b. Z8 |0 {8 k7 d; B7 C
if(!hMLu)
S$ o f' ? D& f
{
! w+ o* }4 Y1 J# V' ?4 H
cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
* s# h0 E# F4 }/ m( u8 t1 [
return false;
( _! W5 c( ] @
}
* A, X+ d% B1 O5 c4 ?/ F3 X
//以下几个语句获取MLu32.dll的输出函数
) ^$ ^: w+ A2 D
pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");
: v2 k! w3 Y' [
pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
7 C' g. a$ Q% ~- r0 a2 a, z
pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
~% [/ Y* ?' p. s0 `) E2 l
pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
% r+ W# m3 Q/ ?. V9 q7 j: E. ]
pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
@: G3 s4 h- F; t9 N' J; D/ X8 X
if(!pInitMLu()) //初始化MLu32.dll
. e0 P4 A; S& A% O% l- }
{
7 I3 C) P- d) v% c8 X# P) M
FreeLibrary(hMLu); //释放动态库
4 }6 E/ }' G5 M- V
cout<<"MLu初始化失败!";
4 k+ J) |' _6 }' g5 E0 X8 K
return false;
# G) i8 @. v) @
}
; X X* c/ X" V) o/ H
//以下几个语句获取Lu32.dll的输出函数
' i" V! _4 w' p l5 o# I0 V
pGetFor=(luGetFor) pGetLuProc("GetFor");
5 v8 D; e- O$ S) ]+ O, r' a
pLuCal=(luLuCal) pGetLuProc("LuCal");
6 A+ m" y- `: t1 b! u
return true;
& L4 x+ m7 G, s3 D$ o* U2 h
}
' Z3 `6 Y. k& f! h" `+ j7 ]
void theFreeMLu(void) //释放MLu
! g, G- x& O6 G' W, \. h
{
# U, i- I( {! z
pFreeMLu(); //释放MLu申请的空间
3 [7 [# l, R' g6 g
FreeLibrary(hMLu); //释放动态库
* P5 w$ H4 y2 Y% f1 h& g% s- J
}
7 I3 M K( I, U9 V- N+ `
void main(void)
. @4 K( @* ~! H; H0 p
{
1 n. X' l) s* T
void *hModule; //模块句柄
0 P8 c2 h, _6 o1 r" `. v2 Q
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
5 v g8 s$ V# Q3 b2 h( N. D
int i; //错误代码
) P8 I* C0 `6 x1 b1 U( G3 g
void *hFor; //表达式句柄
( V% G* Y5 B& T1 ]* A
luVOID nModule=0; //表达式所在模块
9 G" N" Z( P/ I4 c' B o' ^
void *vPara; //存放输入自变量的数组指针
, {, v5 j2 x7 Q! u9 ^; }6 B
LuData *pPara; //存放输入自变量的数组指针
, w, m/ L7 Q! X4 f6 c6 [- f; [" x
luINT nPara; //存放表达式的自变量个数
& X3 U' n% x. v
LuData Val; //存放表达式的值
' c6 R' S; E+ r2 K! W
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
; s3 H, o# }! E; C
if(!theInitMLu()) return; //初始化MLu
& `* F+ p* n( P, R) V
if(!pUseLu(2)) //申请使用Lu资源
4 H1 V. U1 _$ Y( q7 b
{
1 n& m8 K# B i0 c5 O3 g
i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
% O5 Y# C2 c& e+ R2 V0 g
if(i)
& N) n9 I- @/ n, p
{
0 ]8 x" V( x. j) ^& q4 F+ p
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
% y+ C$ w- Q0 l b# D
}
/ x$ }2 N1 j/ q: O! G+ \9 Z
else
, v- j7 l+ E5 U, b- K; [
{
* k T1 X! f& {" ~, M0 m
if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
5 c6 q! ?# f! G
{
8 i% W, X, e0 |- c
pPara=(LuData *)vPara;
" T V. T0 }" ^; p; x" j
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
4 P1 l: O/ Q- R+ ^; T- z
{
j- d% b5 ?" Q$ ]$ V% P2 ?
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
& V7 b+ @3 c- ^
}
M( c" x- {# n. |* ?6 i% D# |
Val=pLuCal(hFor,pPara); //计算表达式的值
. q3 o0 C1 T# ]. h3 F$ p& W- d
cout<<Val.x<<endl;
$ u5 Q6 E8 b: {7 E" {' b" u4 i/ m
}
, k& O) g$ B- W
else
, w. A) P4 p, V) \2 o9 A
{
' _, f7 C' r, r% Y* D1 p3 ]7 T- p
cout<<"找不到指定的函数!"<<endl;
3 Y9 T; r3 Q9 @. s: W" {
}
" @/ r3 z; ]& y7 S( v; U
}
l0 H2 O, [# e) H0 @: m" t: y
pUseLu(0); //归还Lu的使用权
n# A: @. R7 k( |6 |. y6 P
}
5 z, d( o0 }, i7 K; j. _
theFreeMLu(); //释放MLu
% {6 ^/ R- a. L4 I/ h* T8 |5 |
}
复制代码
结果:
3
5 Q. f0 ]2 m0 e; r j. S
请按任意键继续. . .
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5