Анон, вкатываюсь сам-знаешь-во-что, дошел до указателей на С++ и скоро уже расхуярю клавиатуру, блядь, со психу. На 1-м пике то, что начал катать я по задаче из purecodecpp. На 2-м пике решение. Я уже, ебать их маманек вовседырно, тупо стал смотреть и писать как там. И НИХУЯ НЕ ПОЛУЧАЕТСЯ! Что, сука, не так?! Указатель на массив объявил? Объявил! Аргументы с педерастической * прописал? Прописал! Скопировал уже все, кроме названий переменных и функций и один хуй какая-то ошибка, погуглил - нихуя не понял, у меня такого как в гугле нет.
Блядь, анончики, сорре, сам нашел проблему, за каким-то хуем дважды объявляю parr, вот он и залупается. Посоветуйте, плез, задачек по указателям, с возрастающей сложностью, чтобы основательно погрузиться, тассзть.
>>257582055 Я читал, что де гиковатые товарищи любят прописывать везде расширения области видимости, чтобы-де избежать конфликтов с одинаковыми наименованиями из разных пространств имен.
>>257582121 Макаки просто время переводят на набор лишних символов. Там где есть конфликты, там точечно указываешь какой неймспейс нужен, но это не значит что это надо делать дефолтной практикой и писать простыни зазря.
>>257581822 (OP) Код у тебя не компилируется потому что ты в функции объявляешь пермеменную (parr) с таким же именем, как и один из аргумент функций, а так нельзя. Но проблема не в этом, а в том, что во-первых, ты не читаешь описание ошибки. А во-вторых, ты сам не знаешь, что пишешь: у тебя функция выделяет память для массива и возвращает указатель на новый массив. Но одновременно с этим, функция принимает указатель на какой-то массив - чтобы что? Зачем ты добавил этот аргумент, если он не будет использоваться? Ты вместо того, чтобы сперва подумать как тебе надо, а затем написать, делаешь наоборот, а так нельзя.
>>257582986 Ну и нахуй ты мне это объясняешь. Чел, я кодинг учу, чтобы бабки получать нормальные, так мне до пизды все эти функции-хуюнцкии. Я со стаковерфлоу копирую код и нормально.
>>257583104 >так мне до пизды все эти функции-хуюнцкии. Я со стаковерфлоу копирую код и нормально. Вангую как ты будешь потом ныть после провальных собесов.
>>257583104 С таким подходом у тебя не получится. Программирование - это такая область, где надо дохуя въёбывать (в том числе и бесплатно), и иногда даже думать. Любой ньюфаг-программист в фирме - это большие расходы, а у ботана-выпускника физтеха с горящими глазами есть хоть какой-то шанс чему-то научиться и эти бабки отбить, так что ему платить бабки скорее всего будут, а тебе - нет. Это всё выкупается с первых минут интервью же.
Тут уже и троллят от моего имени. Аноны, спасибо вам за ответы, я, правда, сам нашел ошибку, но все же, остаются вопросы, чувствую, что не понимаю механику происходящего. Вроде бы ясно, что указатель привязан к адресу в памяти и выдает содержимое по этому адресу, но на практике нихуя не ясно. 1. Почему функция (подчеркнул красным) имеет тип double, хотя возвращать она будет значение адреса в памяти? 2. Зачем в последней функции ptarr (т.е., переменной-миссиву) было присвоено нулевое значение, разве оператор delete не обнуляет содержимое памяти по адресу этой переменной?
Буду очень признателен тем, кто разъяснит последовательность действий в пеке при работе с указателями.
>>257583479 > разве оператор delete не обнуляет содержимое памяти по адресу этой переменной? Нет не удалаяет, он говорит системе что теперь это место в памяти свободно, и можно его перезаписывать. Никто не мешает тебе его повторно разименовать и получить, или мусор, или битый объект, или вообще тот же самый объект, если его не успело ничего перетереть. Но это не точно, лет 10 к плюсам не прикасался.
>>257583479 > 1. Почему функция (подчеркнул красным) имеет тип double, хотя возвращать она будет значение адреса в памяти? Нихуя. Не дабл, а указатель на дабл. > 2. Зачем в последней функции ptarr (т.е., переменной-миссиву) было присвоено нулевое значение, разве оператор delete не обнуляет содержимое памяти по адресу этой переменной? Делит освобождает память на куче, а указатель теперь указывает на хз что, мусор. А нулевой указатель всегда чекнуть можно на невалидность. > Буду очень признателен тем, кто разъяснит последовательность действий в пеке при работе с указателями. Просто и без задней мысли пользуешься. Лучше сразу к умным указателям привыкай, RAII и все такое.
>>257583854 >>257583479 > Зачем в последней функции ptarr (т.е., переменной-миссиву) было присвоено нулевое значение На первую часть не ответил. Чтоб другой код, за пределами твоего модуля мог отследить, что произошло удаление объекта. Тупо чекнув проверкой на 0. function (Foo* ptr) { if (!ptr) {ptr->bar();} }
>>257583479 >1 Она имеет тип "double*", т.е. указатель на double. >указатель привязан к адресу в памяти Не столько "привязан", сколько "содержит". Указатель можно воспринимать как пару из двух сущностей: адреса в памяти и, быть может, всяких вспомогательных метаданных, описывающих тип переменной. В частности, когда компилятор видит запись "double★", он понимает ровно три вещи: 1. Щас ему дадут адрес в памяти. 2. По этому адресу будут лежать sizeof(double) (т.е., скорее всего, 8) байт подряд. 3. Эти байты ему, скорее всего, рано или поздно придётся трактовать как число с плавающей запятой. С другой стороны, запись "void★" - это только адрес в памяти. Т.е. ты явно говоришь компилятору, что это не его ебаное дело, что там лежит.
>2 Рекомендую пока отстать от c++ и как следует освоить простой си. В частности, стандартную сишную кучу, malloc()/free(), вот это всё. Но пока отвечу так: delete по спецификации не обязан ничего занулять, он только убирает информацию о выделенности блока памяти из служебной структуры данных кучи. Ты этого напрямую не видишь, т.к. напрямую с этой структурой работать не предполагается. После этого этот указатель всё ещё куда-то указывает - но уже на рандомное место в памяти, которое тебе больше не принадлежит. Зануляется сам указатель, скорее всего, для того, чтобы при случайной попытке обратиться к памяти по нему твоя программа быстренько и шумно упала (т.к. обращение к памяти на первой странице крашит прогу к хуям), а не начала творить странный треш в неожиданные моменты. Но вообще хуй знает. Лучше спроси у поца, который этот код писал. Он выблядок с верблюжьей нотацией головного мозга, они все непредсказуемые поехавшие.
>>257584005 Какие ему нафиг умные указатели, успеет ещё.
>>257584005 >Нихуя. Не дабл, а указатель на дабл. Вот оно что. Вот это мне непонятно. Почему функция имеет тип указателя? Как это вообще работает? Функция, как я понимаю, это конструкция языка, которая заставляет пеку провести какие-то операции с принимаемыми аргументами. Итогом своей работы функция имеет какое-то значение. Выходит результат работы функции - указание на выделенную область в памяти?.. Ну ладно.. >>257583854 >>257584062
Спасибо всем, аноны. Не скажу, что стало сильно лучше, но какие-то изменения в понимании работы указателей появились.
>>257581822 (OP) ты просто тупой. ты как обезьянка что-то делаешь но нихуя не понимаешь что и зачем. таким подходом ты ничему не научишься. то что ты делаешь - это не учеба, а копирование.
>>257585656 У тебя не верное представление о том, что такое функция.
Есть соглашение о вызове функций. Советую хотя бы поверхностно о нем прочитать.
В кратце, при вызове функции, переданные аргументы толкаются в стек в определенном порядке. После чего происходит вызов подпрограммы и начинается ее выполнение. Подпрограмма ожидает, что в стеке лежат ее аргументы и проводит с ними действия. После чего пихает в стек результат своей работы и выходит. Выполнение основной программы начинается с места вызова функции, только в стеке теперь лежат не аргументы, а результат.
Для понимания, тебе надо научиться представлять переменные не как некие абстрактные объекты и сущности. А как сраные ячейки памяти с цифрами, которые перекладываются туда сюда.
>Почему функция имеет тип указателя Что бы код ее использующий знал, что по указателю (по адресу в памяти) который вернула функция лежит данные определенного типа.
Ты можешь вернуть void* и трактовать данные как хочешь и иногда даже ничего не ебнется. Но если ты сделаешь это не верно - ебнется и в самом ужасном случае, ебнется не сразу .
>>257585656 Да у тебя же МАТЕМАТИЧЕСКИЙ СКЛАД УМА. Не, это круто, на самом деле. И ты в чём-то прав, можно воспринимать функции и так. В функциональном программировании так вообще имеет место страшный дроч на этот способ рассуждать. К сожалению, конкретно к твоей функции freeMemory такое описание не очень применимо, т.к. главный смысл её существования - работа с глобальной структурой данных кучи, т.е. побочный эффект (гугли "чистая функция"). На самом деле я не ебу, зачем она возвращает этот указатель, если он всегда нулевой. Дурацкий какой-то код. ИМХО, можешь заменить double* на void и не париться.
>>257585656 Философия программирования это отдельный курс, который тебе надо осваивать, после которого ты поймёшь откуда уши торчат у всей этой при+нутой ебалы. Просто задрачивая примечики не поймёшь. Делаешь пример пробуешь понять, почему он сделан именно так. Но, не имея опыта сам он не появится. Лучше почитай структуры данных и алгоритмы. Именно просто почитай, т.к. всё задротство состоит в том, чтобы впихнуть алгоритмы в язычок какой-нибудь и чтобы ебли поменьше было. А в твоём случае и чтобы на рыночек галерных рабов вкатиться. Так уж лучше Kotlin или Джава или Пых. Сишка для ебанутых и злопамятных, т.к. помнить там надо дохуя и понимать как это дохуя потом скажется на твоём говнокоде.
>>257587275 Хз, я вот такие методики лютой хуйней считаю. Объяснять человеку абсолютно абстрактно что чем является бред. У него тучи вопросов возникнут, часть проебутся в итоге будут непонятное месиво заний.
ИМХО пограмировать надо начинать с прикладной задачи. Что бы вот уебаться в проблемы, а потом уже уходить в теорию, попутно имея прикладную практику.
>>257587477 В принципе да, но пока он учится у него есть возможность отложить вопрос, у него нет дедлайна, у него нет необходимости кому-то что-то пояснять. А ему всё это придётся делать и имея в своём багаже только умение кодить ему очень не просто придётся. А умение "сократить дистанцию" даёт именно изучение базовых алгоритмов и структур данных.
>>257586452 >>257587117 >>257587275 Спасибо, b/ратцы, не ожидал, что так подробно и толково ответят на нубовопросы. Откровенно говоря, я вряд ли стану погромистом (я уже немолод и у меня другая профессия), но, быть может, напишу игруньку своей мечты в перерывах между работой и ваши разъяснения приблизили меня к сей нехитрой цели.
>>257581822 (OP) Не шарю в плюсах, но разве безопасно возвращать указатель, который указывает на память, созданную в функции. Знатоки плюсов, объясните пж
>>257591433 На стековую - небезопасно в принципе ты можешь извратиться и использовать её безопасно, но зачем? Разве что если ты кодишь под ну очень ограниченные по оперативке микроконтроллеры, да и тогда на это будут смотреть как на дикое извращение. На кучу - сколько угодно.
>>257592365 Ага. В плюсовой куче есть ряд отсутствующих в malloc-ах фишек, позволяющих при желании стандартизированным образом кастомизировать её поведение, но центральная идея абсолютно та же.
Анон, это ты тут создавал треды быстрого вката вайти? Хотел сказать тебе спасибо за то что сподвиг меня взять себя в руки и начать учиться. Так-то я сам уже вайти и база имеется, но так как не учусь - не двигаюсь дальше.
За неделю познакомился с ansible и git, начал docker, кручу-верчу виртуалки, контейнеры, и свою собственную википедию, куда конспектирую. Планирую до весны дрочить около-смежные темы, а весной попробовать вкатиться куда-нибудь джуном-девопсом или сорт оф.