- 10
- 21 786
Olga Pavlova
Israel
เข้าร่วมเมื่อ 9 ก.พ. 2007
Стримы по языку программирования C (Си) для начинающих • Ничего не продаю
Практикуем мышление указателями в C (Си) • Live coding • Refactoring
Вот указатели в C. Они есть. Хорошо, мы потерпим. Или начнём получать удовольствие?
Попробуем перейти от мышления «оперируем данными» к мышлению «оперируем указателями». Поначалу это примерно так же больно, как думать объектами. Или - для начинающих - функциями и переменными. Потом, конечно, затягивает.
Зачем думать указателями? Например, чтобы перестать думать об утечках памяти. Или о совместимости данных при вызове функции. Или избавиться от практики создания массивов для конкретного типа данных. Да-да, совсем-совсем.
Как думать указателями? А вот как раз начнём. Пощупаем что успеем за час - и не в последний раз, конечно.
Попробуем перейти от мышления «оперируем данными» к мышлению «оперируем указателями». Поначалу это примерно так же больно, как думать объектами. Или - для начинающих - функциями и переменными. Потом, конечно, затягивает.
Зачем думать указателями? Например, чтобы перестать думать об утечках памяти. Или о совместимости данных при вызове функции. Или избавиться от практики создания массивов для конкретного типа данных. Да-да, совсем-совсем.
Как думать указателями? А вот как раз начнём. Пощупаем что успеем за час - и не в последний раз, конечно.
มุมมอง: 7 380
วีดีโอ
Как делать на C (Си) функции с произвольным количеством аргументов • Live Coding
มุมมอง 81811 วันที่ผ่านมา
…а заодно и дебаггинг случился. Поэтому видео такое длинное. Баг нашли, всё кончилось хорошо :) Впредь урок и мне тоже - в конце концов, это же учебное видео. Теперь по сути. Функция printf() умеет принимать сколько угодно аргументов - нам тоже надо! Сделаем. А чтобы не улетать в теоретический космос, напишем за час конкретный проект: микробиблиотеку для сборки менюшек программы на C. Ну там «Н...
Ошибки как часть дизайна программы на C • Live coding
มุมมอง 72118 วันที่ผ่านมา
Что делать, если пользователь ввёл чушь? Как быть, если файл не существует? Ну вроде все знают, что делать и как быть - но боль не утихает. Давайте примем болеутоляющее: посмотрим на разные способы работы с ошибками, обсудим их плюсы и минусы. И покодим, конечно же.
Как писать функции, применимые к разным типам данных, или Мнимый полиморфизм в C (Си)
มุมมอง 6K25 วันที่ผ่านมา
Вы замечали, что одним и тем же оператором * можно умножать числа самых разных типов - а вот вывод на печать требует очень разных команд форматирования (% и дальше целый зоопарк)? Не говоря уж об аргументах функций. Не говоря уж о массивах. Не говоря уж… А почему, собственно, не говоря? Давайте поговорим! И избавимся от диктата типов данных (ну, почти).
Приёмы использования ссылок на функции в C (Си) • Live coding
มุมมอง 4.2Kหลายเดือนก่อน
Подкрадываемся к ООП. Начнём с простого: с эксплуатации факта, что в C функции (как и всё остальное) - это указатели. Как нам это поможет прямо сейчас захотеть и сделать что-нибудь объектно-напоминающее? И зачем? Разберёмся.
Продвинутые техники и конкретные приёмы работы в check.h • стрим, лайвкодинг
มุมมอง 414หลายเดือนก่อน
Основы фреймворка Check мы уже пощупали. А как конкретно с ним работать? Как писать код тестов в деталях и на конкретных задачах? Разберёмся.
Логирование в небольших проектах на С (Си) • Livecoding
มุมมอง 796หลายเดือนก่อน
Соберём простую и гибкую систему ведения логов в небольшом C-проекте. Захотим большего и обсудим, где это большее получить. Ключевые слова лекции: модули, заголовочные файлы, препроцессор, stderr, встроенные макросы, уровни логирования, проектирование архитектуры проекта. Примерное содержание лекции: - уровни логирования; - условная компиляция при логировании; - `grep` и `tail -f` для работы с ...
Использование отладчиков gdb-lldb в проектах на языке C (Си)
มุมมอง 628หลายเดือนก่อน
В прямом эфире трогаем лапкой lldb - систему отладки кода. Основы, конечно. Посмотрим типовые приёмы. Всё на реальном коде. В самом начале - немного объяснений, что куда зачем.
Нюансы работы с файлами • C + Linux + Mac
มุมมอง 8642 หลายเดือนก่อน
В системе Linux всё - файл. Что бы это значило? А вот как раз и разберёмся. Пощупаем высокоуровневую и низкоуровневую работу с файлами, посмотрим на неожиданно-тоже-файлы, а может быть, даже что-то успеем измерить. Всё - на живом коде.
Основы модульного тестирования и BDD • Введение в C-фреймворк Check • Стрим, лайвкодинг
มุมมอง 1.1K2 หลายเดือนก่อน
Стартовая информация для тех, кто изучает программирование, начал с языка C и добрался до словосочетания «юнит-тесты». По верхам знакомимся с теоретической частью: TDD, BDD, xUnit, Check. Быстро кодим базовый пример C Check. А потом ещё один, посложнее. Код и конспект: Github → olgapavlova → lectures (когда можно будет, вставлю и ссылку).
Ждем продолжения. Отличный формат получился.
Окей гугл. Можно ли считать указателем в Си, тоже что адрес ячейки в экселе? то есть что бы автоматизировать какую то формулу, я пишу не 6, адрес ячейки АБ 77, в которой другая формула вычилсяет это 6. а потом оно само изменится на 284. если да, то ок, я пошёл спать. если нет - ну я не понял, почему char * data, char * c, и как мы зоздав копию цикла получили код ANSI. прошёл курс C, полчил кол, не понял зачем городить конструкции и почему запрет на что ли бо в main, кроме вызова функции, обственоо после это непонимания перестал понимать остаьное. кенрнигана и ричи пока прочитал предисловие и тираж ))) о вобще - переменная, она на то и переменная, а не постоянная. фор от ноля до икса. зачем указатель на икс. for i = 0; i < lenght of iks
Примитивный, из каждого утюга и во всех интернетах хайп на указателях в "С" окончательно разжижает и до того неокрепшие умы потребителей интернет-курсов, накачивает пустые черепки, их содержащие, чувством глубоко удовлетворения от буквально осязания сокровенного знания .))) Но возьмите любую классическую книгу по "С" и попробуйте найти в них хоть слово о том, что указатели это что-то особенное, какая-то изощренная выдумка для особо одаренных - не найдете.
Интересный материал!
1. Однако в большинстве случаев разница минимальна, особенно если компилятор хорошо оптимизирует код. Если в коде нет явного узкого места, связанного с использованием памяти или копированием, указатели могут не давать значительного выигрыша. ЧатЖипити. 2. Утечки памяти - их нет так как одно выделение new в шаблоне компилятора - он и освобождает.
2. Если есть доступ к шаблону компилятора (конкретно у слушателей этого стрима - нет).
@@olgapavlova , я имею в виду шаблонный файл компилятора который он автоматически генерирует для нового проекта.
@ Спасибо за мысли. Мне надо подразобраться - и если тут будет что, рассказать. С утечками у многих трудности.
Е**аать Серсея Ланнистер учит зелень языку С, наконецто топовый контен, это билайк подписка
прекрасные лекции, прекрасный программист, жаль роzzиянка
Указатель на указатель на массив указателей на char! Как тебе такое Илон Маск?
Спасибо! Нужно попасть на стрим, пока продолжу в записи
Спасибо за ваши видео!
Спасибо за видео, жаль мало. Но впереди ещё есть несколько видео))
Это самое крутое видео об указателях на русском языке! Спасибо, Ольга!
потом гляну, не удаляйте видос)
Не глянешт
Моя сестра была рада, что эта женщина рассказала ей об этом.
average russian mother
Ольга, спасибо, скиньте свой конфиг на vim
В следующих сериях.
1 Хочу поблагодарить за такой поток, как по мне, такой контент имеет оч высокий потенциал, хочется поддержать вас, Ольга, продолжать развиваться 2 Я понимаю, что есть некоторый лоск в live coding, но получился неловкий кич. Лучшая импровизация, которая заранее отрепетирована. А то получилась структура которая хранит size, который получается из strlen и возникает логичный вопрос а сразу strlen нельзя? Можно заранее и продумать и написать код, который потом повторить на потоке, как некоторые докладчики делают, когда с ноля накидывают фреймворк или библиотечку, показывая какую-то идею 3 Есть вопросики по поводу ЦА этого потока, с одной стороны, вроде бы речь о базовых вещах, с другой предполагается, что зритель уже умеет оперировать и звёздочкой и амперсандом 4 Неадекваты всегда будут приходить на поток со своими неадекватными вбросами, и хорошо бы научиться реагировать на них иронично а иногда и самоиронично, а не теряться и выпадать на минут 10 5 Это конечно не моё дело, прошу за это прощения, но не хотели бы вы добавить себе на полку пару книг про зажимы в теле(в частности, челюстной зажим) и про проживание эмоций(модный эмоциональный интеллект)
Ой вы что-то расписались :) Смотрите дальше, комментируйте по сути дела, ориентируйтесь на то, чтобы ваши комментарии были полезны другим слушателям.
Я бы рекомендовал Вам, Дима, другую книгу или видео лекцию. Про то, что "каждый критик - г-ноед". Там очень хорошо разбирается психическая суть натуры критиканов
@@neocortexlabя вижу вы её если не написали, то прочитали до дыр
Здравствуйте. У вас есть в планах лекция по динамической распределении памяти?
Да, и вряд ли одна. Тема-то ого-го!
"ничего не продаю" - идеальные ютуб ролики
Задача со "звездочкой" - автоFREE, не ясно как решить :) Рассмотрев раст, можно сказать, что ты четко определяешь lifetime у каждой переменной в своем коде, круто. В си если начать делать абстракции в стиле монолита, я бы начал делать аналог malloc, который возвращает не указатель, а абстрактный "объект" по вашим словам. Как определить lifetime? Ну, я не знаю идеально о работе сборщика мусора, но предполагаю некоторые вещи. Давайте заведем для каждого объекта поле size_t ptr_count, и скажем, каждую "проверку" сборщика посмотрим на все "объекты", и если у них 0 ссылок, и закончился НЕИЗВЕСТНЫЙ lifetime, то удалим. Хорошо, но как определить lifetime? Как вариант - у каждой переменной сделать lifetime буквально в теле функции, а если она понадобится позже, то заведем на нее указатель и вернем в функцию выше. Тут возникает проблема - нельзя обойтись без вызова clean_all_useless() в каждом теле каждой функции. Эту проблему у себя в голове на чертеже я еще не решил! :(
И хотелось бы оставить еще один комментарий. Вам не кажется, что если начать модерироавть чат, то он совсем опустеет? Да и в целом, каждый чат на стримах содержит в основном мусор. Даже у TSoding в основном мусор, хотя казалось бы, если много подписчиков, то умных тоже должно быть приемлемое количество...
Почему-то ютуб мой комментарий удаляет. Хотел поделиться как я пытался в стиле ооп на си писать, использвать обединение и войд звездочка😮😢
Что ж вы там такое написали, что даже TH-cam испугался :)
Что будет если вызвать metastr_create так: metastr_create("abcbnbnb")? Наверное надо маллок("фывфвфйв") делать внутри metastr_create иначе в структуре данные будут указывать кудато на стек и соответственно затрутся.
Да, именно так. Стандартный путь: обвешанный разными свистелками malloc() внутри функции создания [объекта], и наружу отдавать указатель.
Собрались мазохисты кайф ловить 😁
Старый сейчас ии рулит. Ии все сделает за тебя. Зачем развиваться эти бессмысленные понты, дядя! Сейчас ты берешь едешь в америку делаешь деньги с ии. Ничего более не нужно дядя.
Ну и как у вас успехи?
@@DuplexKrokodile, лучше его не тревожить: это мастер по раздаванию советов 😂
Более того, сам язык С был придуман этническими украинцами, бывшими жителями львова Богданом Керничуком и Денисиком Реченко. А язык С++ придумал житель ивано-франковска Богдан Струпенко.
Узбекистан, кстати, готов оспорить первенство. Подробней тут: ru.wikipedia.org/wiki/Ющенко,_Екатерина_Логвиновна
Кстати, спасибо за идею! Купила только что знаменитый учебник «Элементы программирования» - если там к 2025 году осталось о чём поговорить, кроме истории, то и поговорим. Слава букинистам.
Когда хотел выпендриться, но не получилось)
Здравия Ольга. Спасибо за уроки, знания, по Си. Мне очень понравился язык, его логика, близкая к логике процессора. И конечно быстродействие. С++ не хочу учить, ибо это уже не ЯП а разбирание, запоминание названий функций, написанных иными людьми с своим подходом. ООП сильно раздувает проекты, где 99% функций объектов, классов, не используется :( Но в программу весь этот мусор компилируется. Да, указатели не обычны для моего мозга :) Не могу привыкнуть что переменная указатель, хранит адрес а не значение, как в обычных переменных. Не очень комфортно в Си под Виндой программы писать, консольные. Но Си прекрасен! Когда я в 1995 году, начинал программировать, с изучением Си произошла нелепая ситуация :) В то время, популярны были Паскаль и Си. Я пошел в библиотеку, взял огромную книгу с дискетой, на которой был редактор для ПК ;) И программа "Hello Word!" не компилировалась =)))) В последствии я понял что проблема была в путях редактора кода :) На дискете был не инсталлятор. Так я стал учить Паскаль, Делфи позже. Но Борланд "пал" и Паскаль с Делфи тоже.
А я примерно в те же года, может чуть раньше, купил книжку по бейсику и программировал просто на бумажке.
Не знаю почему и как, но ютуб периодически подсовывает видео этого автора и я наконец кликнул. Это прекрасно, смотрим, изучаем.
Я из нью-эйдж поколения разработчиков которым одновременно и легче и труднее. Легче потому что в современных языках сложные вещи где можно легко ошибиться заботливо убраны в пакет с каким-нибудь говорящим названием, например unsafe. В Go и Rust например так сделано. Язык на начальных уровнях выглядит очень простым. Труднее становится когда приходится вылезти из этой песочницы по какой-то причине, например из-за проблемы производительности при высокой нагрузке на приложение. Тут же оказывается что на самом то деле всё гораздо интереснее и страшнее устроено. Вот я заметил паттерн что какую подкапотную механику языка ни копни, неизменно находишь лекцию об этом с конференции по языку С, где умные люди рассказывают что там на самом деле происходит с машиной и как с этим быть. Спасибо за ваши лекции!
Только начал Си, вроде как базу закрыл и тут наткнулся на этот канал, что то на интересном рассказываете
Даа..помню, как они меня парили) Мне бы тогда это видео! Нужная тема. Спасибо!
чатгпт надо оставить джаваскриптизерам
С умом и осторожно даже из ChatGPT можно пользу извлечь.
И отупеть. Свою нейронку в голове надо развивать.
@@arzamas1988чиво??? Ково,?? Сам понел шо напесал????
Здравствуйте. Лекция получилась интересная. Но один вопрос из чата так и остался без ответа. Что всё-таки с зарплатами программистов на си?
Ну почему же без ответа. Ответ всё тот же: мне эта тема не интересна, а кругом полно желающих её обстоятельно обсудить. Их спрашивать точно эффективней.
Огонь! Очень интересно! С нетерпением жду следующий стрим, особенно реализацию смарт-поинтеров!
Разобрался с указателями на С только когда окунулся в ассемблер. И стал мыслить терминами: "передвинуть" указатель, взять значение по этому адресу и т.д. Язык С открылся с другой строны...
учите раст бога ради
Что это поменяет?
@@ted_res необходимость ловить висящие указатели???
@ это абстракция, не более. Раст лишь позволяет компилятору лучше понимать жизненный цикл памяти. Это круто, конечно. Но суть указателей не меняет. Вообще, чем больше знаешь языков, тем меньше увлекают все эти свистелки, потому что плюс-минус всё одно и то же. Машина Тьюринга, память, ввод-вывод.
@@ted_res в случае с С к этим трем базовым компонентам регулярно добавляется четвертый - segfault
@ и да, раст как раз меняет суть указателей. указатель теперь указывает не на буквально адрес памяти, а на владение объектом. то есть то, в какой момент он будет прибран
О, алгоритм youtube сработал удивительным образом и я случайно попал к вам. К моей радости) Вы правы, в глазах "кошмар и ужас", но да ладно, трудности от непонимания происходящего на видео закаляют характер. Пы сы: программирование для меня "сложно,сложно непонятно". Надеюсь со временем убрать эту досадную неоплошность
Точно уберёте, если не будете останавливаться. Успехов! Если готовы всерьёз тратить время - очень рекомендую лекции Тимофея Хирьянова. Примерно любые, они все для новичков и очень доброжелательные. На TH-cam есть.
Попытка сделать рассказ - аналог того о чем писали банда 4х в своей книжке по паттернам ооп.
Работа с указателями в си - это задача со звездочкой)
Это база
запишите видос про представление данных на Си
Можно было malloc и не использовать, название переменной массива в C - это уже указатель на первый элемент, нужно было просто знак '&' убрать, а так вы пытались получить указатель на указатель
Я бы даже сказала, что и нужно. Но в демонстрационной ситуации есть нюансы.
@@olgapavlova Я так понял что это было поводом ввести malloc в повествование.
@ Скорее саму идею ненужности переменных там, где достаточно указателей.
суперская лекция, будет ли в будущем затронута тема с ABI?
Точно да - и точно не в ближайшие два месяца.
Ольга, если позволите - конструктивная просьба. Если не затруднит - не могли бы Вы принять какую-то Конвенцию Именования? Иногда трудно понять что за чем хранится. Скажем, было бы здорово, если бы p_str соответствовал &str, и чуть меньше аббревиатур - хотя бы в рамках обучающих примеров. Спасибо за Вашу работу!
Это будет непросто, но я постараюсь :) Спасибо за предложение!
Таак... Подошли структурно-адресные измывательства мозговых извилин... Полезные упражнения!!!
Указатель в общем виде именно указывает на адрес в памяти. Об этом свидетельствует размер указателя. Например в системе x86 любой указатель будет равен 4 байта. В x86 используется плоская модель памяти. Но в системе где шина данных имеет одну ширину, а шина команд другую указатели будут иметь разную размерность. Так если указатель это адрес то в чём особенность? У указателя есть тип и поведение соответствующее типу. Например указатель на int * pi при pi + 1 будет прибавлять к адресу размер int, а указатель на char * pc при ср + 1 будет прибавлять 1(размер байта). int i; char c; int * pi = &i; char * pc = &c; printf("pi : 0x%X, 0x%X ", pi, pi+1); printf("pc : 0x%X, 0x%X ", pc, pc+1); напечатает pi : 0xED7F7F2C, 0xED7F7F30 pc : 0xED7F7F2B, 0xED7F7F2C
Всё так. Исхожу из того, что это слушателям уже известно.
@@olgapavlova Я полагал что показано на стриме это и есть обыденность.
@ А у всех же разная.
4:33 ну так автор так и сказала: "давайте устроим арифметику указателей". Это ровно то, о чём вы написали. С подтекстом, что всё это и так понятно, а теперь давайте развлекаться с функциональщиной :)
@@ted_res Ну это прозвучало в контексте истории указателей как и фраза "указатели слишком многозначные" 1:28.
Ольга, вы молодец! Хорошее дело делаете!
Очень интересный заход на тему. Это почерпнуто из книжки или дамп мозга после наложения опыта? И еще: как будто видео обрывается без вывода. А вывод что обычный пойнтер это имплицитный, универсальный, встроенный metastr?
Микс того-сего по мотивам и книжек, и практики. Я усилием воли заставляю себя затыкаться в первый же удобный момент после часа вещания :) Поэтому внезапно, да.
“For some reason most people seem to be born without the part of the brain that understands pointers.”, Joel Spolsky, 2006.
У всех есть свои белые пятна. Но у каждого должен быть шанс.
Здравствуйте, спасибо за видео‼️🫡 Многие не рекомендуют для начинающих книгу: Язык программирования Си, Брайана Кернигана, Денниса Ритчи, я как начинающий с ними согласен🤔 Интересно услышать иное мнение.
Вы знаете, я тоже с грустью на неё смотрю. С одной стороны, прочесть надо, чего б не прочесть, она маленькая и простая. С другой - хоть это монстры и корифеи, но так, как они, сейчас код уже не пишут. Особенно так не пишут при освоении азов программирования. А сейчас C - во многом учебный язык. И да, сильно подозреваю, что манера Кёрнигана-Ритчи писать код собьёт новичка с толку. Эдакое «всё лучшее сразу», посильное только людям с очень прокачанными навыками работы в знаковых системах. Резюме: если не нравится - бросайте немедленно, можно обжечься об эту книгу. Если нравится - вреда не будет.
@@olgapavlova Ритчи не пишет код, поскольку уже 13 лет как почивает на небесах. А Керниган пишет код прямо сегодня, поддерживая, в частности, всему миру известный awk (в названии которого «K» - именно потому, что Керниган).
@ Речь же про код в книжке. Его уже никто не пишет.
@@olgapavlova не зашла книга, не дорос до неё походу, пока читаю сборник Андрея Столярова 2 - е издание и то не весь, пропустил пока часть про Assembler, по Паскалю прошёлся и то бегло из уважения к автору🤔
@@olgapavlova Очень даже пишут. И не студенческие зачёты, а огромные проекты. Например, целые операционные системы :) Из доступно изложенных книг по С могу порекомендовать Стивена Прата (Stephen Prata). Да даже приснопамятный Герберт Шилдт по С написал в своё время отличную книгу. И он же умудрился написать ужасную книгу по С++ :)
Очень интересно и удивительно актуально, вне зависимости от уровня. Спасибо огромное!
Спасибо! Такой вопрос: как программно узнать в Си, что в процессе вычислений произошло переполнение (вышли за разрядную сетку)? Например, есть байтовая переменная в 8 бит со значением, например, 250 и другая такая же переменная со значением, например, 2 и мы перемножаем эти переменные и результат помещается в переменную того же типа. При этом на нашей платформе 8 бит это максимум, т.е. не можем хранить результат, скажем, в типе, размером 16 бит. Есть ли какой-то флаг, чтоб определить переполнение? Указанные типы исключительно для примера и на их месте могут быть типы 32 или даже 64 бита.
Интересный вопрос, спасибо. Я бы начала поиски удачного решения с простой практики: совершить обратную операцию и посмотреть, получилось ли исходное число (возможно, с допуском). Очевидно, что если не получилось, то имеем переполнение. Посмотрю, есть ли решения получше.
@@olgapavlova В случае '+' и '-' обратная операция для каждой будет давать исходную цифру (число). Для '*' обратная операция '/' позволит выявить, но деление не лучшая операция для этих целий. У многих процессоров и микроконтроллеров есть аппаратный флаг переполнения, но видимо, кроме как ассемблерной вставкой его не получить, а это не красиво смотрится (но эффективно с позиции количества инструкций и скорости). Красивого минималистичного решения не знаю.
@@enginetica То-то и оно, что в два прыжка не получится. Короче, сделала себе закладку покопаться.