2014-02-05 4 views
0

РЕШЕННЫЙ! (См. Редактировать)Инициализация частного массива C++

Я пытаюсь инициализировать пару массивов, которые являются частными членами класса. Я пытаюсь использовать публичную функцию для инициализации этих частных массивов. Мой код выглядит следующим образом:

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: error: expected primary-expression before ']' token /../AP_PitchController.cpp:106: error: expected primary-expression before '{' token /../AP_PitchController.cpp:106: error: expected `;' before '{' token

А вот мои личные заявления:

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

Кто-нибудь знает, что я делаю неправильно, чтобы инициализировать эти массивы по вызову initGains()?

EDIT:

Я нашел ответ в одном из связанных с этим вопросов.

Все, что нужно сделать, это предоставить размер массива для инициализации:

static float _kpgArray[11]; 

А затем инициализировать его вне функции в файле .cpp:

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

Спасибо за ваш вход!

+1

частный не имеет ничего общего с этими ошибками. – Almo

+1

Посмотрите на связанные вопросы справа. – codah

ответ

1

Во-первых, вы не можете использовать синтаксис инициализации-лист, который вы используете, так как вы уже объявили свои массивы (например uint8_t _fvelArray = { ... }; будет действительным при первом объявим его под private: но _fvelArray = { ... }; не действует в методе initGains). Вы также должны объявить размер каждого массива в ваших частных объявлений:

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

После того, как вы сделали эти шаги, вы можете заполнить массивы:

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

Есть причина, вы не инициализировать свои массивы сразу? Изменятся ли значения усиления? Ваш метод называется initGains в конце концов.Если нет, то используйте синтаксис инициализатора-лист в момент декларации:

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

Я не спустил вниз, но ваш ответ неправильный. эти массивы являются переменными класса, и вы можете использовать этот синтаксис только при объявлении. В этой функции указанные переменные класса не объявляются. Кроме того, dropping [] не помогло бы. – Borgleader

+0

@Borgleader обновлен, чтобы отразить то, что я хотел сказать. – bblincoe

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]; 
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, ...} выражение is initializer-list an не может использоваться для инициализации массива вне его определения. Это означает, что вы можете написать uint8_t _fvelArray_tmp[] = {20, ...};, а затем скопировать его в свою переменную: memcpy (_fvelArray, _fvelArray_tmp, sizeof (_fvelArray_tmp));, но не инициализировать некоторую уже существующую переменную. Но если вы используете std::array или std::vector для _fvelArray, вы можете просто написать _fvelArray = {20, ...}; (но он работает только для C++ 11).
Смежные вопросы