首页 > 解决方案 > 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);
}

标签: carduinotypedeffuzzy-logic

解决方案


typedef是为函数指针创建类型别名。

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

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

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


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


推荐阅读