Anatoly
а так, пожалуйста, но с модификацией исходной строки
Ioann_
Угу. Все верно. Ну я это к чему: во первых, вчерашний код тупо mallo чил, во вторых - действительно, многие при написании парсера попадаются в эту ловушку. Например, стоит погуглить парсеры xml ...
Anatoly
ну вот такой фиговый auto
Александр
string_view шикарен
Ioann_
Еще, для тех кто в танке - есть такая фишка, что вот такая фича int mas[100][100][100] - полностью и целиком лежит линейном куске памяти.
Pepe 🐸
судя по логам низя массив объявлять как auto
Думаю тому що массив это пойнтер и он не может догадаться на что он указывает
Александр
</sarcasm>
Ioann_
Да я так на всякий. Часто встречаюсь что матрицы читают используя два цикла :)
Александр
Да я так на всякий. Часто встречаюсь что матрицы читают используя два цикла :)
код с двумя циклами явно читабельнее, это микрооптимизация
Ioann_
код с двумя циклами явно читабельнее, это микрооптимизация
Ну так, что можно и в один :) Я лично в один читаю и в один складываю.
ГуНиСе️
ГуНиСе️
не надо путать массивы с указателями
Ioann_
А еще можно писать new не в цикле, а сразу
Pepe 🐸
массив — это не "пойнтер" и даже не указатель
Как он представляется? Суть все равно в том что тип не возможно узнать из массива.
Mikhail
ясно что такая конструкция преобразуется в std::initializer_list<T>, хотя были проблемы в gcc: https://stackoverflow.com/questions/32515183/const-auto-stdinitializer-list-difference-between-clang-and-gcc но даже если и все скомпилится, то именно в тип std::initializer_list<int>? абсолютно на всех архитектурах? я в этом сомневаюсь.. опять же если применять auto x = {0 ,1} то по аналогии должно быть auto x = {{0, 1}, {2, 3}} и т.д. но этого нет. Лично я, как и говорил ранее, сторонник использовать auto только там где и так явно определен тип, например: auto x = std::list<int> {0 , 1, 2}
ГуНиСе️
Как он представляется? Суть все равно в том что тип не возможно узнать из массива.
чё? в каком плане невозможно?? вот typeid и для массивов работает
Pepe 🐸
чё? в каком плане невозможно?? вот typeid и для массивов работает
Ок если это массив определенной длины то можно вычилить
Pepe 🐸
И если в компайл тайм задан
ГуНиСе️
Ок если это массив определенной длины то можно вычилить
а у массивов в языке С/С++ всегда длина задана
ГуНиСе️
да
Mikhail
да
посчитай какой длины массив arr в реалтайме в функции void foo(int *arr) { };? посчитать размер массива можно только в том где он определен
Anatoly
это не массив, а указатель
Anatoly
массив приводится к указателю на свой первый элемент, но это разные сущности
ГуНиСе️
только указатель на целое
ГуНиСе️
и функцию
Pepe 🐸
да
https://stackoverflow.com/questions/7221981/how-to-make-a-dynamic-sized-array-in-c Вот тут пример из С. Ты просто выделяешь память кпод массив
Anatoly
массив в сишечке это и есть указатель.
ну тогда на бис int a[] = {1, 2}; a += 1;
Anatoly
никакой a не указатель
Pepe 🐸
никакой a не указатель
Ты про pointer arithmetic?
Anatoly
я о том, что кто вам вбил в голову, что массив C/C++ это указатель?
Pepe 🐸
я о том, что кто вам вбил в голову, что массив C/C++ это указатель?
Ок, массив не указатель как ты там сказал. И я сталкивался с тем что указатель на одномерный массив типа инт и двумерный указывают на одно и тоже место но разные сущности
Anatoly
что одномерный, что n-мерный линейно представлены в памяти
Anatoly
int** -
Anatoly
это ниразу не тип двумерного массива
Mikhail
int a[2] = {0}; for (int i = -10; i < 0; i++) cout << a[-10] << endl; как весело бегать по отрицательным элементам все массивы так себя и должны вести.
Anatoly
UB
Pepe 🐸
это ниразу не тип двумерного массива
Если задать двумерный массив как массив указателей
Александр
Если задать двумерный массив как массив указателей
Тогда там адреса будут разные и вообще по всей памяти раскидано
Anatoly
Если задать двумерный массив как массив указателей
это будет массив указателей, а не двумерный массив
Pepe 🐸
Но по памяти наверно
Pepe 🐸
Раскиданы
Pepe 🐸
То есть не линейно
Александр
Нет адреса будут одинаковые
Нет. Тогда указатель на массив указателей и первый элемент этого массива разные будут
Mikhail
что это просто адрес памяти, относительно которого ты можешь перемещаться как ты вздумаешь (к абсолютно любому индексу). и никто тебя не остановит, пока не получишь SIGFAULT.
Pepe 🐸
У указателя на первый одномерный массив и указателя int**
Anatoly
массив не указатель, а поименованный линейный участок в памяти, над которым недопустима адресная арифметика, его нельзя переприсвоить, скопировать. он приводится к указателю, но это не позволяет говорить о том, что эти вещи одинаковы
Mikhail
хотя бы проверку на валидность доступа по индексу, и операцию взятия длины. только после этого массив в сишечке или плюсах станет массивом.
Anatoly
поэтому вопрос, кто вас научил трактовать массив как указатель?
Anatoly
назови фамилию и за ним придут
Mikhail
поэтому вопрос, кто вас научил трактовать массив как указатель?
мы сейчас говорим в контексте определенного языка и реализации. я не особо вижу фундаментальной разницы между иассивом и указателем в сях и плюсах.
Anatoly
ну, тогда это твоя проблема
Mikhail
по поводу std::array согласен абсолютно. но мы про int arr[]
Tom
+
Culminate
https://habrahabr.ru/post/251091/
Александр
Как минимум, массив на стеке - просто кучка значений, адрес которой явно нигде не сохранен и не занимает места. А реальный указатель обычно где-то валяется (в регистре, на стеке)
Nikita
как можно определить, выполнился constexpr во время компиляции или в рантайме?
Nikita
о, точно, спасибо
Александр
Присвоить constexpr переменной
Culminate
тогда уж #readme
Evgenii
cppreference
Nikita
если присвоить constexpr переменной то гарантирует что в рантайме?
Ioann_
Я бы сказал в духе С++ - фальш :)