Size: a a a

2021 March 14

MK

Mikhail Kalugin in pro.cxx
Sergey Skvortsov
Массив в стандарте C++ определен только одномерный
Но массив - тоже легальный тип элемента массива. И в C и в С++ многомерные массивы это массивы массивов.
источник

P

Ponytale 🇷🇺 in pro.cxx
Vlad Serebrennikov
массив массивов это иерархия подобъектов
то есть int[N][M] это не просто сахар над int[N*M]
что конкретно тебе дает такое рассмотрение массивов??
источник

AG

Andrey Glebov in pro.cxx
Ilia Zviagin
Да ты шо?
как раз Note 3 и говорит о том, как трактуется "многомерный массив"
declares an array of three elements, each of which is an array of five elements, each of which is an array of seven integers.
источник

P

Ponytale 🇷🇺 in pro.cxx
зачем плодить сущности там, где их нет?
источник

VS

Vlad Serebrennikov in pro.cxx
Ponytale 🇷🇺
что конкретно тебе дает такое рассмотрение массивов??
источник

P

Ponytale 🇷🇺 in pro.cxx
я дважды перечитал и не понял. не заставляй перечитывать в третий раз
источник

IZ

Ilia Zviagin in pro.cxx
Это лишь жонглирование словами.

Тебе объясняют так или иначе.
источник

P

Ponytale 🇷🇺 in pro.cxx
может быть, все-таки, ты усложняешь?
источник

АК

Александр Караев... in pro.cxx
Пора добавить новое правило к правилам чата - запрещено отрицать UB :)
источник

SS

Sergey Skvortsov in pro.cxx
Mikhail Kalugin
Но массив - тоже легальный тип элемента массива. И в C и в С++ многомерные массивы это массивы массивов.
Да, все так
источник

SS

Sergey Skvortsov in pro.cxx
Александр Караев
Пора добавить новое правило к правилам чата - запрещено отрицать UB :)
Так это админов придется банить, так нельзя
источник

IZ

Ilia Zviagin in pro.cxx
Ponytale 🇷🇺
может быть, все-таки, ты усложняешь?
Он не усложняет, он выдумывает то чего нет
источник

P

Ponytale 🇷🇺 in pro.cxx
Александр Караев
Пора добавить новое правило к правилам чата - запрещено отрицать UB :)
первое правило UB - никогда не отрицать UB😂
источник

АК

Александр Караев... in pro.cxx
Sergey Skvortsov
Так это админов придется банить, так нельзя
Ну, подговорим других админов, чтобы Илья начал слушаться..
источник

IA

Ilia Abernikhin in pro.cxx
Ilia Zviagin
Нет, ты неправ.
Ещё раз, нет способа передать многомерный массив в функцию. Только через pointer decay, где массив автоматом становится одномерным
Я показывал способ это сделать, причем коректно работаюший в примитивном случае, я не утверждаю что в более сложных случаях не полезут проблемы, потому и говорю ответственность за такой код на ваших плечах
источник

MK

Mikhail Kalugin in pro.cxx
Александр Караев
Пора добавить новое правило к правилам чата - запрещено отрицать UB :)
Отрицание UB  - суть ересь.
источник

LA

Liber Azerate in pro.cxx
Ilia Zviagin
Алло, Массив один.
Это один объект, со всех точек зрения.
Собственно вот, смотрим в такой последовательности:
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. Всё, ходить под двумерному массиву как одномерному нельзя
источник

IZ

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

IA

Ilia Abernikhin 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;
}

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

A

Anton in pro.cxx
Ilia Zviagin
Нет, ты неправ.
Ещё раз, нет способа передать многомерный массив в функцию. Только через pointer decay, где массив автоматом становится одномерным
int f(int a[4][4]);
источник