Белой завистью завидую Вашим студентам. Вы преподаватель от Бога, Тимофей.
@mkzlodeev6 жыл бұрын
Лучшие лекции по Си, спасибо большое за труды!
@beginend954 жыл бұрын
Огромное спасибо! Все очень понятно!)
@aleksproger_il8 ай бұрын
Я смотрю твои уроки. Спасибо большое!
@1nfoGames3 жыл бұрын
Ваааах, месяц назад смотрел, было ничего не понятно. Удивительно... сейчас все понял)
@bekbolotibraimovmrx54124 жыл бұрын
Вы рождены быть обучателем программных языков!Супер!
@MrYsupov4 жыл бұрын
"На самом интересном месте!"
@safaraliabduazimov73873 жыл бұрын
Огромное Спасибо за урок!!!
@Piter_Pain5 жыл бұрын
Кино обрывается на полуслове. Пустячок, но огорчительно.
@muxach62776 жыл бұрын
Отличная лекция)) С нетерпением жду лекцию о том, как создавать новый поток внутри класса и убивать его в деструкторе класса.
@programer84 жыл бұрын
Вы сказали что адрес не зависим от того на что он указывает. Вот что показывает следующий вывод: printf("sizeof of char* = %d ", sizeof(char*)); printf("sizeof of int* = %d ", sizeof(int*)); printf("sizeof of double* = %d ", sizeof(double*)); везде значение 4
@alexanderkhoroshavin69214 жыл бұрын
На 32-битной системе 4 байта, на 64-битной 8 байт
@programer84 жыл бұрын
@@alexanderkhoroshavin6921 да и думаю можно понимать почему. Адреса ведь нумерируются целочислеными значениями, а целочисленные значения по умолчанию имеют тип int. int занимает одно машинное слово, а размер машинного слова зависит от архитектуры процессора. Вот поэтому и выходит что на 32-битной системе 4 байта, а на 64-битной 8 байт. Вот такая цепочка получилось :d
@billjohnes93803 жыл бұрын
@@programer8, а почему для адресов должен использоваться "тип по умолчанию целочисленных значений"? Если смотреть особенности кода, генерируемого компиляторами, то видно, что сами адреса ведут себя как беззнаковые значения. При этом их разность ведёт себя как знаковый тип (который стандартизован и называется ptrdiff_t). Такой, вот, парадокс, но это так. И тип по умолчанию целочисленного литерала, даже при отсутствии суффикса, зависит как от значения этого самого литерала, так и от используемого основания системы счисления. Он может быть и unsigned int, и long и так далее: en.cppreference.com/w/c/language/integer_constant#The_type_of_the_integer_constant. Дословно: "The type of the integer constant is the first type in which the value can fit, from the list of types which depends on which numeric base and which integer-suffix was used". В таблице первая строка для случая отсутствия суффикса, то есть, для обсуждаемого случая. Но это так, отступление. Что здесь очень важно: тип int может оказаться слишком мал для хранения адреса, адрес может в него не поместиться. В скольких программах видно, что "программист" думал, что указатель там поместится, и при смене платформы это всё повылезало... Если сильно надо, существуют специальные типы intptr_t и беззнаковый uintptr_t, однако они optional, и не во всех реализациях могут присутствовать. Поэтому всякие попытки хранить указатели в интегральных типах следует отложить на далёкое будущее. Но данный преподаватель о подобных вещах вряд ли расскажет. Ему и в голову не пришло, что, кроме адресов переменных c, i и d, в p можно было также положить и адрес самого p, хотя искушённому программисту, демонстрирующему указатель на void, такое в голову сразу придёт (программировать не только трудно, но и, бывает, прикольно). И, естественно, в данном ролике ни слова о неявном приведении как к void *, так и обратно, поэтому обученные таким преподаванием люди будут загромождать код явными приведениями...
@ozimandias1738 Жыл бұрын
Хорошее видео. Однако type_marker лучше через switch обрабатывать.
@ESEben105 жыл бұрын
Спасибо!
@MrAlexT926 жыл бұрын
Вот это привалило инфы по Си. Чувствую Тимофей Хирьянович скоро сниться начнет от того что всё свободное время посвящаю просмотру лекций
@enikeev_tg2 жыл бұрын
Функция exit() не из той же серии, что и goto? Часто её в своём коде программисты используют?
@juvusart2 жыл бұрын
Не часто. Обычно стараются как-то поймать исключение, обработать. Открытые потоки закрыть, память освободить и т.д. Exit с кодом ошибки - это крайне жёсткий вариант аварийного завершения работы. Равносильно Ctrl-Alt-Del и там закрыть процесс. Часто ты так завершаешь работу запущенных программ?
@wingedrainbow2 жыл бұрын
Как пример применения из bpf. ``` vim kernel/bpf/inode.c ... enum bpf_type { BPF_TYPE_UNSPEC = 0, BPF_TYPE_PROG, BPF_TYPE_MAP, }; static void *bpf_any_get(void *raw, enum bpf_type type) { switch (type) { case BPF_TYPE_PROG: raw = bpf_prog_inc(raw); break; case BPF_TYPE_MAP: raw = bpf_map_inc(raw, true); break; default: WARN_ON_ONCE(1); break; } return raw; } ```
@peaceduke1973 Жыл бұрын
void это же процедура? функция без return? вов всяком случае я так думал. Но надо теперь еще подумать.))
@billjohnes93803 жыл бұрын
Жесть. Тип void -- не пустой, а incomplete, как, скажем, и тип структуры после её forward-декларации. Incomplete-тип характеризуется тем, что для него неизвестен ни размер, ни выравнивание, поэтому-то и нельзя сгенерировать код разыменования указателя на него. Почему бы об этом не рассказать, чтобы студент понимал суть, а не слепо верил в какой-то непонятный несуществующий "пустой тип"? В этом смысле void и структура, для которой в данном месте кода существует лишь forward-декларация, ничем не отличаются. Совсем ничем. Только структуру далее по коду можно доопределить, и её тип с этого момента становится завершённым, становится известными размер и выравнивание значений этого типа, и указатели на такие типы становится возможным разыменовывать, даже те, которые были объявлены выше по коду, в момент, когда структура ещё не была доопределена и имела incomplete-тип. И это будет понято студентами, поскольку они будут знать, что дело лишь в наличии необходимой информации у компилятора для генерации кода в момент этой генерации при разыменовании, а не при создании указателя. Тип же void невозможно "завершить" в принципе, его размер и выравнивание поэтому не могут быть известны в принципе, и поэтому разыменование указателей на void также невозможно в принципе, потому что неясно, какой код компилятору под это генерировать, раз размер и выравнивание значения не известны. Какой образчик программы даётся: то, что сюда прямо "рвётся" switch, а не портянка if else не "чувствуем", используем неведомые единички и прочие двоечки с троечками, создаётся впечатление, что про enum и не слышали... Второстепенная функция принимает решения, типа завершения программы, на которые она в принципе права не может иметь... А потом появляются соискатели, нашпигованные такими практиками, и которых приходится переучивать. Они не знают, в том числе, что в pure C существует неявное приведение как к void *, так и обратно, потому что в лекциях ничего такого не было, и "лепят" везде явное приведение, загромождая программу... И появляются библиотеки, функции которых, вместо того, чтобы вернуть код ошибки, пишут "shit happens" (жесть) и вызывают функцию abort (особо циничная жесть, ещё жестянее уже трудно придумать), которая грубо завершает программу (реальный случай)... Преподаватели должны быть в существенной степени практикующими программистами на преподаваемом языке, иначе вся эта жесть продолжится и дальше...
@femlemp3 жыл бұрын
Спасибо чел, реально пояснительно, но начав смотреть лекции не имея базу я бы тебя не понял, откуда ты берёшь эту информацию? Стандарт ansi c?
@epsilon.sw_2 ай бұрын
Мне не кажется, что кто-то воспринял слова про пустой тип буквально. Ну это просто название такое. А что он "делает" "пустой тип" видно на примере.
@billjohnes93802 ай бұрын
@@epsilon.sw_ Когда говнокод глючит, и программы падают, мне это совсем не кажется, это на самом деле происходит. Очевидно, что C -- не ваш язык, если вы не видите разницы даже после подробнейшего объяснения мной сути вопроса.
@nicholasspezza944910 ай бұрын
не дубль вэ, а дабл ю!☝
@pustpokazivaet82775 жыл бұрын
Здравствуйте уважаемый Тимофей Хирьянов, у вас будут видео об структурах и указатели на структуры на Си?
@vip510004 жыл бұрын
Я думаю этот курс является завершенным
@pustpokazivaet82774 жыл бұрын
@@vip51000 скорее всего ! спасибо!
@igorseledtsov73453 жыл бұрын
формат для double f а не lf, а вот для scanf всё именно так как написано. Нелогично, но это так.
@RageonGames Жыл бұрын
Тогда говори уж полностью, что f валиден для дабла, начиная с C99, а ниже, в C89 например это ошибка
@JingoBo5 жыл бұрын
Не рассказал про опасность разыменовывания по не выровненным адресам многобайтовых чисел.
@juvusart2 жыл бұрын
Ну так-то тебе тоже в первом классе говорят, что земля в форме шара, а уж потом в университете, ты возможно узнаешь, что на самом деле в форме геоида.
@igorseledtsov73453 жыл бұрын
по стандарту double это 54 бита а не 8 байт.. Понятно что когда байт 8 битный это одно и то-же но всё же это не это не одно и то-же
@ill43742 жыл бұрын
Где вы такой стандарт нашли?
@igorseledtsov73452 жыл бұрын
@@ill4374 в документауии языка... прям вот брал и читал и да конечно не 54 а 64
@bogdanz58103 жыл бұрын
Что с микро, лучше бы на диктофон в телефоне запись велась, чем так