解决了! (见编辑)
我正在尝试初始化一些属于类的私有成员的数组。我试图使用公共函数来初始化这些私有数组。我的代码如下所示:
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};
感谢您的投入!
答案 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)
这里有几个问题:
uint8_t _fvelArray[];
不会声明数组,而是声明指针,与uint8_t *_fvelArray;
相同。如果要声明固定大小的数组,则需要编写uint8_t _fvelArray[11];
或c ++ 11 std::array<uint8_t, 11> _fvelArray;
。对于可变长度数组,您应该使用std::vector<uint8_t> _fvelArray;
。{20, ...}
expression是一个初始化列表,不能用于其定义之外的数组初始化。这意味着您可以编写uint8_t _fvelArray_tmp[] = {20, ...};
然后将其复制到您的变量:memcpy (_fvelArray, _fvelArray_tmp, sizeof (_fvelArray_tmp));
,但不能初始化一些已存在的变量。但是,如果您对std::array
类型使用std::vector
或_fvelArray
,则只需编写_fvelArray = {20, ...};
(但它仅适用于c ++ 11)。