Практика языка C (МФТИ, 2023-2024). Интермедия: командная строка, файлы и вариабельные аргументы.

Практика языка C (МФТИ, 2023-2024). Интермедия: командная строка, файлы и вариабельные аргументы.

Konstantin Vladimirov

11 месяцев назад

5,719 Просмотров

Ссылки и html тэги не поддерживаются


Комментарии:

@McGewen
@McGewen - 25.11.2023 09:20

ТОП!

Ответить
@RinatKhasanshin-q5w
@RinatKhasanshin-q5w - 25.11.2023 09:26

Лушие курсы по С

Ответить
@DART2WADER
@DART2WADER - 25.11.2023 10:20

Огонь, эти лекции зайдут "встройщикам".

Ответить
@Якстатинепонимаюкак
@Якстатинепонимаюкак - 25.11.2023 13:40

А лекции по Си есть записи или планируются ?

Ответить
@ДенисСомин
@ДенисСомин - 25.11.2023 16:07

Спасибо за лекцию, очень нравится, что даже довольно скучные вещи у вас получается объяснять интересно и на реальных примерах, жалко правда, что в этой лекции всего 1 задача на подумать, но это понятно, т.к. базового материала довольно много.

Касательно размера буфера в PrintFError, задача действительно не тривиальная, и вполне понятно, что вычисление точного размера будет эквивалентно по сложности написанию своей реализации функции принтф, однако достаточно ведь только примерно оценить этот размер, для чего необходимо будет только обработать флаги, подставить максимально возможный символьный размер для каждого спецификатора, кроме строк и добавить вычисленные размеры строк, ну и добавить длину строки формата.
Хотя также выглядит весьма здравым решением отдать вычисление порядка буфера юзеру и просто принимать дополнительный аргумент.

Также есть вопрос, насколько вообще эффективно использовать функции с префиксом v, когда в языке присутствует вариадик макрос? лично мне кажется, что неэффективно, т.к. передача va_list в аргумент уберает любую возможность оптимизации функций с переменным числом аргументов, в виде передачи некоторое количество этих аргументов через регистры, что реализуют многие компиляторы.
Ну т.е. не лучше ли функции с простой логикой, как например PrintFError без вычисления размера буфера, выносить в макросы с переменным числом аргументов?

Ответить
@xaoc3932
@xaoc3932 - 25.11.2023 22:49

Эх, не хватает времени на всё(, вот вроде и видос есть полезный , интересный, а уже минут через 15 спать надо((

Ответить
@OttogiMazik
@OttogiMazik - 27.11.2023 18:10

Про printf аналоги. Выход однозначно лучше - vsnprintf и обработка возвращаемого значения.
Или принимать буфер аргументом. Из "принято решать" есть ещё vasprintf, что конечно не советую никому.
Также, в подобных функциях по очевидным причинам буфер обычно static и нередко общий для семейства функций, например в известном DearImGui.

Важный нюанс - компилятор не будет проверять fmt-строку таких функций в отличие от стандартных, что крайне чревато, ошибки легки и повсеместны.
В GCC и MinGW решение: __attribute__((format(printf, 1, 2))) в начале объявления функции, в документации описано подробно.

Вообще использовать функции без N, не имея инвариантов и надеясь на лучшее - а потом условные "эксперты" опеннета именуют С "дыряшкой".

Ответить
@dmitryivanov5647
@dmitryivanov5647 - 28.11.2023 11:47

Разъясните, как f(x, ...) раскладывает на стек параметры - как оно там под капотом устроено?

Ответить
@dmitriy3510
@dmitriy3510 - 29.11.2023 00:14

Для любителей конспирологии.
Закладывался ли смысл в синий задний фон...

Ответить
@kemalbidzhiev1948
@kemalbidzhiev1948 - 22.02.2024 21:52

Очень круто, Большое спасибо!
У меня возник вопрос по вариадическим аргументам.
Вот есть функция sum(len, a, b, c, ...). Зачем там указывать len ? Видимо чтобы в va_list указать откуда отталкиваться и начать считывать. Почему нельзя было написать sum(...) нельзя ли начать считывать с самого начала аргументов, а не отталкиваться от последнего в сигнатуре ?

Ответить
@almatytelecom1
@almatytelecom1 - 03.03.2024 15:08

классные лекции

Ответить