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

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

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

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

Date: 2020-04-11 22:30 (UTC)
norian: (Default)
From: [personal profile] norian
этот темплейтный класс с кучей потрохов вообще низачем не нужен

вот что не рекомендуецца так это числовые константы в коде, их лучше определять в топовом хедере как const size_t myArrayLimit = 10; и не искать потом по всему коду

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

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

Date: 2020-04-12 02:28 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Да, в C++ сейчас есть constexpr функции
Их можно вычислять в Compile time

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

Date: 2020-04-12 20:13 (UTC)
From: [personal profile] sergegers
Он обслуживает и C array и std::array и динамические массивы. Причём статические массивы с проверкой в compile time.

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

Date: 2020-04-13 03:04 (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
всегда считал, что нет многомерных массивов

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

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

Date: 2020-04-16 04:53 (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
Да

массив становится указателем на 1й елемент

https://opensourceforu.com/2016/09/decayintopointers/

Date: 2020-04-16 06:59 (UTC)
vlkamov: Рембрандт. Автопортрет с широко открытыми глазами. (Default)
From: [personal profile] vlkamov
Howdo - это само собой.

Просто я люблю, чтобы код был читабелен даже козе, например
https://vlkamov.livejournal.com/685130.html

Если массив всегда из 10 элементов, то 10-ка должна быть прописана в коде функции.
Тогда ею вообще не следует захламлять вызов и объявление, например

void bar(int array[])
или для ясности
void bar(int array_10[])

Но если массив то там то сям разной длины, функции следует сообщить, сколько чего, например
void bar(int array[], 10)
...
void bar(int array[], 22)

Хотя не уверен, что компилятор напрямую скушает такие конструкции.
Edited Date: 2020-04-16 07:05 (UTC)

Date: 2020-04-17 03:55 (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
> void bar(int array[10])
> или для ясности
> void bar(int array_10[])

так проблема в том, что человеку, возможно, это и помогает, а железяке - нет. Нет возможности громко закричать если юсер запулил туда массив из 9ти элементов.

> void bar(int array[], 22)


это Фортран с точки зрения С