Стадии просмотра данного видео: 0:00 Интересно что там у нас сегодня? 1:58 Опять указатели. Кто-то на кого-то указывает, в голове каша. 9:23 Вроде все понятно. Только зачем мне указатель на функцию, если я могу вызвать функцию напрямую? 18:58 Это ахрененно!!!! В очередной раз, спасибо огромное, Сергей!
Сергей, я безмерно благодарен вам за ваши уроки! ваш уровень объяснения, превосходен! абстрагирован настолько, что даже самые сложные темы познаются как 2+2
Удобный инструмент! Спасибо. И почему я раньше не смотрел ваш канал? Как заработаю копеечку обязательно закину донат! Народный учитель должен жить хорошо. Большая помощь обществу.
Сергей, добрый день! Во первых хочу поблагодарить Вас за ваш ТРУД, реально очень помогает в освоении С++. У меня огромная просьба. Просьба такая, подскажите как параллельно с изучением С++, еще практически закреплять пройденный материал. Пример: Ваши уроки это ТЕОРИЯ и бывает так, что для полного понимания хочется ПРАКТИКИ, но в силу не большого багажа знаний сложно практиковаться, но практиковаться НАДО. Есть три урока как создать игру "Змея" на основе С++, очень помогло понять до конца как работают функции, ОЧЕНЬ ПОМОГЛИ ВАШИ УРОКИ,может у Вас есть практические уроки для полного понимания. Спасибо.
Вопрос конечно не мне , но отвечу, так как меня это тоже интересовало. Есть две отличные книги : "Сборник задач по программированию" Д.М.Златопольский и "Сборник задач в примерах" Н.Культин. Д.М. Златопольский хорош тем что, все его задачи, в каждом разделе, начинаются с элементарно легких, и ПОСТЕПЕННО усложняются до максимум сложности. А вот Н.Культина, ко всем задачам, в разделах, есть решения. Ну вот как-то так. PS. Лично мне больше нравится "Сборник задач по программированию" Д.М.Златопольского, мне он ОЧЕНЬ ПОМОГ в изучении С++.
Спасибо за наглядный пример. Хотя, мне кажется, стоило пример отрисовать в пэинте - так нагляднее. Я прям чувствую, что понял смысл лишь на половину. Но в любом случае огромное спасибо и за пример, и за урок!
Во первых, Огромный респект за канал! Такой вопрос: Зачем использовать указатель на функцию, если примерно такого же эффекта можно добиться вот так: string DataFromBD() { return "Data From BD"; } void ShowInfo(string str) { cout
@@ДмитрийНормов-ю6ц и сколько ты такими методами памяти сэкономишь? Проще уже изначально всё по уму писать и обращать внимание на действительно важные вещи, чем вот так вот синтаксис усложнять. Куева туча скобок и всё слеплено вместе, бред, а ты представь если весь проект такой?
Андрей Шолмин, у меня такой же вопрос. Тут либо накосячил автор ролика, либо есть некая принципиальная разница, которую мы поймём в будущем. Я снова пока забросил Си++... Я к нему периодически возвращаюсь... Но если вы раньше меня поймёте, оставьте комментарий прямо здесь... Сохраните ссылку на видео для этого, да и на комментарий тоже...
@@andreysholmin5863 передавая функцию компилятор не лично ее передает а создает ее копию и тогда у вас 1 функция занимает в 2 раза больше памяти (функция и копия). А передавая по указателю вы как бы на прямую работаете с функцией. Вроде как то так) поправте если чо
@@ЧеловекРавнодушный передавая функцию компилятор не лично ее передает а создает ее копию и тогда у вас 1 функция занимает в 2 раза больше памяти (функция и копия). А передавая по указателю вы как бы на прямую работаете с функцией. Вроде как то так
Частенько встречаю талантливых прогеров из Украины. Не так давно один мой друг, переехал в Канаду и теперь работает там. Видимо тоже не плохой специалист.
Интересный у тебя ник). Раз ты так переживаешь за свою родину, то че на фронте-то не защищаешь ее? Или у тебя "активная" политическая позиция только в интернете? Хотя может тебя уже мобилизовали и ты сейчас лежишь-гниешь в поле где-нибудь под Артемовском...
Я постоянно юзаю указатеди на функци в машине состояний. Есть энамы, описывающие события и текущее состояние. Есть двойной массив, который содержит указатели на функции. Комбинацией значений событие и текущее_состоянте формируется индекс (x и y) и выбирается нужная функция. Коряво объяснил. Но инструмент очень удобный.
Я понял это так. Есть несколько функций. Чтобы вызвать одну нам необходимо создать функцию, параметром которой является указатель на функцию. void ShowFun(string(*pFoo)()) // функция, параметром которой является указатель на функцию { cout
Старина, ты неправильный программист, значешь почему? Потому, что правильные програмисты не умеют объяснять :) Они всегда все объяснят так, буд-то тот, кому объясняют- уже и так все сам знает, как-бы как профессору экзамен сдают. В результате нихрена не понятно. Ты круто объясняешь, особенно когда с пэйнтом, не забывай про него. По поводу урока, я тебе верю, что это очень важно, и полезно, но нихрена не понял. :LOL: Т.е. какие-то наметки в голове есть, как работает вроде понятно, но зачем... Может кто попробует мне пример привести использования. Только не приводите пример в стиле "представь, что ты пишешь софт для СпейсШаттла".. ребят, если это уроки для чайника- чайник даже представить себе не сможет, что такое код для какого-то межгалактического монстра. П.С. побольше домашки, она заставляет думать. Даже простая, она заствляет самому проделать показанное на уроке.
Ну как-то раз, я делал так скажем свой "пейнт", только писал его не на С++, а JS, там тоже есть что-то похожее на эти указатели на функцию. Ближе к делу, нужно было чтобы когда пользователь нажимал на кнопку с прямоугольником, то он мог рисовать прямоугольник, а когда нажимал на кнопку с кругом, то рисовал круг. Реализация была такова: должна быть ОДНА функция (назовем ее draw), которая вызывается когда пользователь нажал на мышку и эта функция позволяет пользователю рисовать все фигуры которые ему доступны, но пока не совсем понятно как эта функция определяет что ей рисовать, а на самом деле это не совсем функция, это указатель на функцию, который меняется в зависимости от того на что нажал пользователь. То есть у нас есть указатель на функцию который называется draw, и он меняется от того на что мы нажали, допустим мы нажали на кнопку прямоугольника, и теперь draw указывает на функцию drawRect, которая специально написана чтобы рисовать прямоугольник, если нажали на круг, то draw указывает на drawCirclе, которая написана чтобы рисовать круг. В итоге выходит что мы вызываем один и тот же указатель на функцию, а он в свою очередь указывает на разные функции, которые могут делать абсолютно любые вещи. Мы просто обращаемся к этому указателю когда кто-то начал рисовать, и меняем функцию на которую он указывает когда, например с прямоугольника на круг или на просто линию. И еще нам в будущем может взбредить в голову дать возможность рисовать еще больше фигур, ну допустим треугольник, ради этого мы можем просто функцию drawTriangle написать, и потом добавить кнопку рисования треугольника, когда нажимаем на эту кнопку просто говорим что теперь draw указывает на drawTriangle. Не уверен что смог донести, если все еще слабо себе представляете, то я бы рекомендовал написать свой пейнт на JS тоже, это не так сложно как кажется, я написал это с 5-6 месячным опытом в JS.
Если коротко. Для чего нужна ф-ция? Чтобы в зависимости от переданных в неё параметров, получить определённый результат. Допустим ф-ция сложения. А теперь представь, что в эту ф-цию сложения ты передаёшь результаты полученные из других ф-ций. Неважно каких. Тебе главное сложить их результаты.
@@abdussattarkassymbekov3643 И зачем это надо Вы поясните? всё равно есть функции код которых рисует треугольник или квадрат или иное так почему же нельзя просто в зависимости от того на что нажали вызвать соответствующую функцию?
@@МаксимШлык-б8т в случае если мы не будем использовать указателей на функцию, то я самым простым способом вижу так сделать. Когда я нажимаю на кнопку "рисовать треугольник" я меняю значение глобальной переменной на 1 (чтобы понять что сейчас надо рисовать) потом когда пользователь хочет рисовать что-то, то я просто проверяю значение этой глобальной переменной и в зависимости от этого рисую что-то. То есть тут используется if else конструкция, а писать много if else это не очень приятно как и читать лес из if else. Чтобы избавится от них можно использовать указателей на функцию, как мне кажется это более правильное решение и более понятное. Наверное чтобы хорошо понять это стоит поделать задачи на переопределение методов класса в ООП.
@@viktort9326 как вариант чтобы не дублировать код, возьмем функцию сложение векторов, можно написать только один раз эту функцию потом использовать по многу раз, даже тот же самый вывод на консоль это функция, если бы не было его то пришлось всю логику вывода на консоль писать каждый раз когда потребуется
Ёлки-палки. Смотрел многопоточное программирование, а там сказали какой-то урок про лямбду посмотреть для понимания. Стал смотреть про лямбду, там сказали посмотреть про полиморфную обертку. В полиморфной обертке отправили сюда и еще куда-то про цикл foreach... Короче, обход дерева в глубину
Линейный список. (как открыть ларёк): ...через 2 дня пришел. Сказали, я слишком худой - надо пойти поесть, чтобы 2 дня не есть, чтоб потом сдать кровь, чтоб жизнь страховать, чтоб прийти в банк, чтоб прийти в ЗАГС, чтоб пойти в ЖЭК, чтобы пойти в УВД, чтоб пойти в МОСГОСТРАНС, чтоб пойти в УПРАВУ, чтоб пойти в БТИ, чтоб пойти в ФНС, чтобы открыть ларёк...
Ожидал, что пример будет по функции rand(); Мне кажется она реализована по тому же принципу и ссылается видимо на srand(); учитывая что вторая расширяет функционал первой.
Для закрепления материала Массивы указателей на функции. Обычные и динамические. Чтобы усложнить задачку функция, передаваемая в виде аргумента в другую функцию, так же принимает параметр. В конечном итоге передача указателя на функцию в качестве параметра другой функции в цикле из массива таких указателей :) Внизу есть пара вопросов, буду признателен, если получу на них ответ. #include #include using namespace std; // функции, которые я буду использовать в качестве примера string GetDataFromDB(string DBName) { return "Data From DB: " + DBName + " ----------- " + "Record1 Record2 Record3 ... ... ... RecordsN
заранее сорри за некропостинг // 1. почему объявление такое же, как у двумерного массива? я не уверен но может это из-за того что мы создаем массив с указателями на функции? тобишь по факту это указатель на указатели на функции потому и объявление как у двумерного массива берем адреса для ячеек а в них пихаем указатели для функций
Подскажите плис. Поделитесь опытом как закреплять пройденный материал. Очень похоже на то, как будто ощущаешь себя каким-то пассажиром. Всё вроде понятно, проходит время и .....
@@Empty_line в любом случае, раньше я не знал про это вообще ничего, а теперь знаю что такая штука в принципе существует и смогу ей воспользоваться на плюсах при необходимости это круто
Сергею, большое спасибо за уроки! Вопрос к знатокам. Как быть, если "сторонняя" функция принимает аргументы? Допустим: string foo1 (int x); (возвращает строку с х в конце) string foo2 (int x); то вот так уже не работает, void GetFrom (string (*foo)(int x)) { cout
Именно так, с дополнительным аргументом. GetFrom(string(*foo)(inx x), int x) {}; И вызов соответственно GetFrom (foo1, 42); Если вам не нравится такой способ передачи данных в функцию, то нужно представить себе, каким он должен быть по вашему разумению, и попытаться реализовать. К примеру использовать переменные-буферы в общей зоне видимости. Ну или побороть чувство чего-то не того между (foo1(42)) , в случае которого вы сразу передаете результат работы функции foo1 (т.е. стринг) , и (foo1,42) - смотрите, даже на один знак меньше требуется)
Спасибо за урок!!! А может кто-нибудь подсказать как сделать так чтобы пользователь не вводил ShowInfo(DataFromBD); ручками в коде, а чтобы он, например, вводил в консоли DataFromBD и ему выходили данные?
Приведено 2 варианта реализации: 1й Вариант - определяет ссылку на функцию, и нет возможности в эту ссылку добавить реализацию через {} - к примеру то же действие вывода на экран - cout, 2й вариант - в конце - создает функцию в которой есть своя реализация внутри { cout...} с вызовом по ссылке функций Data..., однако, без возможности передачи параметров. Вообщем не не вижу для себя удобства - так как если создавать свою функцию, то зачастую нужно передавать параметры в вызываемые по ссылке функции. А если мы внутри main создаем эту конструкцию - то тогда и ссылок ненадо - прямые обращения к функциям быстрее и короче
Van Dyke, полностью согласен! Реализовать 2 вариант с передаваемыми параметрами можно , но супер не удобно. Так что по сути ваше утверждение полностью верно, намного быстрее и читабильнее вывести функцию напрямую.
Читайте Подбельского... там все тоже самое из прошлого века. Ну и скажу что это очень давно придумано в С++ (на самом деле использовано в с++ как и ООП) как и многое другое... Указатели на функции очень круто использовать для меню... поспорил как-то в прошлом веке кто напишет определенное меню на с++ или визуал бейсик.. типа.... я чуть ли не в блокноте на с++ напишу меню... либо среда визуал бейсик (с подсказками). на один день опоздал... проиграл спор (три дня на задачу вне работы.) Но я показал оппоненту... что как за пять минут расширить функционал меню за счет указателей на функции, когда ему пришлось бы тоже самое сделать опять за три дня... с тех пор началась моя любовь к с++.
такой момент, а можно ли сделать перегрузку функции, которая принимает функцию через указатель (как пример: одна функция принимает обычные функции, а другая - функции с указателями)
Огромное спасибо! Да.. я из этого урока зачерпнул полезного. Но вопросы остались: Каким образом возможно протащить параметры различных типов, через эту связку? Что бы параметры можно было задать в функцию ShowInfo(), потом какую то их часть обработать в её теле, какую то в теле конечных функций.
@@baki-taki уже пошел на стажировку по фронту, но начался карантин и ее перенесли. Постараюсь, чтобы взяли. Писал на spring boot и angular курсовую, если интересно.
чел, мне очень обидно за Тебя. Такой огромный, качественный труд, а теперь убрали монетизацию. это треш. Дай Бог Тебе здоровья. это зачтется. Я вчера проходил собес на джуна, жду ответ, думаю что все хорошо. Учился на Твоих видосах. спасибо
@@DaniilS98 изначально учился на java . javarush ресурс был такой. в рамках интересов начал работать с arduino и есп. где то год пилил свои проекты и изучал ардуино. вообще она стала такой прослойкой для меня между java и c++. потом возникли сложности с трудовой деятельностью и нужно было выбирать дальнейший путь и профессию. решил учиться на c++. посмотрел этот канал, попрактиковался и вылез на hhru. получил около 50 отказов и грубо говоря 51 взяли на работу. почему не остался на java? потому что просто больше понравились плюсы
@@DaniilS98 но самое главное я очень очень много писал. безобразного и отвратительного кода, который все-таки работал, но показывать который стыдно. без этого никак не научишься. нужно придумать себе проект и реализовывать его от начала и обязательно до конца. в какой-то момент поймешь что пришло время показать себя
Со второго раза только понял о чем речь и логику. Но так до конца не понял, в чем все-таки необходимость и преимущество использования промежуточной функции ShowInfo(), по сравнению с тем, что я могу напрямую обращаться к фунциям коллег, например GetDataFromBD() ?
Потому что назначение функции GetDataFromBD() - это возвратить какое либо значение и только. А уже функция ShowInfo() ,,напечатает,, это значение в консоль. И если вдруг понадобится еще это возвратимое значение передать иному пользователю по сети , то будет достаточно создать самому еще функцию к примеру void TransmitOverNetwork () с указателем ,затем в void main() сразу после ShowInfo() ; вызывать её с параметрами TransmitOverNetwork (GetDataFromBD); и тогда городить всякие условия (костыли) внутри функции void main() уже не надобно. Читаемость(упорядочность) кода повышается (конечно если только хорошо понимаешь .что такое указатели...)
Здраствуй, после месяца(или чуть больше) использования visual studio, мне пришло уведомление" лицензия закончиться через 5 дней. Смогу ли я пользоваться програмой через 5 дней?
Стадии просмотра данного видео:
0:00 Интересно что там у нас сегодня?
1:58 Опять указатели. Кто-то на кого-то указывает, в голове каша.
9:23 Вроде все понятно. Только зачем мне указатель на функцию, если я могу вызвать функцию напрямую?
18:58 Это ахрененно!!!! В очередной раз, спасибо огромное, Сергей!
Самый внятный канал о С++!
Instablaster
@@brycencesar6273 что это? канал?
@@ДмитрийНормов-ю6ц а самому проверить не пробовал?
Готовлюсь к собеседованию. Впервые слышу об этом. 4 года в универе. 2 самостоятельных проектов. И такое не в первый раз, спасибо!!
И как?
@@francheeze неудачно, но подозреваю, что это просто неуверенность. Плюс ещё с математикой налажала
@@satyrosa Это печально
@@francheezeа что было в самостоятельных проектах не секрет?
@@pavel_losev ?
Data from Astral - повеселило )))) Спасибо за уроки!
Математическое описание состояния энергетики
что такое astral
@@setwindowlongptr Астрал и есть. Т.е., полагаю, данные, взятые с потолка)
Сергей, я безмерно благодарен вам за ваши уроки! ваш уровень объяснения, превосходен! абстрагирован настолько, что даже самые сложные темы познаются как 2+2
Удобный инструмент! Спасибо. И почему я раньше не смотрел ваш канал? Как заработаю копеечку обязательно закину донат! Народный учитель должен жить хорошо. Большая помощь обществу.
Весь интернет перелопатил нихрена не понял, только вы можете объяснить доходчиво. Громадное спасибо
Еще не встречал настолько крутых обучалок😊😊
сначала послышалось калек а не КОЛЛЕГ но по смыслу подходить)))
Как всегда спасибо за урок и оперативность.
Хм, реально крутая фишка!
Спасибо.
Смотрю и радуюсь! Предельно ясно и понятно, в самый раз для чайника))))
Круть, 3 месяца изучаю C++ и впервые узнал об указателе на функцию.
тоже самое, а у вас видимо уже 6 лет опыта на данный момент😅
Спасибо Сергей. Добротное видео. Как в прочем всегда.
Концовочка урока порадовала - данные из астрала))) Но зато всё прекрасно понятно) Спасибо за уроки!
Сергей, добрый день! Во первых хочу поблагодарить Вас за ваш ТРУД, реально очень помогает в освоении С++. У меня огромная просьба. Просьба такая, подскажите как параллельно с изучением С++, еще практически закреплять пройденный материал. Пример: Ваши уроки это ТЕОРИЯ и бывает так, что для полного понимания хочется ПРАКТИКИ, но в силу не большого багажа знаний сложно практиковаться, но практиковаться НАДО. Есть три урока как создать игру "Змея" на основе С++, очень помогло понять до конца как работают функции, ОЧЕНЬ ПОМОГЛИ ВАШИ УРОКИ,может у Вас есть практические уроки для полного понимания. Спасибо.
Вопрос конечно не мне , но отвечу, так как меня это тоже интересовало. Есть две отличные книги : "Сборник задач по программированию" Д.М.Златопольский и "Сборник задач в примерах" Н.Культин. Д.М. Златопольский хорош тем что, все его задачи, в каждом разделе, начинаются с элементарно легких, и ПОСТЕПЕННО усложняются до максимум сложности. А вот Н.Культина, ко всем задачам, в разделах, есть решения. Ну вот как-то так.
PS.
Лично мне больше нравится "Сборник задач по программированию" Д.М.Златопольского, мне он ОЧЕНЬ ПОМОГ в изучении С++.
@@dmax8622 Заодно можно подучить и то, что в школе было успешно прогуляно или забыто))
Andrey A На канале есть домашние задания по с++
@@dmax8622 Спасибо большое,то что надо!
@@dmax8622 Спасибо
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
Автора и по голосу приятно слушать и розжевывает все до мелочей, спасибо!
Наиогромнейшее СПАСИБО. Вы СУПЕР.
Пожалуйста!
Вы первый человек, которому удалось объяснить мне пользу указателей
Я Вас благодарю за Вашу работу, очень хорошо всё объясняете!
Спасибо за наглядный пример. Хотя, мне кажется, стоило пример отрисовать в пэинте - так нагляднее. Я прям чувствую, что понял смысл лишь на половину. Но в любом случае огромное спасибо и за пример, и за урок!
Во первых, Огромный респект за канал!
Такой вопрос: Зачем использовать указатель на функцию, если примерно такого же эффекта можно добиться вот так:
string DataFromBD()
{
return "Data From BD";
}
void ShowInfo(string str)
{
cout
указатели позволяют экономить память.
@@ДмитрийНормов-ю6ц и сколько ты такими методами памяти сэкономишь? Проще уже изначально всё по уму писать и обращать внимание на действительно важные вещи, чем вот так вот синтаксис усложнять. Куева туча скобок и всё слеплено вместе, бред, а ты представь если весь проект такой?
Весьма доволен собой был до поры до времени:D
Огромное спасибо! Очень наглядно и без воды.
Спасибо, Сергей. Как всегда познавательно
Спасибо
Спасибо за урок! Предвкушаю как я сейчас буду издеваться над указателями, может че и придумаю:)
Классная штука , нужно по практиковаться.
И как я мог пропустить такой важный урок?? Спасибо вам большое!
Спасибо вам большое за урок
Топ объяснение делегатов. Нисмотря на то что данные берутся из астрала)
Спасибо! Помогаете!!!
Очень просто и понятно. Спасибо вам!)
Спасибо тебе за твой труд, дружище!
#указательнафункцию #SimpleCode #урокипрограммирования
Тут можно и без указателя обойтись. В функцию ShowInfo можно тупо передать функцию...
@@ЧеловекРавнодушный Я тоже так попробовал, получилось и тогда вопрос, в чем различие указателя на функцию и без указателя передача функции?
Андрей Шолмин, у меня такой же вопрос. Тут либо накосячил автор ролика, либо есть некая принципиальная разница, которую мы поймём в будущем. Я снова пока забросил Си++... Я к нему периодически возвращаюсь... Но если вы раньше меня поймёте, оставьте комментарий прямо здесь... Сохраните ссылку на видео для этого, да и на комментарий тоже...
@@andreysholmin5863 передавая функцию компилятор не лично ее передает а создает ее копию и тогда у вас 1 функция занимает в 2 раза больше памяти (функция и копия). А передавая по указателю вы как бы на прямую работаете с функцией. Вроде как то так) поправте если чо
@@ЧеловекРавнодушный передавая функцию компилятор не лично ее передает а создает ее копию и тогда у вас 1 функция занимает в 2 раза больше памяти (функция и копия). А передавая по указателю вы как бы на прямую работаете с функцией. Вроде как то так
Як нечакана і прыемна было даведацца, што аўтар гэтага выдатнага каналу з роднай Украіны...
Дзякуй вялікі за працу і трымайцеся, сябры!
Частенько встречаю талантливых прогеров из Украины. Не так давно один мой друг, переехал в Канаду и теперь работает там. Видимо тоже не плохой специалист.
Интересный у тебя ник). Раз ты так переживаешь за свою родину, то че на фронте-то не защищаешь ее? Или у тебя "активная" политическая позиция только в интернете? Хотя может тебя уже мобилизовали и ты сейчас лежишь-гниешь в поле где-нибудь под Артемовском...
@@АлексейДоровской-х2ъ ты еблан? это беларуская мова
Я постоянно юзаю указатеди на функци в машине состояний. Есть энамы, описывающие события и текущее состояние. Есть двойной массив, который содержит указатели на функции. Комбинацией значений событие и текущее_состоянте формируется индекс (x и y) и выбирается нужная функция. Коряво объяснил. Но инструмент очень удобный.
Даже коммент напишу, очень качественно объяснено👍👍👍
9:55 Трудно представить
*Спасибо за урок*
Ахахаха..хах..кхак...ааа...аа...ааа.../всхлипы/
Я понял это так. Есть несколько функций. Чтобы вызвать одну нам необходимо создать функцию, параметром которой является указатель на функцию.
void ShowFun(string(*pFoo)()) // функция, параметром которой является указатель на функцию
{
cout
Спасибо за видео, узнал для себя новую возможность С++)
спасибо Сергей!
спасибо за урок
Пожалуйста! =)
@@SimpleCodeIT Спасибо за урок,с помощью вас я наконец-то смог программировать на С++. Пересматриваю ваши ролики.
@@hackerman5984 Работаете программистом?
Так они все возвращают string....в качестве аргумента суем string и все... Нет? showInfo(string str){cout
Со второго раза понял о чём речь, спасибо!
С начала он говорит что указатель на функцию не требует начальной инициализации а потом делает это😶
Спасибо за знания !
eng zo`r kanal sizga rahmat
Очень важная тема!
Очень крутой урок, спасибо большое!
Старина, ты неправильный программист, значешь почему? Потому, что правильные програмисты не умеют объяснять :) Они всегда все объяснят так, буд-то тот, кому объясняют- уже и так все сам знает, как-бы как профессору экзамен сдают. В результате нихрена не понятно.
Ты круто объясняешь, особенно когда с пэйнтом, не забывай про него.
По поводу урока, я тебе верю, что это очень важно, и полезно, но нихрена не понял. :LOL:
Т.е. какие-то наметки в голове есть, как работает вроде понятно, но зачем...
Может кто попробует мне пример привести использования. Только не приводите пример в стиле "представь, что ты пишешь софт для СпейсШаттла".. ребят, если это уроки для чайника- чайник даже представить себе не сможет, что такое код для какого-то межгалактического монстра.
П.С. побольше домашки, она заставляет думать. Даже простая, она заствляет самому проделать показанное на уроке.
Ну как-то раз, я делал так скажем свой "пейнт", только писал его не на С++, а JS, там тоже есть что-то похожее на эти указатели на функцию. Ближе к делу, нужно было чтобы когда пользователь нажимал на кнопку с прямоугольником, то он мог рисовать прямоугольник, а когда нажимал на кнопку с кругом, то рисовал круг. Реализация была такова: должна быть ОДНА функция (назовем ее draw), которая вызывается когда пользователь нажал на мышку и эта функция позволяет пользователю рисовать все фигуры которые ему доступны, но пока не совсем понятно как эта функция определяет что ей рисовать, а на самом деле это не совсем функция, это указатель на функцию, который меняется в зависимости от того на что нажал пользователь. То есть у нас есть указатель на функцию который называется draw, и он меняется от того на что мы нажали, допустим мы нажали на кнопку прямоугольника, и теперь draw указывает на функцию drawRect, которая специально написана чтобы рисовать прямоугольник, если нажали на круг, то draw указывает на drawCirclе, которая написана чтобы рисовать круг. В итоге выходит что мы вызываем один и тот же указатель на функцию, а он в свою очередь указывает на разные функции, которые могут делать абсолютно любые вещи. Мы просто обращаемся к этому указателю когда кто-то начал рисовать, и меняем функцию на которую он указывает когда, например с прямоугольника на круг или на просто линию. И еще нам в будущем может взбредить в голову дать возможность рисовать еще больше фигур, ну допустим треугольник, ради этого мы можем просто функцию drawTriangle написать, и потом добавить кнопку рисования треугольника, когда нажимаем на эту кнопку просто говорим что теперь draw указывает на drawTriangle. Не уверен что смог донести, если все еще слабо себе представляете, то я бы рекомендовал написать свой пейнт на JS тоже, это не так сложно как кажется, я написал это с 5-6 месячным опытом в JS.
Если коротко. Для чего нужна ф-ция? Чтобы в зависимости от переданных в неё параметров, получить определённый результат. Допустим ф-ция сложения. А теперь представь, что в эту ф-цию сложения ты передаёшь результаты полученные из других ф-ций. Неважно каких. Тебе главное сложить их результаты.
@@abdussattarkassymbekov3643 И зачем это надо Вы поясните? всё равно есть функции код которых рисует треугольник или квадрат или иное так почему же нельзя просто в зависимости от того на что нажали вызвать соответствующую функцию?
@@МаксимШлык-б8т в случае если мы не будем использовать указателей на функцию, то я самым простым способом вижу так сделать. Когда я нажимаю на кнопку "рисовать треугольник" я меняю значение глобальной переменной на 1 (чтобы понять что сейчас надо рисовать) потом когда пользователь хочет рисовать что-то, то я просто проверяю значение этой глобальной переменной и в зависимости от этого рисую что-то. То есть тут используется if else конструкция, а писать много if else это не очень приятно как и читать лес из if else. Чтобы избавится от них можно использовать указателей на функцию, как мне кажется это более правильное решение и более понятное. Наверное чтобы хорошо понять это стоит поделать задачи на переопределение методов класса в ООП.
@@viktort9326 как вариант чтобы не дублировать код, возьмем функцию сложение векторов, можно написать только один раз эту функцию потом использовать по многу раз, даже тот же самый вывод на консоль это функция, если бы не было его то пришлось всю логику вывода на консоль писать каждый раз когда потребуется
Код становиться чище, но все равно необходимо написать так же условие передачи функции. =) Но так код хоть оптимизирован
DataFromAstral это сильно :)))
Мой универсальный препод по программированию все время называл тестовые переменные doloto1, doloto2... :)
string GetDataFromAstral(double mercuryPosition) {
return DoMagic(mercuryPosition)
}
Спасибо!
Большое вам спасибо!)
Ёлки-палки. Смотрел многопоточное программирование, а там сказали какой-то урок про лямбду посмотреть для понимания. Стал смотреть про лямбду, там сказали посмотреть про полиморфную обертку. В полиморфной обертке отправили сюда и еще куда-то про цикл foreach... Короче, обход дерева в глубину
Линейный список. (как открыть ларёк): ...через 2 дня пришел. Сказали, я слишком худой - надо пойти поесть, чтобы 2 дня не есть, чтоб потом сдать кровь, чтоб жизнь страховать, чтоб прийти в банк, чтоб прийти в ЗАГС, чтоб пойти в ЖЭК, чтобы пойти в УВД, чтоб пойти в МОСГОСТРАНС, чтоб пойти в УПРАВУ, чтоб пойти в БТИ, чтоб пойти в ФНС, чтобы открыть ларёк...
забавная ситуация)
Очень понятно все объяснил, спасибо
крутая вещь, спасибо.
Cпасибо
Ожидал, что пример будет по функции rand(); Мне кажется она реализована по тому же принципу и ссылается видимо на srand(); учитывая что вторая расширяет функционал первой.
лучший, огромное спасибо
Неплохо было б подать в качестве аргумента массив указателей на функцию и последовательно исполнять их.
Для закрепления материала
Массивы указателей на функции. Обычные и динамические.
Чтобы усложнить задачку функция, передаваемая в виде аргумента в другую функцию, так же принимает параметр.
В конечном итоге передача указателя на функцию в качестве параметра другой функции в цикле из массива таких указателей :)
Внизу есть пара вопросов, буду признателен, если получу на них ответ.
#include
#include
using namespace std;
// функции, которые я буду использовать в качестве примера
string GetDataFromDB(string DBName)
{
return "Data From DB: " + DBName + "
-----------
" + "Record1
Record2
Record3
...
...
...
RecordsN
";
}
string GetDataFromWebServer(string ServerName)
{
return "Data From WEB-Server: " + ServerName + "
-----------
" + "WEB1
WEB2
WEB3
...
...
...
WEBN
";
}
string GetDataFromUser(string UserName)
{
return "Data From User: " + UserName + "
-----------
" + "UserData1
UserData2
UserData3
...
...
...
UserDataN
";
}
string GetDataFromSkype(string NickName)
{
return "Data From User: " + NickName + "
-----------
" + "SkypeData1
SkypeData2
SkypeData3
...
...
...
SkypeDataN
";
}
// объявлю и константу, чтоб с ней поиграться
const int SIZE = 4;
string(*GetData_addresses[SIZE])(string SRC) = {&GetDataFromDB, &GetDataFromWebServer, &GetDataFromUser, &GetDataFromSkype };
// вместо адресов при перечислении элементов массива можно указать просто имена (указатели) функций
string(*GetData_fun_names[SIZE])(string SRC) = { GetDataFromDB, GetDataFromWebServer, GetDataFromUser, GetDataFromSkype };
// смешанное перечисление
string(*GetData_mixed[SIZE])(string SRC) = { GetDataFromDB, GetDataFromWebServer, &GetDataFromUser, &GetDataFromSkype };
void ShowInfo(string SRC, string (*fooPtr)(string str))
{
cout
заранее сорри за некропостинг
// 1. почему объявление такое же, как у двумерного массива?
я не уверен но может это из-за того что мы создаем массив с указателями на функции? тобишь по факту это указатель на указатели на функции
потому и объявление как у двумерного массива
берем адреса для ячеек а в них пихаем указатели для функций
друг друг, стой. Ты не на стековерфлоу зашёл, успокойся немного хахаххаа
ставлю лайк, спасибо за ваши уроки)😀
Круто!!!
Спасибо.
Подскажите плис. Поделитесь опытом как закреплять пройденный материал. Очень похоже на то, как будто ощущаешь себя каким-то пассажиром. Всё вроде понятно, проходит время и .....
Перемешивать обработчики прерываний в микроконтроллера удобно
если ты мало чего запоминаешь - заведи тетрадь/блокнот
Спасибо, сижу блин в академии тема: Лямбда выражения, препод как-то поверхностно объяснил. Вот сначала посмотрел про указатели на функции)
Я в своё время сформулировал для себя, что имя функции это её метка или адрес. Вызов через косвенную адресацию.
автор красавчик неимоверный ура
С начала он говорит что указатель на функцию не требует начальной инициализации а потом делает это😶
@@Empty_line в любом случае, раньше я не знал про это вообще ничего, а теперь знаю что такая штука в принципе существует и смогу ей воспользоваться на плюсах при необходимости
это круто
Полезная функция
Спасибо, толково ))
Cергію. Після спроб дізнатись щось на інших каналах, на #SimpleCode повертаюсь немов додому. Дякую!
Круто, полиморфизм в процедурном стиле)
Спасибо за уроки. А работа с файлами будет?
будет
привет из 2023. Спасибо большое за уроки!"
Очень класные видео спасибо за контент
Сергею, большое спасибо за уроки!
Вопрос к знатокам.
Как быть, если "сторонняя" функция принимает аргументы?
Допустим:
string foo1 (int x); (возвращает строку с х в конце)
string foo2 (int x);
то вот так уже не работает,
void GetFrom (string (*foo)(int x))
{
cout
Именно так, с дополнительным аргументом. GetFrom(string(*foo)(inx x), int x) {};
И вызов соответственно GetFrom (foo1, 42);
Если вам не нравится такой способ передачи данных в функцию, то нужно представить себе, каким он должен быть по вашему разумению, и попытаться реализовать. К примеру использовать переменные-буферы в общей зоне видимости. Ну или побороть чувство чего-то не того между (foo1(42)) , в случае которого вы сразу передаете результат работы функции foo1 (т.е. стринг) , и (foo1,42) - смотрите, даже на один знак меньше требуется)
@@Сергей-т9д7в , спасибо большое за ответ.
Буду разбираться.
Спасибо за урок!!! А может кто-нибудь подсказать как сделать так чтобы пользователь не вводил ShowInfo(DataFromBD); ручками в коде, а чтобы он, например, вводил в консоли DataFromBD и ему выходили данные?
Приведено 2 варианта реализации: 1й Вариант - определяет ссылку на функцию, и нет возможности в эту ссылку добавить реализацию через {} - к примеру то же действие вывода на экран - cout, 2й вариант - в конце - создает функцию в которой есть своя реализация внутри { cout...} с вызовом по ссылке функций Data..., однако, без возможности передачи параметров. Вообщем не не вижу для себя удобства - так как если создавать свою функцию, то зачастую нужно передавать параметры в вызываемые по ссылке функции. А если мы внутри main создаем эту конструкцию - то тогда и ссылок ненадо - прямые обращения к функциям быстрее и короче
Van Dyke, полностью согласен! Реализовать 2 вариант с передаваемыми параметрами можно , но супер не удобно. Так что по сути ваше утверждение полностью верно, намного быстрее и читабильнее вывести функцию напрямую.
Вернулся пересмотреть после видео с абстрактными классами :)
Полезно и понятно)
С начала он говорит что указатель на функцию не требует начальной инициализации а потом делает это😶
@@Empty_line о нет!! об этом явно нельзя молчать!!!!!!!!!!
@@hatred58 В смысле?
@@Empty_line чувак тебе самому норм об этом в каждом комменте писать?))
@@hatred58 Пока не дождусь ответа
Читайте Подбельского... там все тоже самое из прошлого века. Ну и скажу что это очень давно придумано в С++ (на самом деле использовано в с++ как и ООП) как и многое другое... Указатели на функции очень круто использовать для меню... поспорил как-то в прошлом веке кто напишет определенное меню на с++ или визуал бейсик.. типа.... я чуть ли не в блокноте на с++ напишу меню... либо среда визуал бейсик (с подсказками). на один день опоздал... проиграл спор (три дня на задачу вне работы.) Но я показал оппоненту... что как за пять минут расширить функционал меню за счет указателей на функции, когда ему пришлось бы тоже самое сделать опять за три дня... с тех пор началась моя любовь к с++.
такой момент, а можно ли сделать перегрузку функции, которая принимает функцию через указатель
(как пример: одна функция принимает обычные функции, а другая - функции с указателями)
чет я встярл с этими указателями. понимаю вроде , а потом все исчезает из памяти
через консоль можно вызвать нужную функцию?
Огромное спасибо! Да.. я из этого урока зачерпнул полезного. Но вопросы остались: Каким образом возможно протащить параметры различных типов, через эту связку? Что бы параметры можно было задать в функцию ShowInfo(), потом какую то их часть обработать в её теле, какую то в теле конечных функций.
Ну думаю на ответ с различными типами данных в параметре помогут шаблонные функции, а вот на второй вопрос к сожалению ответа дать не могу
@@Miiazzma как вы думаете? я за два года нашёл ответы на свой вопрос? или нет? 😅
@@BrownAleks да?
А есть возможность сделать указатель на встроенную функцию, такую как min() или max()?
С начала он говорит что указатель на функцию не требует начальной инициализации а потом делает это😶
Архангельский просто отдыхает.
super
С начала он говорит что указатель на функцию не требует начальной инициализации а потом делает это😶
@@Empty_line ну и
@@_drevn1y_ Ну и почему?
@@Empty_line он хотя бы за бесплатно учит, и столько времени уделяет чтоб другие поняли
Как только заработаю первые деньги с программирования, кину половину тебе
Это будет не много, давай ты подкопишь годик-другой а потом кинешь :)
Извини, но это звучит так высокомерно.
Ну как, заработал и кинул? Или пошёл в другом направлении, любопытно очень
@@baki-taki уже пошел на стажировку по фронту, но начался карантин и ее перенесли. Постараюсь, чтобы взяли. Писал на spring boot и angular курсовую, если интересно.
Steve фронт это же не c++, как твой путь сложился, расскажи
чел, мне очень обидно за Тебя. Такой огромный, качественный труд, а теперь убрали монетизацию. это треш. Дай Бог Тебе здоровья. это зачтется. Я вчера проходил собес на джуна, жду ответ, думаю что все хорошо. Учился на Твоих видосах. спасибо
Работаешь уже?)
@@DaniilS98 угу)
@@Непрофессионалымы слушай, а ты с c++ начал? Расскажи плиз как вообще учился че делал
@@DaniilS98 изначально учился на java . javarush ресурс был такой. в рамках интересов начал работать с arduino и есп. где то год пилил свои проекты и изучал ардуино. вообще она стала такой прослойкой для меня между java и c++. потом возникли сложности с трудовой деятельностью и нужно было выбирать дальнейший путь и профессию. решил учиться на c++. посмотрел этот канал, попрактиковался и вылез на hhru. получил около 50 отказов и грубо говоря 51 взяли на работу. почему не остался на java? потому что просто больше понравились плюсы
@@DaniilS98 но самое главное я очень очень много писал. безобразного и отвратительного кода, который все-таки работал, но показывать который стыдно. без этого никак не научишься. нужно придумать себе проект и реализовывать его от начала и обязательно до конца. в какой-то момент поймешь что пришло время показать себя
Со второго раза только понял о чем речь и логику. Но так до конца не понял, в чем все-таки необходимость и преимущество использования промежуточной функции ShowInfo(), по сравнению с тем, что я могу напрямую обращаться к фунциям коллег, например GetDataFromBD() ?
Потому что назначение функции GetDataFromBD() - это возвратить какое либо значение и только. А уже функция ShowInfo() ,,напечатает,, это значение в консоль. И если вдруг понадобится еще это возвратимое значение передать иному пользователю по сети , то будет достаточно создать самому еще функцию к примеру
void TransmitOverNetwork () с указателем ,затем в void main() сразу после ShowInfo() ; вызывать её с параметрами TransmitOverNetwork (GetDataFromBD); и тогда городить всякие условия (костыли) внутри функции void main() уже не надобно. Читаемость(упорядочность) кода повышается (конечно если только хорошо понимаешь .что такое указатели...)
Ржал от "дата из астрала"))))
Надо было объяснять на примере коллбеков. А то пример с коллегами прям какой-то сложный
да про коллбеки интересно было юы видео
а делегаты в С++ есть?
все понятно. Но как все это запомнить. А еще дальше сколько информации ..
конспекты для такого люди придумали...сидишь , записываешь, что-то забылось, открыл конспект - вспомнилось
вот и весь сказ
Здраствуй, после месяца(или чуть больше) использования visual studio, мне пришло уведомление" лицензия закончиться через 5 дней. Смогу ли я пользоваться програмой через 5 дней?
А я по незнанию удалил. Думал скачал платную версию. И скачал заново. Как я недодумался спросить :))
До этой формулировки я пытался амперсанд ставить перед именем