muParser 公式库使用简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数原型: API_EXPORT(void) mupDefineStrFun1(muParserHandle_t a_hParser, const muChar_t
*a_szName, muStrFun1_t a_pFun); API_EXPORT(void) mupDefineStrFun2(muParserHandle_t a_hParser, const muChar_t
return (int)a&(int)b; }
double BitOr(double a, double b) {
return (int)a|(int)b; }
double BitXor(double a, double b) {
return (int)a^(int)b; }
doubletrConst(hParser, "strBuf", "Hallo welt"); 它表示定义一个值为”Hallo welt”的字符串常量 strBuf,你可以在公式引用该常
量的值,如:a=strBuf, 它表示将 strBuf 的值赋给变量 a,当然它要求 a 为字符串变量
2.定义数值常量
当前版本 V1.28,官方网址 /projects/muparser/,这里是关于该库 使用交流 https:///forum/forum.php?forum_id=462843
它提供两种方式使用,一是将它编译进你的程序中,使用 C++类,一是将它编译 成共享库,可以使用语言调用,下面主要介绍 C 接口方式使用该库,本文大部分例子都是 muParser 库中自带的,也包括本人使用过程中的一点点心得。
一、初始化公式库 #include “muParserDLL.h” muParserHandle_t hParser;
hParser = mupCreate();//创建公式对象,并返回该对象的句柄
二、设置公式 muChar_t szLine[100]; mupSetExpr(hParser, szLine);//这里 szLine 一定要是以\0 结尾的字符串
*a_szName, muStrFun2_t a_pFun); API_EXPORT(void) mupDefineStrFun3(muParserHandle_t a_hParser, const muChar_t
*a_szName, muStrFun3_t a_pFun); //定义一个带字符串参数的函数,将字符串表示的十六进制数转换成十进制数 muFloat_t hex(const muChar_t* str) {
六 .自 定 函 数
自定义函数有以下几种原型 typedef muFloat_t (*muFun1_t)(muFloat_t); typedef muFloat_t (*muFun2_t)(muFloat_t, muFloat_t); typedef muFloat_t (*muFun3_t)(muFloat_t, muFloat_t, muFloat_t); typedef muFloat_t (*muFun4_t)(muFloat_t, muFloat_t, muFloat_t, muFloat_t); typedef muFloat_t (*muFun5_t)(muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t); typedef muFloat_t (*muMultFun_t)(const muFloat_t*, muInt_t); typedef muFloat_t (*muStrFun1_t)(const muChar_t*); typedef muFloat_t (*muStrFun2_t)(const muChar_t*, muFloat_t); typedef muFloat_t (*muStrFun3_t)(const muChar_t*, muFloat_t, muFloat_t);
3.可变参数函数
函数原型: API_EXPORT(void) mupDefineMultFun( muParserHandle_t a_hParser,
const muChar_t* a_szName, muMultFun_t a_pFun, muBool_t a_bOptimize);
//求多个参数的和,参数个数不确定 double Sum(const double *a_afArg, int a_iArgc) {
*a_szName, muFun5_t a_pFun, muBool_t a_bOptimize); //定义一个参数的函数,对参数平方运算 muFloat_t Power(muFloat_t a) {
return a*a; } //定义两个参数的函数,求和 muFloat_t Add(muFloat_t a, muFloat b) {
七、定义运算操作符(这可非常有新意的功能) 运算操作符分为前缀一元操作符,后缀一元操作符,二元操作符等 完全可以实现 C 中的按位运算(&, | ~ << >>),自加减运算(++ --),但不能与库的内置操 作符冲突 //按位操作运算(注意按位运算只能运算整型,所以运算前要先转换) double BitAnd(double a, double b) {
int len = strlen(str); int ret, tmp, i; if(len <= 0)
return 0; for (i = 0; i < len; i++) {
if(str[i]>= '0'&& str[i]<= '9') tmp = str[i]-'0';
else if(str[i]>= 'a'&& str[i] <= 'f') tmp = str[i]-'a'+10;
*a_szName, muFun1_t a_pFun, muBool_t a_bOptimize); API_EXPORT(void) mupDefineFun2(muParserHandle_t a_hParser, const muChar_t
*a_szName, muFun2_t a_pFun, muBool_t a_bOptimize); API_EXPORT(void) mupDefineFun3(muParserHandle_t a_hParser, const muChar_t
注意该库解析还有一些 BUG,所以上面公式并不能正确解析,在自定义的运算符与变 量之间添加空格可以暂时解决这个问题,如((a & b)>> 8)bxor((a | b)<<8),在本文后面 会介绍如何修正该 BUG
八、错误处理 错误处理很重要的,因为库是用 C++写的,对错误采用异常处理方式,所以如果公式解析 出错,而又没有捕捉该异常,程序就会挂掉,C 接口没有捕捉异常的能力,这里可以使用 安装错误处理回调函数解决这个问题,使用方法如下: void OnError(muParserHandle_t hParser) {
*a_szName, muFun3_t a_pFun, muBool_t a_bOptimize); API_EXPORT(void) mupDefineFun4(muParserHandle_t a_hParser, const muChar_t
*a_szName, muFun4_t a_pFun, muBool_t a_bOptimize); API_EXPORT(void) mupDefineFun5(muParserHandle_t a_hParser, const muChar_t
三、计算公式 muFloat_t fVal = 0, fVal = mupEval(hParser); 计算公式中的数值类都是以浮点处理的,其实就是 double 类型,除了计算浮点数,
还可以处理字符串参数
四、释放公式对象 mupRelease(hParser);
五、变量,常量操作
1.定义字符串常量
8在本文后面会介绍如何修正该bug八错误处理错误处理很重要的因为库是用c写的对错误采用异常处理方式所以如果公式解析出错而又没有捕捉该异常程序就会挂掉c接口没有捕捉异常的能力这里可以使用安装错误处理回调函数解决这个问题使用方法如下
muParser 公式库使用简介
muParser 是一个跨平台的数据解析库,它可以自定义多参数函数,自定义常量, 变量及一元前缀、后缀操作符,元操作符等,它将公式编译成字节码,所以计算起来非 常快。
else if(str[i]>='A'&& str[i]<='F') tmp = str[i]-'A'+10;
else return ret;
ret = (ret<<4) | tmp; } return ret; } mupDefineStrFun1(hParser, “hex”, hex); 公式使用方法: hex(“0FA0”),公式中的字符中参数用双引号括起来
分为三大类,即固定数值参数的函数(1 个或 2 个或 3 个或 4 个或 5 个数值参数), 固定带字符串参数的函数(1 个字符串参数,0 个或 1 个或 2 个数值参数),可变参数函数 (一个数值数组参数,一个数组大小参数),下面分别介绍
1.固定数值参数的函数
函数原型: API_EXPORT(void) mupDefineFun1(muParserHandle_t a_hParser, const muChar_t
return a+b; }
mupDefineFun1(hParser, “power”, Power, 0);//最后一个参数 2 表示是否对它进行优化 mupDefineFun2(hParser, “add”, Add, 0);
公式使用方法:power(4)*add(3,4)
2.固定带字符串参数的函数
return ~(int)a; }
double Shll(double a, double b) {
return (int)a<<(int)b; }
double Shlr(double a, double b) {
return (int)a>>(int)b; }
mupDefineOprt(hParser, "&", BitAnd, 2, 0); mupDefineOprt(hParser, "|", BitOr, 2, 0); mupDefineOprt(hParser, "bxor", BitXor, 2, 0); mupDefineInfixOprt(hParser, "~", BitNot, 5); mupDefineOprt(hParser, "<<", Shll, 3, 0); mupDefineOprt(hParser, ">>", Shlr, 3, 0); 公式使用:((a&b)>>8)bxor((a|b)<<8)
double fRes=0; int i=0;
for (i=0; i<a_iArgc; ++i) fRes += a_afArg[i];
return fRes; } mupDefineMultFun(hParser, “sum”, sum, 0); 公式使用:sum(1,2,3,4,5,6,7,8,9) 在公式解析的时候,会自动将所有的参数压入到一个数组中,并将该数组和参数个数传给 自定义回调函数
printf("\nError:\n"); printf("------\n"); printf("Message: %s\n", mupGetErrorMsg(hParser)); printf("Token: %s\n", mupGetErrorToken(hParser)); } mupSetErrorHandler(hParser, OnError);
mupDefineConst(hParser, "const1", 1); //表示定义一个名为 const1 值为 1 的数值常量 注意常量只能引用它的值,不能改变它的值
3.定义数值变量
muFloat_t var; mupDefineVar(hParser, "a", &var);
在公式中你可以随意引用或改变变量 a 的值,注意如果你要全局使用自定的变量 a,则不能将 var 定义为局部变量,否则会引起内存地址非法访问
相关文档
最新文档