常常遇到这样的情况:
情况一:替换了发布了sdk的dll,.h,lib文件后,客户的程序崩溃了。
原因在于旧版的.h里面定义了某些枚举值,新版的.h里面增加了一个枚举值,但是,没有在枚举值的最后面增加。这导致,旧的枚举值的再新的.h及dll里面的取值不一样!导致程序崩溃了!
情况二:老蔡要对比不同的haar特征的分类性能。我找出以前训练好的分类器,1a,1b,1c, 2a,2b等训练好的分类器文件拿过来都可以用。而是用mean特征的时候却崩溃了! 奇怪,mean特征可是我最近不久才训练的,怎么会崩呢?
经查,是枚举值改变搞的鬼!
typedef enum _FEA_TYPE
{
FT_EDGE_LEFT_RIGHT, // 左右特征
FT_EDGE_UP_DOWN, // 上下特征
FT_LINE_LEFT_MID_RIGHT, // 左中右特征
FT_LINE_LEFT_MID_MID_RIGHT, // 左中中右特征
FT_LINE_UP_MID_DOWN, // 上中下特征
FT_LINE_UP_MID_MID_DOWN, // 上中中下特征
FT_CENTROL_SURROUND, // 中心-四周特征
FT_LOW_FREQ, // :低频直流特征,直接计算矩形的像素和
FT_FACIAL_STRUCTURE, // :面部几何结构特征
FT_FACIAL_STRUCTURE_V2, // :同上
FT_FACIAL_STRUCTURE_V3, // :同上
FT_FACIAL_STRUCTURE_V1_1, // :同上
FT_MEAN, // :计算矩形像素的均值
}FEA_TYPE;
注意,在增加FT_FACIAL_STRUCTURE等特征时,没有在MEAN的后面增加,而是放在的MEAN的前面,这导致MEAN的枚举值改变。而之前训练好的分类器使用的是旧的枚举值!
总结:涉及到枚举值的相关变量,当增加新的枚举值时,要慎重,一般要加在旧的枚举值的最后。除非确定了该枚举值没有被以别的方式保存给第三方,比如训练好的分类器的特征文件,没有经过重新编译的客户程序,否则不可以在枚举值的中间新增枚举值!
本质上这类问题的都是由于数据序列化导致的! 著名的dll地域问题也是,增加一个虚函数,增加一个成员变量的新dll可能会都让客户程序崩掉!