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

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

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

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

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

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

0

Решение

это

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

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

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

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

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

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

4

Другие решения

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

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

const int total = 3;
3

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

int const total = 3;

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

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

1

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

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

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
0