c - Arduino上未声明变量的错误消息,使用typedef
问题描述
我用 MATLAB 文件和免费的在线转换工具在 arduino 上创建了一个模糊控制系统。但是,当我尝试运行它时,出现无法修复的错误:
'_FIS_ARR_OP' 尚未声明
我知道 typedef 是什么,但我不完全理解它是如何在这里与双括号一起使用的......
Header file
//***********************************************************************
#define FIS_TYPE float
#define FIS_RESOLUSION 101
#define FIS_MIN -3.4028235E+38
#define FIS_MAX 3.4028235E+38
typedef FIS_TYPE(*_FIS_MF)(FIS_TYPE, FIS_TYPE*);
typedef FIS_TYPE(*_FIS_ARR_OP)(FIS_TYPE, FIS_TYPE);
typedef FIS_TYPE(*_FIS_ARR)(FIS_TYPE*, int, _FIS_ARR_OP);
//***********************************************************************
使用 _FIS_ARR_OP 的函数声明:
FIS_TYPE fis_array_operation(FIS_TYPE *array, int size, _FIS_ARR_OP pfnOp)
{
int i;
FIS_TYPE ret = 0;
if (size == 0) return ret;
if (size == 1) return array[0];
ret = array[0];
for (i = 1; i < size; i++)
{
ret = (*pfnOp)(ret, array[i]);
}
return ret;
}
函数的使用:
FIS_TYPE fis_MF_out(FIS_TYPE** fuzzyRuleSet, FIS_TYPE x, int o)
{
FIS_TYPE mfOut;
int r;
for (r = 0; r < fis_gcR; ++r)
{
int index = fis_gRO[r][o];
if (index > 0)
{
index = index - 1;
mfOut = (fis_gMF[fis_gMFO[o][index]])(x, fis_gMFOCoeff[o][index]);
}
else if (index < 0)
{
index = -index - 1;
mfOut = 1 - (fis_gMF[fis_gMFO[o][index]])(x, fis_gMFOCoeff[o][index]);
}
else
{
mfOut = 0;
}
fuzzyRuleSet[0][r] = fis_min(mfOut, fuzzyRuleSet[1][r]);
}
return fis_array_operation(fuzzyRuleSet[0], fis_gcR, fis_max);
}
解决方案
这typedef
是为函数指针创建类型别名。
typedef FIS_TYPE(*_FIS_ARR_OP)(FIS_TYPE, FIS_TYPE);
定义_FIS_ARR_OP
为指向返回 a 的函数的指针,该函数FIS_TYPE
接受类型(按顺序)FIS_TYPE
和FIS_TYPE
.
第一组括号围绕新类型名称并*
使其成为指针。第二组就像您在函数声明中看到的那样,包含函数接受的变量类型的列表。
在 C 和 C++ 中,我都没有遇到任何错误。您的头文件是否包含在您使用定义的类型的所有源文件中?
推荐阅读
- ios - 常量“权重”推断为“()”类型,这可能是意外的
- azure-devops - 来自 Azure DevOps 的未经授权的响应
- r - 如何正确格式化 POST 请求的正文
- azure - 如何停止 Azure AD B2C 登录流程以允许用户更改电子邮件
- python - 处理 url 以在特殊字符后返回字符串/数字的长度
- azure-devops - 如何使用替换令牌在 web.config 中执行 XML 元素替换?
- dapper - 在 C# MVVM 和 SQL Server 2019/Visual Studios Pro 2019 中使用 Dapper
- ibm-cloud - IBM 区块链平台的前端
- javascript - 如何在模态中设置默认音量音频
- sql - 通过处理多个列提出问题