C/C++调用MLu的入门程序

 C/C++调用MLu的入门程序

    MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行监视器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。

1 隐式加载例子

    该例子需要以下支持文件:

    (1)头文件lu32.h。
    (2)导入库lu32.lib及mlu32.lib。
    (3)核心库lu32.dll和模块化编译运行库mlu32.dll。

#include <windows.h>
#include <iostream>
#include "lu32.h"			//Lu头文件
#pragma comment( lib, "lu32.lib" )
#pragma comment( lib, "mlu32.lib" )
using namespace std;
void main(void)
{
	void *hModule;		//模块句柄
	luINT ErrBegin,ErrEnd;	//表达式编译出错的初始位置和结束位置
	int i;			//错误代码
	void *hFor;		//表达式句柄
	luVOID nModule=0;		//表达式所在模块
	void *vPara;		//存放输入自变量的数组指针
	LuData *pPara;		//存放输入自变量的数组指针
	luINT nPara;		//存放表达式的自变量个数
	LuData Val;		//存放表达式的值
	wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";	//Lu模块化源程序
	if(!InitMLu()) return;	//初始化MLu
	if(!UseLu(2))		//申请使用Lu资源
	{
		i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);	//编译Lu源程序
		if(i)
		{
			cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
		}
		else
		{
			if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))	//查找全局函数
			{
				pPara=(LuData *)vPara;
				for(i=0;i<=nPara;i++)	//表达式自变量赋值,均赋值为1
				{
					pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
				}
				Val=LuCal(hFor,pPara);	//计算表达式的值
				cout<<Val.x<<endl;
			}
			else
			{
				cout<<"找不到指定的函数!"<<endl;
			}
		}
		UseLu(0);		//归还Lu的使用权
	}
	FreeMLu();		//释放MLu
}


    结果:

3
请按任意键继续. . .

2 显式加载例子

    该例子需要以下支持文件:

    (1)头文件lu32.h。
    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。

#include <windows.h>
#include <iostream>
#include "Lu32.h"
using namespace std;
HINSTANCE hMLu=NULL;	//动态库MLu32.dll的句柄

//MLu输出函数
mluInitMLu pInitMLu;
mluFreeMLu pFreeMLu;
mluGetLuProc pGetLuProc;
mluUseLu pUseLu;
mluComModule pComModule;
//Lu输出函数
luGetFor pGetFor;
luLuCal pLuCal;
bool theInitMLu(void)	//初始化MLu
{
	hMLu=LoadLibrary(L"MLu32.dll");	//加载动态库MLu32.dll
	if(!hMLu)
	{
		cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";
		return false;
	}
	//以下几个语句获取MLu32.dll的输出函数
	pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");
	pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");
	pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");
	pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");
	pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");
	if(!pInitMLu())	//初始化MLu32.dll
	{
		FreeLibrary(hMLu);	//释放动态库
		cout<<"MLu初始化失败!";
		return false;
	}
	//以下几个语句获取Lu32.dll的输出函数
	pGetFor=(luGetFor) pGetLuProc("GetFor");
	pLuCal=(luLuCal) pGetLuProc("LuCal");
	return true;
}
void theFreeMLu(void)	//释放MLu
{
	pFreeMLu();	//释放MLu申请的空间
	FreeLibrary(hMLu);	//释放动态库
}
void main(void)
{
	void *hModule;		//模块句柄
	luINT ErrBegin,ErrEnd;	//表达式编译出错的初始位置和结束位置
	int i;			//错误代码
	void *hFor;		//表达式句柄
	luVOID nModule=0;		//表达式所在模块
	void *vPara;		//存放输入自变量的数组指针
	LuData *pPara;		//存放输入自变量的数组指针
	luINT nPara;		//存放表达式的自变量个数
	LuData Val;		//存放表达式的值
	wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";	//Lu模块化源程序
	if(!theInitMLu()) return;	//初始化MLu
	if(!pUseLu(2))		//申请使用Lu资源
	{
		i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);	//编译Lu源程序
		if(i)
		{
			cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
		}
		else
		{
			if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
			{
				pPara=(LuData *)vPara;
				for(i=0;i<=nPara;i++)	//表达式自变量赋值,均赋值为1
				{
					pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
				}
				Val=pLuCal(hFor,pPara);	//计算表达式的值
				cout<<Val.x<<endl;
			}
			else
			{
				cout<<"找不到指定的函数!"<<endl;
			}
		}
		pUseLu(0);	//归还Lu的使用权
	}
	theFreeMLu();		//释放MLu
}


    结果:

3
请按任意键继续. . .

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值