Size: a a a

2021 March 14

BU

Boris Usievich in pro.cxx
magras
Ну в плюсах просто невозможно работать с "плоским" двухмерным массивом произвольной размерности. Поэтому используют одномерные.
Возможно, достаточно написать небольшой хелпер-класс, который будет двумерную индексацию преобразовывать в одномерную. Хелперу конечно придется задать размер, а как же иначе?
источник

m

magras in pro.cxx
Boris Usievich
Возможно, достаточно написать небольшой хелпер-класс, который будет двумерную индексацию преобразовывать в одномерную. Хелперу конечно придется задать размер, а как же иначе?
Я о том, что невозможно передать в функцию двухмерный массив не зафиксировав все кроме одного измерений.
void foo(int a[][N]);

Из этого типа невозможно убрать N. В плюсах просто нет типа для плоских многомерных массивов произвольного размера. То что одномерный массив можно индексировать как многомерный, зная его размеры это понятно, но на мой взгляд не делает его многомерным.
источник

BU

Boris Usievich in pro.cxx
передать можно все, есть преобразования типа, например к указателю на первый элемент. Но размер придется передать отдельно и возможны грабли если передать неправильный размер
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Я о том, что невозможно передать в функцию двухмерный массив не зафиксировав все кроме одного измерений.
void foo(int a[][N]);

Из этого типа невозможно убрать N. В плюсах просто нет типа для плоских многомерных массивов произвольного размера. То что одномерный массив можно индексировать как многомерный, зная его размеры это понятно, но на мой взгляд не делает его многомерным.
Дак двумерный массив в С++ это и есть такой хелпер с одномерным массивом внутри по сути
источник

m

magras in pro.cxx
Boris Usievich
передать можно все, есть преобразования типа, например к указателю на первый элемент. Но размер придется передать отдельно и возможны грабли если передать неправильный размер
Не согласен.

Во-первых, я не уверен, что можно легально преобразовать int[N][M] в int[N*M]. Я не исключаю этого но мне нужно покопаться в стандарте.

Во-вторых, да, двухмерный массив можно скастить хоть к void* и передать в функцию. Но чтобы восстановить тип двухмерного массива нужно задать его размер в компайл тайме. Да, технически возможно сделать что-то вроде
if (n==1) { auto array = (int[][1])input; ... }
if (n==2) { ...

но это уже совсем извращение.

В прочем это спор о терминологии. Я не думаю что имеет смысл его продолжать.
источник

m

magras in pro.cxx
Побитый Кирпич
Дак двумерный массив в С++ это и есть такой хелпер с одномерным массивом внутри по сути
Он работает только для статических массивов.
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Не согласен.

Во-первых, я не уверен, что можно легально преобразовать int[N][M] в int[N*M]. Я не исключаю этого но мне нужно покопаться в стандарте.

Во-вторых, да, двухмерный массив можно скастить хоть к void* и передать в функцию. Но чтобы восстановить тип двухмерного массива нужно задать его размер в компайл тайме. Да, технически возможно сделать что-то вроде
if (n==1) { auto array = (int[][1])input; ... }
if (n==2) { ...

но это уже совсем извращение.

В прочем это спор о терминологии. Я не думаю что имеет смысл его продолжать.
1) В массив нет (но это не точно), но в указатель, который потом так индексировать - вполне
источник

AS

Anatoly Shirokov in pro.cxx
magras
Не согласен.

Во-первых, я не уверен, что можно легально преобразовать int[N][M] в int[N*M]. Я не исключаю этого но мне нужно покопаться в стандарте.

Во-вторых, да, двухмерный массив можно скастить хоть к void* и передать в функцию. Но чтобы восстановить тип двухмерного массива нужно задать его размер в компайл тайме. Да, технически возможно сделать что-то вроде
if (n==1) { auto array = (int[][1])input; ... }
if (n==2) { ...

но это уже совсем извращение.

В прочем это спор о терминологии. Я не думаю что имеет смысл его продолжать.
любой многомерный массив в С++ линеен по своей природе, поэтому абсолютно легально обращаться с ними, как с линейной структурой
источник

AS

Anatoly Shirokov in pro.cxx
во-вторых, такие вопросы мы в чате для новичков обсуждаем. почему это здесь?
источник

AP

Alexander Petrov in pro.cxx
Anatoly Shirokov
во-вторых, такие вопросы мы в чате для новичков обсуждаем. почему это здесь?
Потому что никто не знает что такой чат есть :)
источник

BU

Boris Usievich in pro.cxx
Видимо потому, что никто из админов не дал пинка в нужном направлении 😜
источник

AS

Anatoly Shirokov in pro.cxx
Alexander Petrov
Потому что никто не знает что такой чат есть :)
да ладно, в описании чата прямая ссылка
источник

AP

Alexander Petrov in pro.cxx
Anatoly Shirokov
да ладно, в описании чата прямая ссылка
Это нужно описание чата читать
источник

SK

Stas Koynov in pro.cxx
просто местный цербер Даня отлучился на покушать.
источник

AS

Anatoly Shirokov in pro.cxx
Stas Koynov
просто местный цербер Даня отлучился на покушать.
он дружинник
источник

D

Danya in pro.cxx
Alexander Petrov
Это нужно описание чата читать
"это нужно уметь читать"
источник

m

magras in pro.cxx
Побитый Кирпич
1) В массив нет (но это не точно), но в указатель, который потом так индексировать - вполне
Я не вижу где стандарт допускает каст int(*)[N] в int*. Компиляторы требуют reinterpret_cast'а для такого преобразования. На сколько я вижу, такой каст нарушает требование что типы int[N] и int являются similar, так как у них отличается n, и как следствие нарушает правила алиасинга.
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Я не вижу где стандарт допускает каст int(*)[N] в int*. Компиляторы требуют reinterpret_cast'а для такого преобразования. На сколько я вижу, такой каст нарушает требование что типы int[N] и int являются similar, так как у них отличается n, и как следствие нарушает правила алиасинга.
Не видишь где стандарт допускает
int arr[N];
int* p = arr;

?
источник

ПК

Побитый Кирпич... in pro.cxx
Неявное преобразование массива на указатель на свой первый элемент это называется
источник

D

Dmitriy in pro.cxx
Побитый Кирпич
Не видишь где стандарт допускает
int arr[N];
int* p = arr;

?
Это int(&)[N] -> int*
источник