Size: a a a

2021 March 14

m

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

?
Здесь все окей, это array-to-pointer conversion.
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Здесь все окей, это array-to-pointer conversion.
Ну дак я про него и говорил
источник

m

magras in pro.cxx
Побитый Кирпич
Ну дак я про него и говорил
А при чем здесь это если речь идет о
> int(*)[N] в int*
?
Здесь уже нет массива. Есть указатель на массив полученный как раз через array-to-pointer conversion.
источник

ПК

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

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

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

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

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

Я говорил, что можно преобразовать int[N][M] в int*. И дальше его индексировать одномерно
источник

IZ

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

@drMagras
источник

m

magras in pro.cxx
Хорошо, вы согласны, что array-to-pointer conversion применяется автоматически?
источник

IZ

Ilia Zviagin in pro.cxx
magras
Хорошо, вы согласны, что array-to-pointer conversion применяется автоматически?
Да, так и есть
источник

m

magras in pro.cxx
Теперь передайте двухмерный массив int[1][2] в функцию принимающую int*.

upd: Спойлер, не сработает. Нужен будет reinterpret_cast.
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Теперь передайте двухмерный массив int[1][2] в функцию принимающую int*.

upd: Спойлер, не сработает. Нужен будет reinterpret_cast.
&arr[0][0]
источник

ПК

Побитый Кирпич... in pro.cxx
Да даже arr[0] сработает
источник

ПК

Побитый Кирпич... in pro.cxx
Так что не пойму с чем ты споришь
источник

SK

Stas Koynov in pro.cxx
magras
Теперь передайте двухмерный массив int[1][2] в функцию принимающую int*.

upd: Спойлер, не сработает. Нужен будет reinterpret_cast.
да почему каждый второй в этом чате ищет UB и касты. ну блин массив это кусок памяти. в Си и ++, многомерность массива не вшита в это понятие в рантайме. оно валидно только если есть (сохранен) тип чтобы компилятор мог сообщить о нарушениях типа (во время компиляции). но если вы уверены и понимаете что вы делаете. для вас это просто кусок памяти. как вы будете с ним работать. как с кучей пикселей. или как с картинкой 32х32 пикселя или как 32 строки по 32 пикселя или еще чего... ваше дело.
источник

m

magras in pro.cxx
Да, так можно, пока ты работаешь только с первым столбцом. Как только ты выходишь за него это UB по моим представлениям, так как это массив размера N, а не N*M.
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Да, так можно, пока ты работаешь только с первым столбцом. Как только ты выходишь за него это UB по моим представлениям, так как это массив размера N, а не N*M.
Вроде тут писали что в стандарте прописано устройство многомерных массивов. Думаю там есть нужные мне гарантии
источник

SS

Sergey Skvortsov in pro.cxx
Побитый Кирпич
Вроде тут писали что в стандарте прописано устройство многомерных массивов. Думаю там есть нужные мне гарантии
Ссылочку бы, совершенно неочевидное свойство
источник

m

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

https://eel.is/c++draft/dcl.array#9
источник

ПК

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

https://eel.is/c++draft/dcl.array#9
Дак у нас нет никаких подмассивов внутри функции. У нас там указатель на какой то int. Дальше идёт арифметика с указателями
источник

SS

Sergey Skvortsov in pro.cxx
magras
Да, стандарт гарантирует, что подмассивы будут лежать последовательно. Но из этого не следует что магически меняется размер подмассива.

https://eel.is/c++draft/dcl.array#9
А где гарантии?
Then i is added, which on typical implementations ...
источник

SS

Sergey Skvortsov in pro.cxx
Побитый Кирпич
Дак у нас нет никаких подмассивов внутри функции. У нас там указатель на какой то int. Дальше идёт арифметика с указателями
Арифметика с указателями будет валидна только внутри самого первого одномерного массива
источник

SS

Sergey Skvortsov in pro.cxx
источник