数学建模社区-数学中国
标题:
C/C++调用MLu的入门程序
[打印本页]
作者:
forcal
时间:
2011-10-30 20:17
标题:
C/C++调用MLu的入门程序
C/C++调用MLu的入门程序
1 g( C& {8 Y& c0 {* V' ? M: L5 @
MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行**器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。
w! x8 W w0 b' a4 V1 T5 Z
* m) ]; C" ~( A: i7 @5 O
1 隐式加载例子
8 }3 k b* e+ L
% ?( [4 \4 p: |0 X
该例子需要以下支持文件:
" K t, I9 s$ a+ `1 A
4 H' R8 s! k* H* I& r) S
(1)头文件lu32.h。
- N+ g; O; R M% Q0 e! d
(2)导入库lu32.lib及mlu32.lib。
7 n3 E6 r+ S+ i; @
(3)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
# R- Q" z; z2 ]/ o# b9 t4 Q
#include <iostream>
- M9 E1 _+ E" A6 F! {' R
#include "lu32.h" //Lu头文件
' J0 L( f, c5 [% p8 B- ^8 Y
#pragma comment( lib, "lu32.lib" )
8 ?6 G" L# V* | z* X+ G+ O. u
#pragma comment( lib, "mlu32.lib" )
/ y- Q# M: l2 x' d! N+ S% h
using namespace std;
: {, U" U+ d; I1 J3 R# w
void main(void)
+ K; g4 p5 j8 j1 f
{
2 i h F+ c$ l* B3 O
void *hModule; //模块句柄
4 K& X$ K, j! t' K% H% K
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
# `, Y1 y& E" W( O3 R- ?
int i; //错误代码
& S1 i# I, F& G% v; k( |
void *hFor; //表达式句柄
0 Y% @! b, P3 M0 M, |
luVOID nModule=0; //表达式所在模块
3 u! W; C3 d/ ^& P2 r" m3 O
void *vPara; //存放输入自变量的数组指针
# N- \) ~; z t
LuData *pPara; //存放输入自变量的数组指针
7 v1 ?0 J2 K1 M* p$ `) G
luINT nPara; //存放表达式的自变量个数
0 y+ u0 e3 C6 c
LuData Val; //存放表达式的值
" }4 U. |. {$ X) i( v# T. d
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
$ x' s9 K! V: `
if(!InitMLu()) return; //初始化MLu
{# n' F! i- S# l
if(!UseLu(2)) //申请使用Lu资源
7 l8 e" b* q- h) L7 Q8 u3 E% M
{
! R6 x5 n6 l, { q+ h& |
i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
& W1 m' A8 e$ J: a# x
if(i)
4 w: t6 N% `, F& z _. R
{
) W' n3 T' b) S
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
2 ?( M/ a9 U1 _0 V, f
}
! M* l- _4 W& K9 M% }
else
; A9 L6 b6 a0 X5 g7 H, @7 T
{
! W6 ^, t) r5 x: S: @) y
if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara)) //查找全局函数
+ W6 Q- z0 I0 [0 V, B( k
{
0 V2 x; C7 b, o4 X% [. f
pPara=(LuData *)vPara;
8 ` j ]/ r7 {- X4 d( }1 q5 m) t
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
; G! f9 a. H5 P* G% L
{
1 y/ X2 @+ N+ W9 c( i1 d
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
( x8 y4 X* Q& _" d) h; F9 d
}
# A+ i, `) S4 L) I' O! E/ T
Val=LuCal(hFor,pPara); //计算表达式的值
7 P" y$ ?) _ u, x0 d [
cout<<Val.x<<endl;
N2 I; f1 g6 e8 Z5 \1 G; L) I
}
. i* T5 B8 v% J9 p4 W! S' Z
else
9 V& |* e, W( W, a& x( L1 z
{
$ s4 W q5 V2 w2 j, ~
cout<<"找不到指定的函数!"<<endl;
2 ~3 j& | N! _' ^
}
, Q. z1 @) v! V H( o u8 n6 A' |; W
}
p( ]& j6 V# ^1 Z* w/ Q9 D( t
UseLu(0); //归还Lu的使用权
6 y% Z% a# e) q' U% Z8 y
}
$ u) M- |) g6 X' R9 a( R
FreeMLu(); //释放MLu
0 N2 ^2 Z& }6 ]3 v& X) B
}
复制代码
结果:
3
2 x! ]1 |; t8 U6 h) Q$ _
请按任意键继续. . .
复制代码
2 显式加载例子
. d7 q. s0 M: e4 T% K$ Q9 V* i
# n+ q J) h; ?2 H
该例子需要以下支持文件:
% X6 V" r3 Y3 l P- x5 Z
* ]% v7 M2 i% f2 ], J0 c
(1)头文件lu32.h。
% Z2 l4 h7 M, i% y4 A
(2)核心库lu32.dll和模块化编译运行库mlu32.dll。
#include <windows.h>
$ Z# O$ \8 `0 `5 Z3 n4 e
#include <iostream>
+ T k' n) Z/ I" C
#include "Lu32.h"
# g( H) V: ]3 C8 N# h5 P: W# p
using namespace std;
( Q3 [* P: Z8 u# t! x# R9 u% F- J' _6 Q
HINSTANCE hMLu=NULL; //动态库MLu32.dll的句柄
4 I. L; r- u. f- a, `& X
2 C) z$ N0 r, t
//MLu输出函数
, @: _# R- C% x
mluInitMLu pInitMLu;
* C2 h- w/ }+ T& F
mluFreeMLu pFreeMLu;
0 L4 D* v3 p4 c! h- U. t
mluGetLuProc pGetLuProc;
. {! i" }) E" }: K. r% b% D0 s
mluUseLu pUseLu;
8 O. b. V- ^" b+ P; S. S5 E
mluComModule pComModule;
5 `) j1 m. p2 o1 p
//Lu输出函数
& j7 f2 H6 T; e
luGetFor pGetFor;
/ Q# Q1 Z0 z0 F' _$ z z$ w J1 @
luLuCal pLuCal;
8 @- b. t- f5 Z$ L: Y" f
bool theInitMLu(void) //初始化MLu
/ g) |( ?3 o& h+ z% m# R- i
{
. C- h4 P) e- p, k# j; X# p
hMLu=LoadLibrary(L"MLu32.dll"); //加载动态库MLu32.dll
; q% M* D5 J5 t, s; l) L
if(!hMLu)
/ u% E7 M. \6 w: j! R0 b- R/ j) N) v
{
* ^. c- @$ t6 @: g
cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
2 d/ A6 G% k1 L5 w
return false;
# d* n2 e8 y6 k- Q
}
' W! a/ `0 X3 h2 q
//以下几个语句获取MLu32.dll的输出函数
, I2 b: M9 H, Y
pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");
! f: k: H4 T) F2 F6 m
pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
: f' v0 c9 a7 |% i: A, K
pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
+ K3 a6 Y L4 U7 Z6 A0 d5 ]
pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
* d- W( R$ l8 w [6 m( F
pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
: |6 D& |: T' k( e
if(!pInitMLu()) //初始化MLu32.dll
# s; N$ n% Y/ m' G' C" @
{
" S9 ~+ r+ I+ r' D( J! ~
FreeLibrary(hMLu); //释放动态库
7 I1 g/ Z g4 p) x
cout<<"MLu初始化失败!";
g6 ?3 H% l1 q6 U( e7 ^2 m9 _6 N* }
return false;
+ P9 h+ o0 `) a* \" M% o
}
& g+ u, y C! y7 }
//以下几个语句获取Lu32.dll的输出函数
# M( S g# R+ t$ q# C# W n+ S
pGetFor=(luGetFor) pGetLuProc("GetFor");
7 T7 g* n- _9 z& G
pLuCal=(luLuCal) pGetLuProc("LuCal");
+ W3 F! q5 h( I; U! ^1 y
return true;
8 g$ A) q6 ^2 W( R. s' W; D& q' |
}
7 _$ J& }) s6 Z
void theFreeMLu(void) //释放MLu
+ L2 n; t% H6 H( ]% u1 W% w3 T
{
) k& g1 r2 [4 j8 B% W
pFreeMLu(); //释放MLu申请的空间
( }( X: N/ N9 p2 F0 Z
FreeLibrary(hMLu); //释放动态库
+ h5 y; ~% y8 h7 L9 S% @
}
5 I q) \0 L9 |6 l
void main(void)
8 c! }3 T5 k* O% I( u# C
{
' l3 [8 @% M; B+ g
void *hModule; //模块句柄
9 ~) ]5 P, }9 s; H
luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置
* ?4 h- I" B$ r) U) y9 C+ V
int i; //错误代码
% m" v* t1 K* y* Z% V6 o3 b
void *hFor; //表达式句柄
- u% ?1 U% E* q8 e' Y. ~- Y
luVOID nModule=0; //表达式所在模块
1 c; r, _2 |! l1 t
void *vPara; //存放输入自变量的数组指针
/ o# \9 } y3 a! p8 e; C; N
LuData *pPara; //存放输入自变量的数组指针
2 e1 a: V: f0 A& Y
luINT nPara; //存放表达式的自变量个数
: \+ _9 ]( W4 ?
LuData Val; //存放表达式的值
$ g( L! ^- y' @5 ^
wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序
* d+ ?, j0 r% k' ?- H
if(!theInitMLu()) return; //初始化MLu
, M" ~2 G% N* B: L
if(!pUseLu(2)) //申请使用Lu资源
2 |5 |$ f0 G9 s+ j1 K% |
{
! k/ G" b4 E" B) _& b
i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序
4 U9 l1 Q! v* }$ ]& k
if(i)
3 N# x- z7 i, ^8 _! `
{
% q4 Q2 U+ y$ J: l1 o" w+ Z) J5 P
cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
. C( D) ] H; t- ^* [
}
3 P% J) k* [* D( u Z
else
2 O+ b# _( E) Z
{
. l, T g9 f# w b7 C
if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
$ d: v, x4 T" h6 V
{
$ J: z/ Z! E$ v' |- h+ I5 K3 \/ f8 h
pPara=(LuData *)vPara;
: j8 m: x' \" g7 W
for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1
# g" I3 o0 [! D" S
{
: I1 q! r" e7 q2 y2 ^
pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
C& d" h' X, d
}
, c1 E0 Z" u9 @9 T
Val=pLuCal(hFor,pPara); //计算表达式的值
7 ^3 G, Z. T3 ^0 N
cout<<Val.x<<endl;
; t9 @8 t+ e* o& s
}
: u! R4 H3 {% c% C; ]! H
else
& x8 B" U: M- L1 T' v+ j1 N
{
$ T5 |& P% w8 ]0 r# X8 | \
cout<<"找不到指定的函数!"<<endl;
# m3 ]8 }; R5 a$ M* f: ~& t
}
: w0 s& i, m2 v; x
}
6 c' y, t; f+ U' R& J
pUseLu(0); //归还Lu的使用权
* l1 h8 ?' ^- u! l
}
% k# U/ r/ W2 y, h
theFreeMLu(); //释放MLu
% v! W: E& a; o+ z, U' G7 q
}
复制代码
结果:
3
5 H. o* h# [9 P$ e5 r2 F C
请按任意键继续. . .
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5