Size: a a a

2021 March 14

АК

Александр Караев... in pro.cxx
Mikhail Kalugin
Отрицание UB  - суть ересь.
Таки-да. Но чуть ли не ежедневно находится уникум, утверждающий, что UB - это выдумки.
источник

IZ

Ilia Zviagin in pro.cxx
Liber Azerate
Собственно вот, смотрим в такой последовательности:
http://eel.is/c++draft/dcl.array#1
Число N – это array bound, количество элементов типа Т
http://eel.is/c++draft/dcl.array#6
https://eel.is/c++draft/expr.add#4.2
И в данном случае написано n elements, со ссылкой на весь раздел выше. В приведённых же мной ссылках чётко указано, что является этим N. То есть у нас есть N элементов типа Т, где Т, например, тоже массив известного размера в таком случае, выражения вида "указатель на элемент массива" + какое-то число указывает на какой-то из подмассивов. Если мы вышли за границы это массива массивов, то есть за число N этих подмассивов, то у нас UB. Всё, ходить под двумерному массиву как одномерному нельзя
Я ещё раз говорю, в С и С++ правила определения арифметики указателей одинаковы.
В С нет другого способа передать массив в функцию кроме pointer decay.
Многомерный он или нет - все равно.

Так что все что вы там вычитали - чушь.
источник

IZ

Ilia Zviagin in pro.cxx
Ilia Abernikhin
не могу сказать что прям глубоко понял суть проблемы которую вы обсуждаете, но следуюший код отрабатывает совершенно коректно

#include <iostream>

void foo(int* array, size_t size);

int main() {
   int array[3][5] = {0};

   foo(array[0], 15);

   return 0;
}

void foo(int* array, size_t size) {
   for (int i = 0; i < size; ++i)
       std::cout << *(array + i) << std::endl;
}

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

VS

Vlad Serebrennikov in pro.cxx
Ilia Zviagin
Я ещё раз говорю, в С и С++ правила определения арифметики указателей одинаковы.
В С нет другого способа передать массив в функцию кроме pointer decay.
Многомерный он или нет - все равно.

Так что все что вы там вычитали - чушь.
decay убирает лишь одну размерность
http://eel.is/c++draft/conv.array#1
источник

LA

Liber Azerate in pro.cxx
Ilia Zviagin
Я ещё раз говорю, в С и С++ правила определения арифметики указателей одинаковы.
В С нет другого способа передать массив в функцию кроме pointer decay.
Многомерный он или нет - все равно.

Так что все что вы там вычитали - чушь.
То есть то, что прямо написано в стандарте, – чушь? С и С++ разные языки, в конце концов. То, что С++ в определённой степени совместим с С, это факт, да. Но никто не обещал, что один и тот же код на С и С++ будет работать одинаково и будет одинаково валидным. Скорее наоборот
источник

IZ

Ilia Zviagin in pro.cxx
Anton
int f(int a[4][4]);
Ок, знаешь, какой тип у этого параметра?
источник

A

Anton in pro.cxx
Ilia Zviagin
Ок, знаешь, какой тип у этого параметра?
int[4][4]
источник

MK

Mikhail Kalugin in pro.cxx
Anton
int[4][4]
int * :))
источник

IZ

Ilia Zviagin in pro.cxx
Anton
int[4][4]
Нет. int *
источник

AG

Andrey Glebov in pro.cxx
Ilia Zviagin
Ок, знаешь, какой тип у этого параметра?
int (*)[4]
источник

IZ

Ilia Zviagin in pro.cxx
Andrey Glebov
int (*)[4]
Нет
источник

P

Ponytale 🇷🇺 in pro.cxx
Anton
int[4][4]
int *
источник

IZ

Ilia Zviagin in pro.cxx
Liber Azerate
То есть то, что прямо написано в стандарте, – чушь? С и С++ разные языки, в конце концов. То, что С++ в определённой степени совместим с С, это факт, да. Но никто не обещал, что один и тот же код на С и С++ будет работать одинаково и будет одинаково валидным. Скорее наоборот
То что вы проинтерпретировали - чушь, а не стандарт
источник

IZ

Ilia Zviagin in pro.cxx
Anton
int[4][4]
Ну и что? Приходит озарение?
источник

IZ

Ilia Zviagin in pro.cxx
Vlad Serebrennikov
decay убирает лишь одну размерность
http://eel.is/c++draft/conv.array#1
Нет, всё
источник

A

Anton in pro.cxx
Ilia Zviagin
То что вы проинтерпретировали - чушь, а не стандарт
нет, если мы передаем [4][4] то это повод для оптимизации, и если эта оптимизация поломает логику, то се ля ви
источник

VS

Vlad Serebrennikov in pro.cxx
Ilia Zviagin
Нет, всё
https://godbolt.org/z/xTYean
смотри в ошибки
источник

IZ

Ilia Zviagin in pro.cxx
Anton
нет, если мы передаем [4][4] то это повод для оптимизации, и если эта оптимизация поломает логику, то се ля ви
Какой оптимизации?
источник

A

Anton in pro.cxx
Ilia Zviagin
Какой оптимизации?
векторной, например
источник

VS

Vlad Serebrennikov in pro.cxx
Sergey Skvortsov
О сколько нам открытий чудных готовят просвещенья дух
и не говори
источник