Я использую Atmel 6.2 и пишу приложение для Arduino. У меня проблема с этими строками кода:
int total = 3;
uint64_t myarray[total] = {};
Это дает следующую ошибку
ошибка: граница массива не является целочисленной константой перед токеном ‘]’
Почему это происходит?
это
int total = 3;
uint64_t myarray[total] = {};
является определением массива переменного размера, потому что размер массива не является константным выражением времени компиляции.
Такие массивы условно поддерживаются C99. Однако эта функция отсутствует в C ++ (хотя некоторые компиляторы могут иметь свои собственные языковые расширения, включающие эту функцию в C ++), и компилятор правильно выдает ошибку.
Либо вы должны использовать константу в определении массива, например, так
const int total = 3;
uint64_t myarray[total] = {};
или вы должны рассмотреть возможность использования другого контейнера, как, например, std::vector<uint64_t>
если вы предполагаете, что размер массива может быть изменен во время выполнения.
Вы должны предоставить константы времени компиляции (или constexpr
s) как размер массива.
Использовать этот:
const int total = 3;
«Всего» должно быть постоянным. Также я бы предпочел std :: array массивам в стиле C (просто личное предпочтение).
int const total = 3;
std::array<uint64_t, total> values = {};
Если вам нужен динамический массив, используйте станд :: вектор.
Ваш вопрос не очень понятен, вы хотите обнулить инициализацию или хотите исправить ошибку.
Как предложено, вы можете использовать константное выражение времени компиляции для исправления ошибки.
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