上一篇文章(C /C++语言实现模糊控制)介绍了C/C++中实现模糊控制该怎么做,开始提到的MATLAB模糊控制的C/C++模糊控制接口fis.c库,不过这个文件有点老,在用VS2010编译的时候一大堆错误,在网上找关于C++中使用 fis.c 的资料,结果一点结果都没有,说怎么引用fis.c文件,网上的都是说什么头文件,extern "C"{} 的老一套,问题是fis.c文件中大多数的函数都是static修饰的,不可能自己再做个.h的头文件,途径只有一条,用#include "fis.c" 包含这个C语言文件,问题是一包含就是一大堆错误,后来看fis.c的代码发现,原来里面有很多过时的语法,C语言可以编译,但是C++不可以,比如模糊控制的主要数据结构FIS的定义,原先的定义如下:

typedef struct fis_node {int handle;int load_param;char name[STR_LEN];char type[STR_LEN];char andMethod[STR_LEN];char orMethod[STR_LEN];char impMethod[STR_LEN];char aggMethod[STR_LEN];char defuzzMethod[STR_LEN];int userDefinedAnd;int userDefinedOr;int userDefinedImp;int userDefinedAgg;int userDefinedDefuzz;int in_n;int out_n;int rule_n;int **rule_list;DOUBLE *rule_weight;int *and_or;   /* AND-OR indicator */DOUBLE *firing_strength;DOUBLE *rule_output;/* Sugeno: output for each rules *//* Mamdani: constrained output MF values of rules */struct io_node **input;struct io_node **output;DOUBLE (*andFcn)(DOUBLE, DOUBLE);DOUBLE (*orFcn)(DOUBLE, DOUBLE);DOUBLE (*impFcn)(DOUBLE, DOUBLE);DOUBLE (*aggFcn)(DOUBLE, DOUBLE);DOUBLE (*defuzzFcn)();DOUBLE *BigOutMfMatrix;    /* used for Mamdani system only */DOUBLE *BigWeightMatrix;/* used for Mamdani system only */DOUBLE *mfs_of_rule;    /* MF values in a rule */DOUBLE *bias; /*bias, to be tuned when no rules are fired*/int isbias;struct fis_node *next;
} FIS;

上述的定义中,defuzzFcn这个指针函数的定义没有参数,而后面的Defuzzification methods都是带参数的,甚至第一个参数就是FIS结构体本身,如:

static DOUBLE defuzzCentroid(FIS *fis, int m, DOUBLE *mf, int numofpoints)

所以要修改这个定义,如下:

typedef struct fis_node FIS;typedef struct fis_node {int handle;int load_param;char name[STR_LEN];char type[STR_LEN];char andMethod[STR_LEN];char orMethod[STR_LEN];char impMethod[STR_LEN];char aggMethod[STR_LEN];char defuzzMethod[STR_LEN];int userDefinedAnd;int userDefinedOr;int userDefinedImp;int userDefinedAgg;int userDefinedDefuzz;int in_n;int out_n;int rule_n;int **rule_list;DOUBLE *rule_weight;int *and_or;   /* AND-OR indicator */DOUBLE *firing_strength;DOUBLE *rule_output;/* Sugeno: output for each rules *//* Mamdani: constrained output MF values of rules */struct io_node **input;struct io_node **output;DOUBLE (*andFcn)(DOUBLE, DOUBLE);DOUBLE (*orFcn)(DOUBLE, DOUBLE);DOUBLE (*impFcn)(DOUBLE, DOUBLE);DOUBLE (*aggFcn)(DOUBLE, DOUBLE);//DOUBLE (*defuzzFcn)();  hemmingway <hemmingway@163.com>  2013/01/02DOUBLE (*defuzzFcn)(FIS *fis, int m, DOUBLE *mf, int numofpoints);  DOUBLE *BigOutMfMatrix;  /* used for Mamdani system only */DOUBLE *BigWeightMatrix;/* used for Mamdani system only */DOUBLE *mfs_of_rule;    /* MF values in a rule */DOUBLE *bias; /*bias, to be tuned when no rules are fired*/int isbias;struct fis_node *next;
} FIS;

接下来是printf和double的宏定义问题,原先针对的是控制台程序,或者Linux下控制台,如果要把模糊控制用到MFC环境,需要修改这个宏定义,方便用到MFC界面程序中,修改过后如下所示:

/* Define portable printf and double */
#if defined(MATLAB_MEX_FILE)
# define PRINTF mexPrintf
# define DOUBLE real_T
#elif defined(__SIMSTRUC__)
# define PRINTF ssPrintf
# define DOUBLE real_T
#elif defined(_MSC_VER)#define PRINTF odprintf#include <stdarg.h>
#include <Windows.h>int _cdecl odprintf(const char* fmt, ...)
{char buf[4096], *p=buf;va_list    args;int        ret = -1;va_start(args, fmt);ret = vsnprintf_s(p, sizeof(buf), _TRUNCATE, fmt, args);p +=ret;va_end(args);while (p>buf && isspace(*p)){*--p = '\0';*p++ = '\r';*p++ = '\n';*p = '\0';}OutputDebugStringA(buf);return(ret);
}
#else
# define PRINTF printf
# define DOUBLE double
#endif

接下来修改一下fisError这个函数,里有有个exit(1); 在MFC界面程序中不需要这个的,需要修改一下:

static void fisError(char *msg)
{
#ifdef MATLAB_MEX_FILEmexErrMsgTxt(msg);
#elsePRINTF("%s\n",msg);#ifndef _MSC_VERexit(1);
#endif#endif
}

还有一个函数封装了fopen()函数打开文件,里面有个多余的定义语句, FILE *fopen();  这个在C++中不支持,需要注释掉它:

/* an friendly interface to fopen() */
static FILE *fisOpenFile(char *file, char *mode)
{FILE *fp /*, *fopen()*/;if ((fp = fopen(file, mode)) == NULL){PRINTF("The file %s cannot be opened.", file);fisError("\n");}return(fp);
}

再就是fis.c文件后面的几个函数定义,使用 __STDC__ 宏支持了一种老旧的语法格式,如下所示:

/* return data matrix */
DOUBLE **
#ifdef __STDC__
returnDataMatrix(char *filename, int *row_n_p, int *col_n_p)
#else
returnDataMatrix(filename, row_n_p, col_n_p)
char *filename;
int *row_n_p;
int *col_n_p;
#endif
{
    //code...
}

问题是MFC程序中 定义 __STDC__ 宏会出现错误的,而那种默认的老旧C语法格式C++中又不支持,所以所有这样定义的函数都要删掉那些多余的东西,如上面的函数改成这样:

/* return data matrix */
DOUBLE **returnDataMatrix(char *filename, int *row_n_p, int *col_n_p)
{
    //code...
}

改完以后,没有错误了,用下面的语句将fis.c文件包含到一个CPP文件的时候,问题又来了,出现 fatal error LNK1169: 找到一个或多个多重定义的符号,按照一般在网上搜索的解决方法是:在项目->属性->链接器->命令行->附加选项中加 /force  这样没有错误了,但是还是有很多警告Warning Link 一大堆乱七八糟的警告,其实真正的方法是:在【解决方案资源管理器】中选中fis.c文件,单击右键的属性,打开fis.c属性页对话框,在 【配置属性】->【常规】->【项类型】中,将这个配置为【C/C++ 标头】,这样就没有什么问题了。

/*Start of the regular fis control*/
extern "C"{
#include "fis.c"
}

============================================

使用方法总结如下:

/** 这是修改过后的fis.c模糊推理系统库函数,可以移植C/C++环境使用,在VS2010的MFC环境经过测试* 1、将fis.c文件拷贝到项目中;* 2、修改VS2010的配置属性,项目->属性->C/C++->预处理器->预处理器定义,添加* _CRT_SECURE_NO_WARNINGS* 3、在【解决方案资源管理器】中选中fis.c文件,单击右键的属性* 【配置属性】->【常规】->【项类型】,配置为【C/C++ 标头】* 4、如果是C语言文件(*.c)使用* #include "fis.c"* 包含接口库文件;* 5、如果是C++文件,使用* extern "C"{* #include "fis.c"* }* 包含库文件。* 祝你使用愉快!* hemmingway <hemmingway@163.com> 2013/1/2*/

修改过后的fis.c文件可以从这里下载:

http://download.csdn.net/detail/hemmingway/4953923

C/C++实现模糊控制,借助MATLAB辅助设计和fis.c文件相关推荐

  1. 借助MATLAB与SIMULINK仿真嵌入式C算法

    概述 为在嵌入式开发中碰到的算法验证问题,借助matlab平台可以更方便的调试.如控制算法,可以先验证算法编写的正确性,防止盲目调参的无用功.借助的是SIMULINK 与 S-Function Bui ...

  2. 不借助 matlab 内置函数,生撸均值方差模型

    不借助 matlab 内置函数,生撸均值方差模型 前言 我在之前的一篇文章中介绍了,如何使用 matlab 自带的函数(对象)portfolio,实现均值方差模型.matlab 内置的函数自然实用.但 ...

  3. 借助MATLAB标定工具箱标定相机

    1-2  借助MATLAB标定工具箱标定相机 上篇文章讲述了相机成像和标定原理,这篇文章我们讲述如何利用MATLAB中的标定工具箱标定单目相机和双目相机的参数. MATLAB标定工具箱下载和标定准备工 ...

  4. 模糊控制在matlab的实现,模糊控制在matlab中的实现

    模糊控制在matlab中的实现 模糊控制在MATLAB中的实现,1.采用MATLAB语言根据具体的控制算法编程,2.利用MATLAB提供的模糊逻辑工具箱函数,3.利用模糊逻辑工具箱的图形界面与Simu ...

  5. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

  6. VC调用matlab中定义的.m文件中的函数的实例

    Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matlab的资源呢?在这里我 ...

  7. 使用MATLAB和Vivado读取txt文件

    使用MATLAB和Vivado读取txt文件 MATLAB处理十六进制的数据: 将你的16进制数据保存到txt文件中,打开MATLAB选择workspace->importdata,导入txt文 ...

  8. 解决MATLAB不能设置为.m文件默认打开方式

    转载:https://blog.csdn.net/yujiaerzong/article/details/77624167 将下面代码复制保存为 associateFiles.m 文件. 或者从下面链 ...

  9. 【转】matlab与C/C++混合编程——在Windows/Linux上调用Matlab编译的动态库文件

    转自:matlab与C/C++混合编程--在Windows/Linux上调用Matlab编译的动态库文件_sinat_18131557的博客-CSDN博客 date version comments ...

最新文章

  1. 使用XML创建Excel文档
  2. 每日一皮:为这位姑娘的回答鼓掌!
  3. 零基础自学python的app-零基础入门免费学Python 课程和APP推荐
  4. 号和管道符号(|)在不同场景下的使用方法
  5. 2018程序员最佳ssh免费登陆工具
  6. 注解@Cacheable(value =“XXX“) 实现缓存 -- 失效原因
  7. MongoDB 学习-MongoDB 的基本操作(二)
  8. LDA主题模型原理解析与python实现
  9. hash算法_HASH算法简介
  10. 微信弹出遮罩层引导用户浏览器打开升级版
  11. 深入浅出MFC笔记(5)
  12. 计算机操作系统慕课版(汤小丹)--第一章课后题
  13. 开源首发!Android入门“神器“——《Android编程入门教程》,理论与实战齐飞!
  14. ubuntu18.04桌面美化及部分应用的安装
  15. win7连接网络打印机需要输入网络密码,怎么办
  16. 从两年一次到一年三次,百度频繁调整架构为哪般?
  17. 深度学习卷积神经网络重要结构之通道注意力和空间注意力模块
  18. CC3200——中断优先级
  19. Weblogic服务器证书安装配置 | Weblogic SSL
  20. 区间选点acwing905(贪心算法)

热门文章

  1. JavaScript新发展 CoffeeScript Dart Rust Node.js
  2. MySQL远程用户授权
  3. grid系列--删除
  4. python列表写入csv文件_将多个列表写入csv。Python中的文件
  5. mysql win7 sp1 常见问题_win7旗舰版安装不了mysql问题-------win7系统版本选择问题的一点探索...
  6. python open permission denied_python - Image.open PermissionError:[Errno 13]权限被拒绝: - 堆栈内存溢出...
  7. [蓝桥杯][历届试题]蚂蚁感冒(模拟)
  8. java图片预览上传_Java实现图片上传预览 (使用ajax提交)
  9. 戴维·阿克:品牌如何避免陷入竞争…
  10. PAT_B_1033_Java(20分)