【问题标题】:Error message for undeclared variable on Arduino, using typedefArduino上未声明变量的错误消息,使用typedef
【发布时间】:2019-08-23 12:35:40
【问题描述】:

我用 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);
}

【问题讨论】:

  • 考虑将minimal reproducible example 放在一起,这样我们就可以看到整个画面。您可能会发现无法在一个小示例中重复该问题,这可能会导致您找到答案
  • 其实也有支持模糊逻辑指令集的微控制器,比如飞思卡尔HCS12。不过,您必须得心应手地使用摩托罗拉汇编程序。但最终产品将围绕迟缓的 Arduino 转圈圈。
  • 愚蠢的问题......你是否包含了头文件?

标签: c arduino typedef fuzzy-logic


【解决方案1】:

这个typedef 正在为函数指针创建一个类型别名。

typedef FIS_TYPE(*_FIS_ARR_OP)(FIS_TYPE, FIS_TYPE);

_FIS_ARR_OP 定义为指向返回FIS_TYPE 的函数的指针,该函数接受类型为(按顺序)FIS_TYPEFIS_TYPE 的参数。

第一组括号围绕新类型名称和*,使其成为指针。第二组就像你在函数声明中看到的那样,包含函数接受的变量类型列表。


在 C 和 C++ 中,我都没有遇到任何错误。您的头文件是否包含在您使用定义的类型的所有源文件中?

【讨论】:

    【解决方案2】:

    我在 Visual Studio C 上编译了您的代码,没有出现任何错误。

    请注意,前导下划线是为编译器保留的,因此请考虑删除前导下划线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多