определите размер массива, если передано функции

Сегодня я искал switch / case в пакетных файлах и наткнулся на это. Я использовал это решение и расширил его с помощью goto exit.

IF "%1"=="red" echo "one selected" & goto exit
IF "%1"=="two" echo "two selected" & goto exit
...

echo "Options: [one | two | ...]

:exit 

Что приводит к состоянию по умолчанию (эхо-линия), и никаких дополнительных if, когда выбор найден.

36
задан Charles Khunt 9 June 2009 в 03:28
поделиться

6 ответов

The other answers overlook one feature of c++. You can pass arrays by reference, and use templates:

template <typename T, int N>
void func(T (&a) [N]) {
    for (int i = 0; i < N; ++i) a[i] = T(); // reset all elements
}

then you can do this:

int x[10];
func(x);

but note, this only works for arrays, not pointers.

However, as other answers have noted, using std::vector is a better choice.

51
ответ дан 27 November 2019 в 05:29
поделиться

Если это под вашим контролем, используйте контейнер STL, например вектор или двухстороннюю очередь, вместо массива.

14
ответ дан 27 November 2019 в 05:29
поделиться

Нет, это невозможно.

Одно решение: поместите специальное значение в последнее значение массива, чтобы его можно было распознать.

9
ответ дан 27 November 2019 в 05:29
поделиться

Одно из очевидных решений - использовать STL. Если это невозможно, лучше явно передать длину массива. Я скептически отношусь к использованию уловки дозорного значения в данном конкретном случае. Оно работает лучше с массивами указателей, потому что NULL - хорошее значение для дозорного. С участием массив целых чисел, это не так просто - вам нужно иметь "магическое" дозорное значение, которое нехорошо.

Боковое примечание: если ваш массив определен и инициализирован как

 int array[] = { X, Y, Z };

в той же области, что и ваш цикл, тогда

sizeof (array) вернет его реальный размер в байтах, а не размер указателя . Вы можете получить длину массива как

sizeof(array) / sizeof(array[0])

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

6
ответ дан 27 November 2019 в 05:29
поделиться

Можете ли вы попробовать добавить в массив нулевой символ \ 0 , а затем отправить его? Таким образом, вы можете просто проверить в цикле \ 0.

1
ответ дан 27 November 2019 в 05:29
поделиться

Если вы не можете передать размер, вам нужно различимое значение дозорного в конце (и вам нужно поместить его туда самостоятельно - как вы найдено, вы не можете доверять C ++, чтобы сделать это автоматически!). Невозможно просто заставить вызываемую функцию волшебным образом угадать размер, если он не передан и не используется явный, надежный дозорный.

3
ответ дан 27 November 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: