vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2020-04-11 02:39 pm

Си++ вам не Си

В частности, передавать массивы в качестве параметров лучше всего по ссылке:
void foo(int (&array)[10])
{
    //...
}

Такую процедуру не удастся вызвать с параметром - массивом другого, неподходящего размера.
Если же написать, как в Си:
void bar(int array[10])
{
    //...
}

то такой параметр фактически обрабатывается как "int *array", и никакой проверки размера массива не делается.
ircicq: (Default)

[personal profile] ircicq 2020-04-11 10:11 pm (UTC)(link)
Рекомендуется всё же форма: std::array<int, 10>
spamsink: (Default)

[personal profile] spamsink 2020-04-12 02:02 am (UTC)(link)
Если процедура умеет только один конкретный тип данных, то его надо один раз назвать именованным классом и не мучиться с магическими константами. А в начале процедуры, если очень лень писать имя поля, можно написать и что-то типа int (&array)[] = arg.array; - тип уже проверен.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2020-04-12 02:06 am (UTC)(link)
Ой как интересно нынче. А 10 - это только литерал может быть? А константа? А что-нибудь вычисляемое?

[personal profile] sergegers 2020-04-12 04:36 am (UTC)(link)
Лучше void foo(std::span<int, 10>), но всё это синтаксический сахар.
Edited 2020-04-12 04:37 (UTC)
dluciv: (Default)

[personal profile] dluciv 2020-04-12 07:19 am (UTC)(link)
Дополню: в Си не делается для старшего индекса, который для одномерного массива единственный. У многомерного массива все размерности, кроме старшей, являются частью типа, иначе его просто индексировать не получится.
fenikso: (Default)

[personal profile] fenikso 2020-04-14 06:15 am (UTC)(link)
Для передачи массива как параметра в варианте с неизвестным заранее размером массива еще бывает полезен absl::Span (https://abseil.io/tips/93), но это когда можно дополнительные библиотеки подключать. Еще удобен тем что в функцию которая принимает absl:Span, можно передать вектор и т.п.
vlkamov: Рембрандт. Автопортрет с широко открытыми глазами. (Default)

[personal profile] vlkamov 2020-04-15 03:38 pm (UTC)(link)
Мало что понял, особенно комментарии, но вот здесь
> void bar(int array[10])
получается, что 10 - буквально ни о чем. Что с таким же успехом можно ставить 20, 2
Так ?