Как инициализировать массив uint64_t в 0 в C++?

Я использую Atmel 6.2 и пишу приложение для Arduino. У меня проблема с этими строками кода:

int total = 3;
uint64_t myarray[total] = {};

Это дает следующую ошибку

ошибка: граница массива не является целочисленной константой перед токеном ']'

Почему это происходит?

4 ответа

Решение

Это

int total = 3;
uint64_t myarray[total] = {};

является определением массива переменного размера, потому что размер массива не является константным выражением времени компиляции.

Такие массивы условно поддерживаются C99. Однако эта функция отсутствует в C++ (хотя некоторые компиляторы могут иметь свои собственные языковые расширения, включающие эту функцию в C++), и компилятор правильно выдает ошибку.

Либо вы должны использовать константу в определении массива, например, так

const int total = 3;
uint64_t myarray[total] = {};

или вы должны рассмотреть возможность использования другого контейнера, как, например, std::vector<uint64_t> если вы предполагаете, что размер массива можно изменить во время выполнения.

Вы должны предоставить константы времени компиляции (или constexprs) как размер массива.

Использовать этот:

const int total = 3;

"Всего" должно быть постоянным. Также я бы предпочел std::array массивам в стиле C (просто личное предпочтение).

int const total = 3;

std::array<uint64_t, total> values = {};

Если вам нужен динамический массив, используйте std:: vector.

Ваш вопрос не очень ясен, вы хотите обнулить инициализацию или хотите исправить ошибку.

Как и предполагалось, вы можете использовать константу времени компиляции для исправления ошибки.

const int total = 3;
uint64_t myarray[total] = {};

Для инициализации нуля вы можете использовать следующий код.

std::fill_n(myarray, total, 0);

Но, если вам нужен массив переменного размера, вы можете сделать это с помощью указателей следующим образом.

int total = 3;

uint64_t  *myarray = new uint64_t [total]; // This will be created at run time
Другие вопросы по тегам