Установка размера массива в значение const, полученное из деления другой константы

У меня есть эти две предполагаемые константы:

int const MATRIX_SIZE = 1000;

int const LONGEST_LR_LINK = (int)floor(MATRIX_SIZE/2);

Я пытаюсь объявить массив:

int lrLinkArray [LONGEST_LR_LINK];

Я получаю ошибку:

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

Не было бы так много проблем, чтобы вручную подключить половину MATRIX_SIZE для LONGEST_LR_LINK, но мне любопытно, каким будет решение этой проблемы. Это плохая практика делать какие-либо вычисления для const?

2

Решение

Целочисленное деление в C ++ автоматически округляется. Так что если у вас есть определение

int const LONGEST_LR_LINK = MATRIX_SIZE/2;

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

int lrLinkArray [LONGEST_LR_LINK];

все должно быть в порядке. Кроме того, floor(MATRIX_SIZE/2) во всяком случае, не делает то, что думаешь; вам придется написать floor(MATRIX_SIZE/2.0) для того, чтобы форсировать нецелое деление.

7

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

int const LONGEST_LR_LINK = MATRIX_SIZE/2;

Целочисленное деление уже округляется.

3

Целочисленное деление должно делать то, что вы хотите, мы можем увидеть это из проект стандарта C ++, в разделе 5.6 Мультипликативные операторы это говорит:

[…] Для целочисленных операндов оператор / дает алгебраический фактор
с любой дробной частью отбрасывается;81[…]

Чтобы понять, почему это не так, вы должны понимать, что даже если вы инициализируете MATRIX_SIZE с литералом, который делает его постоянным выражением станд :: этаж это не функция constexpr и поэтому LONGEST_LR_LINK также не является константным выражением и не может использоваться для границ массива, которые требуют интегрального константного выражения.

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

2