初始化私有数组c ++

时间:2014-02-05 20:32:32

标签: c++ arrays

解决了! (见编辑)

我正在尝试初始化一些属于类的私有成员的数组。我试图使用公共函数来初始化这些私有数组。我的代码如下所示:

void AP_PitchController::initGains(void){

_fvelArray[] = {20,     25,   30,    60,  90, 130, 160, 190, 220, 250, 280};
_kpgArray[]  = {6.0,   6.0,  8.0,   4.0, 3.0, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5};
_kdgArray[]  = {2000, 2000, 1900,   300, 300, 200, 200, 200, 200, 200, 200};
_kigArray[]  = {0.1,   0.1,  0.2,  0.25, 0.3, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5};

}

这些数组位于头文件AP_PitchController中,它们被声明为私有。当我尝试编译代码时,我会为每次初始化得到其中一条消息:

  

/../ AP_PitchController.cpp:106:错误:在']'标记之前预期的primary-expression   /../AP_PitchController.cpp:106:错误:在'{'标记之前预期的primary-expression   /../AP_PitchController.cpp:106:错误:预期`;'在'{'令牌

之前

这是我的私人声明:

Private:
uint8_t _fvelArray[];
float _kpgArray[];
float _kdgArray[];
float _kigArray[];

有没有人知道在调用initGains()时初始化这些数组我做错了什么?

编辑:

我在一个相关问题中找到了答案。

我需要做的就是为初始化提供一个数组大小:

static float _kpgArray[11];

然后在.cpp文件中的函数之外初始化它:

uint8_t AP_PitchController::_fvelArray[11] = {20, 25, 30, 60, 90, 130, 160, 190, 220, 250, 280};

感谢您的投入!

3 个答案:

答案 0 :(得分:1)

首先,您不能使用您正在使用的初始化列表语法,因为您已经声明了数组(例如uint8_t _fvelArray = { ... };private:下首次声明它时有效但{ {1}}在_fvelArray = { ... };方法中无效。您还必须在私有声明中声明每个数组的大小:

initGains

完成这些步骤后,您可以填充数组:

private:
    uint8_t _fvelArray[10]; // or whatever size you want

您是否有理由不立即初始化阵列?增益值会改变吗?毕竟,您的方法称为 initGains 。如果没有,请在声明点使用initializer-list语法:

_fvelArray[0] = 20;
_fvelArray[1] = 25;
// ...

答案 1 :(得分:1)

您只能在声明中使用初始化语法:

float _array[2] = {0.1f, 0.2f};

声明后,您必须单独初始化成员:

_array[0] = 0.1f;
_array[1] = 0.2f;

或者你可以在循环中完成:

float temp[2] = {0.1f, 0.2f};
for( int i = 0; i < 2; ++i )
    _array[i] = temp[i];

答案 2 :(得分:0)

这里有几个问题:

  1. uint8_t _fvelArray[];不会声明数组,而是声明指针,与uint8_t *_fvelArray;相同。如果要声明固定大小的数组,则需要编写uint8_t _fvelArray[11];或c ++ 11 std::array<uint8_t, 11> _fvelArray;。对于可变长度数组,您应该使用std::vector<uint8_t> _fvelArray;
  2. {20, ...} expression是一个初始化列表,不能用于其定义之外的数组初始化。这意味着您可以编写uint8_t _fvelArray_tmp[] = {20, ...};然后将其复制到您的变量:memcpy (_fvelArray, _fvelArray_tmp, sizeof (_fvelArray_tmp));,但不能初始化一些已存在的变量。但是,如果您对std::array类型使用std::vector_fvelArray,则只需编写_fvelArray = {20, ...};(但它仅适用于c ++ 11)。