Приёмы использования ссылок на функции в C (Си) • Live coding
Подкрадываемся к ООП. Начнём с простого: с эксплуатации факта, что в C функции (как и всё остальное) — это указатели. Как нам это поможет прямо сейчас захотеть и сделать что-нибудь объектно-напоминающее? И зачем? Разберёмся. Таймлайн: 00:00 — Вступление: последний стрим 2024 года 01:30 — Зачем говорить об ООП в C, если язык для этого не предназначен? 02:45 — Почему объект — это про поведение, а не данные 04:00 — Первый шаг к ООП в C — функции и указатели на них 05:30 — Указатели на функции: зачем они нужны 06:40 — Пример: подмена printf указателем 08:00 — Функции — не переменные, а вот указатели — да 09:10 — Как объявить указатель на функцию: синтаксис и шпаргалка 11:00 — Псевдонимы типов (typedef) для указателей на функции 12:40 — Облегчение записи: не нужен знак `*` при вызове 13:50 — Зачем нам указатели на функции? Для переключения поведения 14:40 — Два способа использования: один указатель — много функций / одна функция — много указателей 15:30 — Схемы с картинками: наглядные объяснения 17:00 — Перемещаем указатель между функциями или вызываем одну из разных мест 18:30 — Указатели на функции с разным числом аргументов 20:00 — Пример без пользы: странный кейс, но синтаксис возможен 20:40 — Функции высшего порядка: функция как аргумент 21:30 — Пример: apply-функция с указателем на другую функцию 22:10 — Где это применяется: for-each, сортировки, обработка коллекций 23:00 — Пишем функцию-итератор с указателем на функцию 25:00 — Пример на массиве: вызов функции для каждого элемента 26:10 — Пример с сортировкой: разные функции сравнения 27:30 — Callback-функции и меню: шаблоны поведения 28:30 — Псевдо-ООП: generic-конвертеры на макросах 30:00 — Использование `_Generic` в C11 для выбора реализации 31:00 — Демонстрация макросов и проблем с типами 33:00 — Пишем макрос, определяющий тип переменной 34:00 — Тестируем: `int`, `char`, `double` — работает! 35:30 — Хотим всё через указатели: пробуем сделать структуру 36:30 — Пишем массив указателей на функции 38:00 — Технические сложности: отступаем от массива 39:30 — Вместо массива — диспетчер-функция 41:00 — Попытка универсального диспетчера — неудачна, идём другим путём 42:00 — Переход к игре: демонстрация идеи 43:30 — Прототип: ввод символов, действия со случайным числом 45:00 — Игра как кейс: одна функция — много указателей 46:00 — Присвоение случайных функций каждому символу 47:30 — Прямой вызов функции по символу через массив указателей 49:00 — Без кодов, без `switch` — просто указатель 50:00 — Decision-функции: шаг или пропуск 52:00 — Добавляем randomness: иногда просто `skip` 53:00 — Разные функции под одним типом — и вызов по ситуации 55:00 — Работает! Печатается: "не хочу делать шаг" 57:00 — decision pointer = ST или SKIP, потом вызов 58:30 — Всё работает: вызов функции по указателю 59:00 — Два подхода из ООП реализованы: 1. Много указателей на одну функцию 2. Один указатель на много функций 1:00:30 — Использование указателей: зачем вообще всё это 1:01:00 — МОК-функции, callback-и, структуры с функциями внутри 1:01:45 — Проблема `this`: нужно явно передавать структуру 1:02:30 — Да, можно "эмулировать классы", но без магии `this` 1:03:10 — Итог: всё, что можно было — показали; остальное — в будущем Конспект: https://github.com/olgapavlova/lectur...