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

上一篇文章(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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转载:Windows CE内存管理

内存管理如果你在写Windows CE 程序中遇到的最重要的问题&#xff0c;那一定是内存问题。一个WinCE 系统可能只有4MB 的RAM&#xff0c;这相对于个人电脑来说是十分少的&#xff0c;因为个人电脑的标准配置已经到了128MB 甚至更多。事实上&#xff0c;运行WinCE 的机器的内存十…

一些比较使用的技巧

一些比较使用的技巧 1、如何得到一个信号的上升沿 注意:时序逻辑有打一拍的特性,组合逻辑没有。 input vsync; reg vsync_r; reg vsync_r2; wire vsync_r2_n; wire vsync_rise;always@(posedge clk) beginvsync_r <= vsync;vsync_r2 <= vsync_r; endassign vsync_r2_…

2012年我读过的十本好书

1、《世上的光》是俄罗斯导演安德烈塔可夫斯基的拍立得摄影集。从中我们可以感受他在拍电影之余的个人生活&#xff0c;他的妻子&#xff0c;他的爱子以及梦幻般的乡村景色。而他配的文字更是让我们笃信他的确是个电影诗人。“影像&#xff0c;是真理的印记”“影像是谷粒&…

MFC界面编程新思路--模仿MATLAB式的界面

像下面的这个图片一样&#xff0c;做一个图像测量的软件&#xff0c;界面需要模仿MATLAB&#xff0c;以前老是新建一个对话框式的MFC应用程序&#xff0c;或者是一个SDI的应用程序&#xff0c;搞了一年&#xff0c;慢慢的也想到了一种新的思路&#xff0c;而且今天也做了一个De…

敏捷是如何使你跑得更快?

对于为何采用敏捷软件开发这个问题&#xff0c;企业经常提到的原因之一是希望能够更快地交付软件。研究表明敏捷项目能够进行地更快&#xff0c;例如《敏捷项目的成功证据》一文中描述的哥伦布市敏捷工作效率基准项目。\u0026#xD;\n在博文《谁说敏捷项目不能更快一些》中&#…

WinCE电源管理的简单介绍

电源管理的目的是节能,基本的节能方法是使系统适时的进出休眠状态.比如用户按下On/Off按钮,或者监视用户活动的定时器超时,或者应用呼叫api都可以使得系统休眠,用户再次按下On/Off或者其他唤醒中断将使得系统退出休眠.从而可见,电源管理模块和用户活动情况密不可分,电源管理是用…

算法映射技术

算法映射技术 将图像处理的算法转换为FPGA系统设计的过程为算法映射。 映射过程的首要目标便是确定系统设计的结构,在图像处理中常用的两种系统设计结构:流水线结构和并行阵列结构 1、流水线设计 (1)基本概念 流水线处理源自现代工业生产装配线上的流水作业,是指将待处理…

WS_EX_COMPOSITED是个BUG?

新建的SDI应用程序&#xff0c;在删除 文档视图结构以后&#xff0c;突然出现资源文件(*.rc)错误&#xff0c;说是WS_EX_COMPOSITED没有定义&#xff0c;只好删除了事&#xff0c;不知道怎么回事。

《北妹》:中国七零后作家的一次火山喷发(答记者问)

1&#xff0c;您是如何留意到盛可以及其创作的&#xff1f;是她在哪个方面的特质或者特点很突出呢&#xff1f; 答&#xff1a;我很早就知道盛可以&#xff0c;但是真正读她的作品是从《道德颂》开始的&#xff0c;当时我被她对人性尤其是男性的思考和揭示深深地震撼了。她对生…

windowsCE异常和中断服务程序初探

windowsCE异常和中断服务程序初探 ---------by nasiry 转载请说明出处 1。中断/异常相量的装入和执行方式。 中断和异常都是异步发生的事件&#xff0c;当该事件发生&#xff0c;系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就…

ISERDES Guidelines

ISERDES Guidelines ISERDES模块的作用在于实现高速源同步输入数据的串并转换。 OSERDES模块的作用在于实现高速源同步输出数据的并串转换。 SERDES支持SDR和DDR两个模式。 SDR模式支持2、3、4、5、6、7、8bit位宽; DDR模式支持4、6、8bit位宽,10或14bit位宽需要两个模块级…

VC 2010的MFC函数,CMFCVisualManager::GetInstance()可能导致内存泄露

今天在网上看到一篇文章&#xff0c;关于CMFCVisualManager的内存泄露问题&#xff08; 链接是 http://zhanyonhu.blog.163.com/blog/static/1618604420113208121859/&#xff09;&#xff0c;当然还有其他的关于CMFCButton控件也有内存泄露问题&#xff0c;乱七八糟扯蛋&#…

SRX alarm: Autorecovery information needs to be saved

One of our srx system alarm light is on. Check system alarms and fond this:[email protected]> show system alarms node0:————————————————————————–1 alarms currently activeAlarm time Class Description2013-03-13 16:50…

简单深入两个虚拟内存API VirtualAlloc及VritualCopy

VirtualAlloc : (配置虛擬記憶體) [MSDN] http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx LPVOID WINAPI VirtualAlloc (LPVOID lpAddress, //所要分配記憶體區域虛擬位址的起始位址DWORD dwSize, //要分配或者保留的區域的大小DWORD flAllocationType, //分…

对传统视觉惯性的颠覆

何汶玦[日常影像]艺术展昨天在798白盒子艺术馆开幕。评论界认为&#xff1a;何汶玦的作品是对电影影像的摆脱&#xff0c;回归日常影像。我的理解是&#xff0c;或许电影影像是被导演、演员和摄影既定的&#xff0c;没有了我们自己的观察和省略。所谓日常就是我们每个人目光所及…

映射之计算技术

映射之计算技术 1、算法转换 (1)、定常数转换 对于定常数,可以通过一定的转换将其转换为移位和加法运算,从而减少乘法器和除法器的使用。 考虑以下乘法运算的实现 dout = din x 255 转换后 dout = din x (256 - 1) = (din << 8) - din dout = din x 123 转换后 do…

Digimeter 软件

这是新做的一款对图像进行测量分析的软件。可以对图像内容进行手工精确测量&#xff0c;进行自动对象识别&#xff1b;图像可以是X光图片、显微照片等&#xff0c;支持JPG、GIF、TIFF、BMP、PNG、WMF、EMF和DICOM多种格式&#xff1b;图片可以旋转、反转、拉伸&#xff0c;明暗…

由中行IBM大型机宕机谈银行系统运维

12月15日中行IBM大型机宕机&#xff0c;系统没有第一时间切换到热备或者异地容灾上&#xff0c;直接影响中行的信用卡支付相关业务&#xff0c;直到4小时之后才恢复服务。由于银行业务的特殊性&#xff0c;对于系统的可用性要求极高&#xff0c;就此事件&#xff0c;我们采访了…

修饰符const精妙之处

const用法详解 面向对象是C的重要特性. 但是c在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只能被读 const int i5; int j0; ... ij; //非法&#xff0c;导致编译错误 ji…

JSON.NET 5中的架构变更

Newtonsoft对JSON.NET进行了两个架构升级&#xff0c;以使其能够更容易地在涉及第三方库的项目中使用。这两个特性是默认设置和扩展数据。\u0026#xD;\n在JSON.NET 5r5中&#xff0c;开发者可以使用JsonSerializerSettings类重写序列化/反序列化选项。每次调用JsonConvert方法的…