
Пожалуйста, пользуйтесь https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит или ∗.
Что читать:
- Stephen Prata "C Primer Plus, 6th Edition" (2014) (в русском переводе: Стивен Прата "Язык программирования C. Лекции и упражнения (6-е издание)" ): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Идеально для начинающих.
- Brian Kernighan, Dennis Ritchie "The C Programming Language".
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2583.pdf (октябрь)
Прошлый тред: https://2ch.hk/pr/res/3304338.html (

Лудчший езык. Изучил за пару недель си, еще пару недель на сисколы. И ты уже у мамки хакер.

>лучше на время изучения забыть про винду и делать все на линуксе
Не понимаю, зачем?
Я учил С по видео этого толстячка. Виндовс + студия.
Увы, но этот язык я изучал не по той литературе, что рекомендуется в посте, а по руководству некоего Полякова(4 файла по 20 страниц в каждом) так как именной тогда от нечего делать я случайно нашел сайт Полякова.
Теперь работаю с c++(пишу динамические библиотеки для некоторых проектов под Андроид). И пусть с чистым си я сейчас особо не пересекаюсь, но именно этот язык дал путь к понимании всех трюков с адресами и одной из самых главных сущностей программирования, от которой не убежать, а лишь чуть-чуть замаскировать: все данные - лишь набор байтов.
Просто снимаю шляпу перед этим языком.
В книжках Праты и Ритчи нет ничего про многопоточку, мьютексы и прочие семафоры (а в Си это все есть). Нет ничего про архитектуру.
>про многопоточку, мьютексы и прочие семафоры
Windows для Профессионалов, крутая книга для настоящего программиста. Никакой гуманитарной академической блевотины, чисто по делу, техника для технарей, есть система и книга как с ней работать.
Есть книжка роберта лава системное программирование в линупс. Для нубов есть книжка иванова программирование в линупс. Есть новая книжка си бранд билдинг дебагер от трапа из майкрософта. Хоть книжка и про написание дебугера на си плас плас, но книжка хорошо поясняет для нубов про сишные сисколы в линупсе и ахитектуру пк.
У виндовса нет си компалера и никогда небыло. У вижуал студии плюсовой компилятор. Были только древнии компиляторы от ноунеймов как пелес си компилер
Си это исключительно юникс лайк системы, ну еще эмбед. Сам брысь в плюсовой тред.

Ну и си под винду никакого практического смысла не имеет. Чисто забава для задротов. Под линупс же системные вещи активно пишут - возьми например разработку ядра linux или например рантайм для контейнеров crun от красношапки
А еще где-то разрабатывают банковские системы на коболе, и что? Нинужное нинужно это никак не меняет, засунь себе в сраку линупс с чистоси, ведь это твоё хобби хипстера - пороться в сраку мечтая отрезать себе хуй.
1) ты мне свои фантазии не приписывай, соевый любитель ретро игр под винду
2) кобол + хипстер? Ты дурачек?
3) виртуализацию и контейнеризацию майкрософт тоже в линупс комитит, нейронки на линупсе на фермах запускаются Так что с коболом сравнение линупса нерелевантное
Хватить срать, урод, ты кто из них:
- разработчик ядра линукс?
- разработчик виртуалок майкрософт?
- разработчик контейнеров красношапки?
Правильно, никто, тупой урод который вообще никто никакого кода не пишет, простой хисптосральник с линуп.сру и подобных помоек для быдла попугающих соевую пропаганду.
Ну хотя бы потому в линуксе сишка это буквально часть системы и работать там на низком уровне гораздо проще и приятнее чем на винде.
Шапка сильно устарела, вышло много неплохих книжек с тех пор, те же дейтелы постоянно обновляют книги по си.
А что они там такого важного наобновляли? Ведь основной стандарт сейчас в индустрии это C99.
>Не понимаю, зачем?
Для эффективности.
>Я учил С по видео этого толстячка. Виндовс + студия.
По виндовидосикам тоже можно выучиться программировать. Только времени это займет гораздо больше. Ну знаете, как в школе люди иностранный язык годами учат, а толку мало.
Ну как бы Прата не единственная и не самая важная книга по современной сишке, я это хотел сказать.
>По виндовидосикам тоже можно выучиться программировать. Только времени это займет гораздо больше.
Ну не. По мне так как раз книги для вкатунов очень малоэффективны. На видосиках обычно учат программированию, делая какой-то большой сложный проект. В большинстве же книг для вкатунов сюжеты очень элементарные, решаемые в пару строк. В итоге, когда вкатун пытается сделать что-то полезное, а следователньо и большое, он не знает даже за что браться.
Против же книг по углубленным темам против ничего не имею.
>>387857
1) Зачем вкатуну рабоать в линуксе на низком уровне?
2) Я честно не понимаю, зачем для чего комитить. Я могу понять осуществление просветительской работы забесплатно, но делать забесплатно продуктовую рабоу, на которой потом наварятся меты-гуглы, как-то зашкварно.
Помню вначале нулевых было полно маленьких утилит, с которых авторы получали копеечку. Сейчас же благодаря опенсурс выблядкам так не заработать, остаются варианты только ебашить на дядю.
Чтобы перестать быть вкатуном. Двощ - борда 18+, а не дом детского творчества. С агуша-кормом в виде игрулек под винду с житием бытием типичного сишника ничего общего не имеет.
>По мне так как раз книги для вкатунов очень малоэффективны.
А ты сам-то по видосикам вкатывался в программирование?
>делая какой-то большой сложный проект
При обучении должен быть виден явный прогресс, чтобы с первых же дней была рабочая программа, к которой потом уже можно добавлять какие-нибудь фичи. А большой и сложный проект демотивирует.
>Сейчас же благодаря опенсурс выблядкам так не заработать, остаются варианты только ебашить на дядю.
Если б ты не пиздил виндовый софт, то ты б вообще нихуя не смог бы на винде сделать. Своему дрочу на винду ты обязан прежде всего пиратству. Это не говоря о том, что слозетсурсного фриваре/шареваре софта всегда было дохуя. Не факт, что на винде кто-то бы позарился на твои проприетарные поделки. Так же бы ебашил на дядю, не выдержав конкуренции с корпорастами.
>но делать забесплатно продуктовую рабоу,
Ты не в курсе, что кроме денег на свете существует и другая мотивация?
>на которой потом наварятся меты-гуглы, как-то зашкварно.
Эти наварятся в любом случае. Тотальная закрытость всего софта не спасет.
>Я честно не понимаю, зачем для чего комитить.
Чтобы резюме пополнить, если говорить о монетизации.
>работать в линуксе.
Шо це?
>линукс и сишка
Пчелик, у тебя документация функций для сишки прямо из командной строки доступка, есть ебейший конпелятор, который ставится обычным пуком в современном дистре.
Либо они и сами пользуются софтом, который помогают разрабатывать, а не только ради чужих хотелок.
Только не надо говорить про устаревание инфы, ведь сишка это не какой-то там одноразовый язычок, в котором часто ломают совместимость и дропают говнофреймворки. Про быстрое устаревание - это к веб-макакам.
Так весь раздел деградировал. 95% постов от дегенератов, которые к айти вообще отношения не имеют. Срут бессмысленными постами в треде-чатике и временами с троллингом тупостью протекают в другие треды.

Раньше все игры на С писались. Не только во времена ДОСа, но и во времена Виндовса уже. Тот же Q3A на С.
>в виде игрулек под винду
Игры самый сложный софт, если брать коммерческую разработку, а не академическую. Потому не понимаю твоего пренебрежительное отношения. Ты ведь наверняка веб-петухан вообще. Не будь ты веб-чмом, не был бы зомбирован линуксом.
>>389081
>А ты сам-то по видосикам вкатывался в программирование?
Да.
>чтобы с первых же дней была рабочая программа
По мне так сложно испытывать восторг от программ уровня подсчитать факториал.
>>389090
Видишь, винда даёт заработать на пиратстве, взломе. Опеншурш же ничего не даёт. Только отбирает. Либо твоя поделка будет незамечена, либо ею буду тпользоваться корпорации, генерирующие себе миллиарды в день, а ты будешь без денег сидеть.
>>389116
>Ты не в курсе, что кроме денег на свете существует и другая мотивация?
Имело бы смысл, если бы опенсусрс нельзы было использовать коммерчески. А так ты просто генерируешь прибыль Безосу, Брину и прочим.
>>389473
Что угодно можно написать. Ты просто промытка. Заразили тебя вирусом и ты его разносишь дальше.
>А так ты просто генерируешь прибыль Безосу, Брину и прочим.
Оправдания жлоба. Сначала говоришь не хочу бесплатно помогать гуглу, потом будешь говорить не хочу бесплатно помогать соседу-васе, потом бесплатно никому помогать не хочу. Жлоб это жлоб, дегенерат-вырожденец у которого интерес только один - нахапать самому и отобрать у других. Что-то кому-то дать? Нет, у жлоба от этого дикая ломка, весь его организм восстаёт, жаба давит. Эгоистичная тварь мечтающая чтобы у соседа корова сдохла, а не кому-нибудь помочь.
Всё, целая куча прог которыми куча народу пользуется, плюс мои инициативы подтолкнули других разработчиков создавать подобное и намного лучше, а до меня не могли жопы оторвать от дивана. И всё выкладываю с открытыми исходниками, без защит, лицензий, кредитсов, вниманиеблядства, требований донатов, нытья, и прочего говна. Просто потому, что сам пользуюсь чужой работой, естественно хочется дать в ответ. Полюс, многие разрабы припизднутые неадекваты, так что открытые исходники совершенно необходимы для исправлений которые они сами делать не хотят, а без этого кривым говном пользоваться невозможно.
>>А ты сам-то по видосикам вкатывался в программирование?
>Да.
Ну и нахуй ты так быстро слился? Кто после этого будет подыгрывать твоему тупому троллингу?
>Оправдания жлоба.
Вначале годами живут на спизженном софте, играх, книгах, музыке, фильмах, а потом, когда у самих софт даже не спиздили, а просто создали бесплатную альтернативу в рамках закона, то поднимают вой: ОБОКРАЛИ! НЕ ДАЮТ ЗАРАБОТАТЬ ВЫБЛЯДКИ! АААА111!!! ВСЕ ЗАКРЫТЬ!!! ВСЕХ ПОСАДИТЬ!!!111
Я лично, ничего против пиратства не имею, особенно в бедных местах нашей планеты. Кстати, а вы уже удалили у себя всю пиратскую порнуху?
Не удивлюсь, если у него и бабы до сих пор нет. Патологические жлобы с ними несовместимы. Такие и на детей, на джунов смотрят как на врагов, да и вообще реальный общественный прогресс не жалуют.
Кстати, лучше всех типы жлобства описывал Салтыков-Щедрин. Почитайте, например, его "Господа Головлевы".
>Есть новая книжка си бранд билдинг дебагер от трапа из майкрософта. Хоть книжка и про написание дебугера
Спасибо за наводку. Надо будет почитать.
CString, UnicodeString, std::wstring

>ею буду тпользоваться корпорации, генерирующие себе миллиарды в день,
Стандартная лицензия GNU GPL не дает возможности генерировать миллиарды. Если ты сам распространяешь свой код под более либеральной LGPL или тем более MIT, то это уже твои проблемы.
Core-JS распространяется как раз под MIT.
Спасибо всем кому не трудно будет это)
Винапишка — это народное название игры, которая в официальных источниках называется "винопишка" или "виноснаряд". Это игра с карточками, которая популярна на вечеринках и в компаниях, особенно среди молодежи. Суть игры заключается в том, чтобы с помощью карточек и их комбинаций придумывать интересные задания, которые игроки выполняют, а за нарушения (или невыполнение заданий) могут быть наказаны — обычно это выпить определённое количество алкоголя (чаще всего вина).
Древний набор мрачноватого вида функций прямиком из 1995 года. Когда-то знание этой хрени давало возможность работать с виндой на низком уровне, но сейчас это мало актуально.
>но сейчас это мало актуально.
А что сейчас актуально? Жить в Индии? Красить волосы в розовый цвет? Совать в жопу мобилку?
Сишорперы как все пишут вебмакакинг. И ты не ответил на вопрос, отвечай. Или молчание знак согласия?
Ну я так и думал, очередной "актуальный" петух в си-треде, который даже не может сказать что это за актуальность такая, слишком позорно и мерзко чтобы говорить вслух. Но ничего, я озвучил >>391098
Очень занимательно)
Если не затруднит, что есть похожие на winapi , что бы работать на низком уровне?
Это какой-то тупой тралль накидывает, не слушай его истерики. Скорее всего он вообще ничего не программирует, просто срет тут во всех тредах. Посмотри в сисп треде - там такой же дебильный наброс.
Ладно, по сути. Короче смотри.
Есть винапи - набор системных функций винды, он очень древний. Да, на нем все еще можно программировать, но современные приложения под винду пишут не на нем, а на .NET - это такая надстройка над системой, у которой свои функции и свои правила.
Аналог винапи - это системные вызовы ядра в линуксе.
Короче определись что ты хочешь кодить и тогда будет ясно что тебе для этого нужно.
Syscall?
.net не очень нравится, вот хочешь чисто c/c++ , но что бы на уровне ядра работать)
1) Какая связь между линухом и винапи?
2) И что ты понимаешь под уровнем ядра? Сисколы в линуксе используются в юзерспейсе. Это прослойка между ядром и прикладным софтом. Низким уровнем это называется потому что на этом уровне мало абстракции и для реализации простых вещей надо много кода написать. Это все уже все написано в стандартной библиотеке. У тебя любительский проект где надо свой личный malloc писать?
Мне не под userspace и под kernel mode
И ещё нужно написать kmdf
- архитектура важнее реализации
- не оставляйте непродуманных ветвей в алгоритме
- покрывайте тестами с самого начала
- если очень хочется сделать ограничение статикой, сделайте его в 10 раз больше
- об UB и ID не шкварьтесь
Сборщик мусора прикрутить можно с такой-то матерью (Boehm GC).
Безопасное управление возможно только в такой форме, что программа остановится и сообщит об ошибке, а не ОС её убъёт.
И всё это не на 100% надежно.
Изначально есть "hello world", это 1 пик. Потом его читает fputs и помещает файл, по пути он убирает тернарный символ в конце. Получается пик 2.
Каким образом fgets понимает, что файл всё, если у него нет тернарного или символа пробела?
https://pastebin.com/kujNxU08
Нет, бро, операционки пишут, дрова пишут, а простейший алгоритм подсчёта ссылок, увы, реализовать не получится.
Окей, включил. Исправил на fopen_s. Больше варнингов нет. Вопрос всё тот же.
https://pastebin.com/uDY2wen0
> Каким образом fgets понимает, что файл всё
Ну давай подумаем как устроен fgets. Сделай strace, посмотри сисколлы, там наверняка будет какая-нибудь форма сискола read.
man 2 read
If the file offset is at or past the end of file, no bytes are read, and read() returns zero.
Сискол тебе возвращает 0 = файл закончился.
Сап, аноны кто-нибудь шарит в winapi? У меня тут непонимание некоторых вещей возникло, часто вижу что текст(label) инициализируют через createwindow("static"....), но как только текст должен быть красивый то есть иметь не стандартный цвет/шрифт/ размер то заместо первого метода все начинают подключать GDI и рисовать в wm_print, неужели нет нормального способа работы с текстом как и с остальными контролами и обязательно нужен gdi?
>неужели нет нормального способа работы с текстом как и с остальными контролами
Остальные конторылы которые не стандартные то же отрисовываются пользовтелем, другого нет
Ну так winapi это очень старая хрень, в те времена были только самые примитивные контролы, а нормальные шрифты вообще только начали появляться.
Контролы так и так рисуются через GDI. Windows это стандартизованная система, контролы такие как положено в системе им быть, дизайн сделан гениальными дизайнерами, аналогов нет. Хочется васянства, значит рисуй сам как хочешь, никто не мешает.
>Windows это стандартизованная система, контролы такие как положено в системе им быть, дизайн сделан гениальными дизайнерам
Windows ХР is dead, старче...
WinAPI не менялся со времен Windows 95, там вся архитектура осталась именно такой какой была в 90е, включая захардкоденные контролы.
И где в винапи "стандартный интерфейс" видовс сторе, настроек и прочей современной гуйни напоминающей вебприложения.
Спасибо, я почему-то думал что GDI был создан уже после стандартных элементов, а стандартные элементы какая-нибудь совсем глубинная хуйня рисует, теперь более менее осознал.
P.s. В частности под Linux и ведро
В ведроид-студии, когда делаешь приложение NDK, то есть с использованием C/++, компилятор - это простой Clang, сконфигурированный под кросс-компиляцию. И система сборки CMake. Чтобы посмотреть пример, как это объединяется с гуем, нагугли на гитхабе файл с именем "SDLActivity.java".
>я почему-то думал что GDI был создан уже после стандартных элементов, а стандартные элементы какая-нибудь совсем глубинная хуйня рисует
Потому что ты скриптовая макака с магическим мышлением привыкшая к черным ящикам. Да, скрипты именно так устроены, непонятные черные ящики в себе, а пользователю дают отдельно огрызки. И пишут код на скриптах именно так, наугад воображая хуйню и тыкая методом проб и ошибок.
Но Си это программирование, а не скриптинг. Нельзя программировать сам не зная что, черный ящик, нельзя писать код наугад, сам не зная как работающий. Программирование - не шаманизм, не посыл молитв богу машины в надежде получить результат. Программирование это техника. Прежде чем что-то писать, необходимо открыть документацию и разобраться как работает машина, только потом уже пишешь код осознавая что делаешь. Но макака уже испорчена скриптами, такое обычно не лечится, психика изуродована, это конец.
Я не знал о GDI потому что на него не похуй 0.1% включая меня. В документации описаны общие положения и описания функций, никакой исторической сводки, или инфы о том как оно все функционирует изнутри нет. Собираю инфу о winapi по ебаным крупицам в интрнете. А вообще пошел нахуй, зачем ты мне вообще отвечаешь?
> Собираю инфу о winapi по ебаным крупицам в интрнете.
Книги же есть, ну. Ты классику не читал что ли.
мимо
Так оно точно так же работает. Тебе дают функцию, ее параметры и то что она делает, и больше ничего. Информация о том как и что работает изнутри это крохи, потому что си это высокоуровневый язык, никто не хочет разбираться как оно работает изнутри.
>ищу инфу про винапи
>дают инфу об апи
>ря крохи нито шта нада
Ты даже не макака, а просто тупой скот. Говорит одно, тут же требует другое, даже не замечает что несет бессмыслицу не понимая значения слов которыми пукает.
>то есть с использованием C/++
Он про ядро спрашивает, а плюсы там не к месту. Есть пояснение от создателя ядра, почему писать ядра операционных систем на c++ является неимоверной тупостью https://lkml.org/lkml/2004/1/20/20
>А самая распространенная ось, почему не на C++ написана?
А почему она должна быть на С++ написана?
>Есть пояснение от создателя ядра
>any compiler or language that likes to hide things like memory allocations behind your back just isn't a good choice for a kernel
Поэтому он пропихивает хрюст который не только скрывает, но еще и активно верещит на тех кто не скрывает? Типичная шавка, что хозяин ему сказал, то и тявкает. Но ему хотя бы за это платят, а тебе, шавка, разве платят за подтявкивание корпоративному барину, или бесплатно сосешь?
Ядра серьезных ОС писались в то время когда плюсов либо не было, либо они были в зачаточном состоянии. Никто не будет писать ядро системы рассчитанной на долгосрочный успех на васянском языке который может завтра сдохнет, пишут на взрослом развитом языке проверенном временем и опытом. В данный момент С++ уже давно такой, нет причин на нем не писать, кроме политического визга наймитов триллиардных еврейских фондов.
Твой Пинус Трольвальдос Раст в свое говноядро тянет, а ты чего то до Крестов докопался

Кстати, сишка еще хороша тем, что облегчает интероп с другими языками. Так называемый lingua franca в программировании, который полезно знать.
>Многие плюются от новых стандартов.
С++ мультипарадигменный, ничто не мешает в ядре установить правила, и ничто не обязывает писать по самому новому стандарту, я же кажется говорил, что ядро должно писаться на стабильном проверенном временем, это не хипсторская игрушка дрочить на обновления, а потом потыкал и бросил, читай руст, и ничего пидор проплаченный готов угробить ядро гнилью, а вот С++ - низя, нидопущу, ну конечно барину не надо, вот и кукарекает как болванчик, кукла сраная.
В чем особенное отличие С++ от Си, кроме того что в С++ добавили ООП, то есть если я например возьму не GCC а G++ и скомпилирую код Си, будет ли какая-то разница в ассемблере?
Вообще если посмотреть на С++ со стороны глазами не профессионального программиста С++ выглядит как какой-то костыль когда код стартует с ФУНКЦИИ main, когда читая чужой год часто встречаешь какую-то мешанину из stdlib/io вместе с высокруповневыми библиотеками, и все это выглядит как какая-то мешанина, особенно позабавило как запихивают string в сишные функции которые принимают char* и там вродебы какой то костыль прикрутили в методы, типо string.tochar.
>когда читая чужой год часто встречаешь какую-то мешанину
Как я понял С++ это и есть адская мешанина которой недоволен никто. Тем не менее, надо учить. Не вечно же на С красноглазить. Надо и к современным технологиям переходить. Может хоть работу найду
Как в С#
Так Си функциональный, там это норма.

>>398236
>>398103
>>398075
Разве не костыль? Сами плюсовики говорят что хотелось бы избавиться от наследия Си но никак.
https://habr.com/ru/companies/intel/articles/156863/
> if __name__ == '__main__'
как в питоне?
>Даже Троллвалдс это понимает.
Торвальдс ВСЕ.
Плюсы в своей время он просто не осилил, а сейчас ему уже на все похуй и он даже своей жопе не хозяин. Что барья из корпораций скажут, то и будет делать. От гениального руководителя куча крупных мейнтейнеров ушла за последний год, даже некоторые именитые растовики сьебались, лол. Про политическую возню даже говорить не буду.
Я понимаю, что это троллинг, поэтому все же хотелось услышать ответ от автора оригинального поста.
Если тебе так сильно хочется, то в аргументах линковщика ты можешь указать другую функцию, как точку входа, но как уже написали выше, не понятно, в чем тут вообще костыль.
Это соевый урод, тралящий тупостью интернет. Такого говна нынче как грязи, даже тараканов наверное меньше чем сральщиков в соцсетях.
>Это между прочим сотрудник Intel
Я помню, мне как-то давно попадалась статья на хабре, где чел воротил какую-то дичайшую хуйню. Нашел, на какой ноге проца у ардуино 5 вольт и пытался от них запитать распберри пиай. То, что в даташите явно написано, что максимальный ток 90мА его вообще не смущало.
А потом он принялся писать какой-то "эмулятор провода", чтобы это все как-то работало.
В общем, за отсутствие понимания как электроника работает, его даже дети из радиокружка попустили бы.
Когда я статью читал, ей уже года четыре было. Я решил загуглить никнейм автора, нашел его соцсети. А он за это время в США переехал и в Интел устроился. Вот и думайте.
Как я понял С лучший язык для новичка. Честно сказать кажется будто плохая идея начинать с этого языка. Эта страшная троица: С, С++ и С#
Глобальные структуры передаются статическим функциям. Какие нах гетерысетеры в Си?
Я имею в виду, как организовывать большие проекты на Си? Вот есть структура которая пишется и читается в куче файлов, как такие вещи организовывают? Потому что все говорят о том что "глобальные переменные это зло", но как без них организовавывают такое?
https://media.defense.gov/2022/Nov/10/2003112742/-1/-1/0/CSI_SOFTWARE_MEMORY_SAFETY.PDF
плюсы лучше раста, но раст пропихивает американская гебуха, а по патриотическому акту находящееся в юрисдикции американского суда лицо не имеет права даже сказать о том что его к чему-то принуждает гебуха без её разрешения.
так что гебуха говорит корпорациям - програмировай на расте. корпорации они же платиновые спонсоры linux foundation говорят яфинскому - програмировай на расте. сын одного финского коммуниста https://en.wikipedia.org/wiki/Nils_Torvalds учившегося в москве на кремлёвские деньги на это реагирует по принципу "партия сказала надо комсомол ответил есть".
вот и вся причина по которой раст барским сапогом забивают в холопьи жопы.
>структура или переменная должна быть обработана
1.
static_shluha.c -> static type_of_shluha _shluxa;
static_shluha.h -> bool static_shluha_put(...);
Через функции, чтобы не ебаться с многопотоком в вызывающем коде.
user_(1-1000).c -> static_shluha_put(...);
2.
shluhset.h -> shluha_1, shluha_2
user_(1-1000).c -> abstract_shluha_put(ПОКАЗЫВАЕШЬ ПАЛЬЦЕМ НА ИСПОЛЬЗУЕМУЮ);

>Честно сказать кажется будто плохая идея начинать с этого языка
Говорят, что начинать с С - действительно плохо. Начинать лучше с Pascal.
Но я уже не вспомню почему. В С по-моему более гибкий синтаксис, соответствующей больше функциональной парадигме. Например, в С ты можешь спокойно написать
(A = B) == C + D
Новичкам обычно это выражение кажется лишённым смысла, так как "императивный полход" подразумевает последовательность команд, продедур, операций. А тут какая-то каша не понятная из операций. На самом деле если рассматривать это с парадигмы функции которые что-то возвращают, то тут всё просто:
Вначале выполняется "А = B", еоторая присваивает, B к А, и самое важное - сама эта операция превращается в выражение B, как функция. В паскале такого нет. В паскале присваивание A := B нельзя никуда запихнуть. А тут можно. Итого, "А = B" теперь имеет значение B , затем "B == C" даёт 1 или 0, Да. Как ты только что понял. В С нет никакого "логического типа bool". Тут всё близко к аппаратной основе, поэтому у нас есть только целые числа разных машинных слов, и флоаты с фпу. Поэтому B == C возвращает нам int, либо 1 либо 0. И к этому 1 либо 0 уже прибавляется D.
И такие конструкции вполне легально писать, и это считается нормой.
Например, типично
while( (int c = getc()) != EOF){
То есть вначале инициализируется "с" значкнием прямо из потока, а потом сразу же сравнивается с EOF.
Кстати, я сказал недавно что в С нет типа "bool". Так вот, не только его нет. В С вообще мало что есть. В С нет:
- массивов (даже одинарных!)
- операции возведения в степень
- строк
- модулей
Ты наверное подумал что я пиздабол, ведь как можно кодить на языке без массовов, в то время как С один из популярных языков? Так вот. В С есть "указатели на массивы". А самих массивов не завезли. Квадратные скобки [] - эквивалентны операциям адресной анифметики. Что это такое - ознакомишься позже, но суть в том что в С можно прибавлять числа к указателям (т.е. к адресам) и это будет означать "следующий адрес" , и таким образом и достигаются "псевдо массивы" из обычных типов. А когда хочется сделать двойной массив, на помощь приходит тип "указатель на массив", т.е. при помощи него можно смешаться сразу на пачку адресов. Вот такой мозгоеблей приходится заниматься сишнику, если он захочет сделать что-то прикладное.
На счёт строк - ещё проще. В С нет даже букв! Значения типа char тут равносильны типу byte в паскале - то есть это просто один байт. В одном байте, как мы знаем, помещается одна буква ascii. Функции стандартной библиотеки благо эту кодировку поддердживают, да ещё и на уровне синтаксиса одинарные литералы типо 'F' уместны. Так и получается что массив чисел от 0 до 255 - это и есть "строка". Но разумеется.. никто тебе не даст её так просто расширить или сложить, или что хуже - взять с ввода. Если вывести строку можно стандартной функцией printf("%s") где "%s" - это строка, во вводить её scanf хоть и физически можно но строго запрещено - в программе появляется уязвимость переполнения буфера таким образом. Дело в том что если у тебя строка 5 байт, а слово ты ввел 36 байт, то программа никого жалеть не будет и смело захуярит все 36 байт в твои 5 байт нарушив стек впизду. Правило очевидно "для ввода данных нужно заранее знать их количество"
Что ещё в С нет? Модулей. Да, в С каждый файл компилится сразу в обьектный или в исполняемый. #include тупо нещадно вставляет весь файл в твой проект. А заголовки .h - это просто "хак" прилуманный программистами чтобы избежать путаницы, которая и так появляется периодически.
Так что вот так как-то. Мне лично С понравился.

>Честно сказать кажется будто плохая идея начинать с этого языка
Говорят, что начинать с С - действительно плохо. Начинать лучше с Pascal.
Но я уже не вспомню почему. В С по-моему более гибкий синтаксис, соответствующей больше функциональной парадигме. Например, в С ты можешь спокойно написать
(A = B) == C + D
Новичкам обычно это выражение кажется лишённым смысла, так как "императивный полход" подразумевает последовательность команд, продедур, операций. А тут какая-то каша не понятная из операций. На самом деле если рассматривать это с парадигмы функции которые что-то возвращают, то тут всё просто:
Вначале выполняется "А = B", еоторая присваивает, B к А, и самое важное - сама эта операция превращается в выражение B, как функция. В паскале такого нет. В паскале присваивание A := B нельзя никуда запихнуть. А тут можно. Итого, "А = B" теперь имеет значение B , затем "B == C" даёт 1 или 0, Да. Как ты только что понял. В С нет никакого "логического типа bool". Тут всё близко к аппаратной основе, поэтому у нас есть только целые числа разных машинных слов, и флоаты с фпу. Поэтому B == C возвращает нам int, либо 1 либо 0. И к этому 1 либо 0 уже прибавляется D.
И такие конструкции вполне легально писать, и это считается нормой.
Например, типично
while( (int c = getc()) != EOF){
То есть вначале инициализируется "с" значкнием прямо из потока, а потом сразу же сравнивается с EOF.
Кстати, я сказал недавно что в С нет типа "bool". Так вот, не только его нет. В С вообще мало что есть. В С нет:
- массивов (даже одинарных!)
- операции возведения в степень
- строк
- модулей
Ты наверное подумал что я пиздабол, ведь как можно кодить на языке без массовов, в то время как С один из популярных языков? Так вот. В С есть "указатели на массивы". А самих массивов не завезли. Квадратные скобки [] - эквивалентны операциям адресной анифметики. Что это такое - ознакомишься позже, но суть в том что в С можно прибавлять числа к указателям (т.е. к адресам) и это будет означать "следующий адрес" , и таким образом и достигаются "псевдо массивы" из обычных типов. А когда хочется сделать двойной массив, на помощь приходит тип "указатель на массив", т.е. при помощи него можно смешаться сразу на пачку адресов. Вот такой мозгоеблей приходится заниматься сишнику, если он захочет сделать что-то прикладное.
На счёт строк - ещё проще. В С нет даже букв! Значения типа char тут равносильны типу byte в паскале - то есть это просто один байт. В одном байте, как мы знаем, помещается одна буква ascii. Функции стандартной библиотеки благо эту кодировку поддердживают, да ещё и на уровне синтаксиса одинарные литералы типо 'F' уместны. Так и получается что массив чисел от 0 до 255 - это и есть "строка". Но разумеется.. никто тебе не даст её так просто расширить или сложить, или что хуже - взять с ввода. Если вывести строку можно стандартной функцией printf("%s") где "%s" - это строка, во вводить её scanf хоть и физически можно но строго запрещено - в программе появляется уязвимость переполнения буфера таким образом. Дело в том что если у тебя строка 5 байт, а слово ты ввел 36 байт, то программа никого жалеть не будет и смело захуярит все 36 байт в твои 5 байт нарушив стек впизду. Правило очевидно "для ввода данных нужно заранее знать их количество"
Что ещё в С нет? Модулей. Да, в С каждый файл компилится сразу в обьектный или в исполняемый. #include тупо нещадно вставляет весь файл в твой проект. А заголовки .h - это просто "хак" прилуманный программистами чтобы избежать путаницы, которая и так появляется периодически.
Так что вот так как-то. Мне лично С понравился.
По сути си по его устройству можно назвать прокачеными макросами для ассемблера?
Ну, скорее нет. Но да, суть С в том что он низкоуровневый. У него чистый zero-runtume, т.е. он не тащит в компиляцию никаких своих библиотек и транслирует всё прямо в машинный код. Тем не менее, с точки зреня парадигмы он на ряду с паскалем, годится и для прикладного программирования. Универсальный язык получается.
Вообще я когда только начинал изучать программирование, я первым попробовал Си, около 4 месяцев на него потратил и мне тогда показалось что во первых он очень сложный из-за указателей, отсутствия строк, арифметики указателей, малок/калок и всего веселого а во вторых было ощущение что написать настоящую программу на нем сложно из-за низкого уровня. И я начал как сдвгшный ребёнок прыгать в поисках "нормального" языка и мне каждый раз очередной язык бил по голове, это нельзя, то нельзя, это ошибка синтаксиса, это переполнение стека(рекурсия в питоне ага), половина вещей без си вообще не возможна и постоянно утыкается в то что делают какие-то костыли типо cython и другой хуйни. И вот спустя 1.5 года я опять здесь, я опять пришел к богу. Все что выше это интерпретаторы Си, пошло оно все нахуй.
Двачую. Я правда ещё сам вкатун, и у меня обратное поведение. Я всегда с детства бросал кодить на первом же уроке пайтона, потому что я не понимал "а зачем все эти if-else, еще какая то аутическая срань. Возьмите да на языке схем сделайте все что нужно, и понятее и удобнее. Что за глупым каким-то бесполезным вещам нас учат". Учится программированию я начал вовсе не последних курсах унивеситета, когда начались микроконтроллеры, релейные схемы. Вот тогда уже был создан так сказать "лор" компьютерного знания. То есть стало отдаленно понятно, что из себя представляет железо, и как оно должно работать. После чего естественно пошел Паскаль, ассемблер и С.
Так вот, если Паскаль просто был не особо интересен ввиду довольно кривого синтаксиса, ассемблер мне показался довольно бессплодным в плане написания прикладных программ. Ну а С как-то затянул своим подходом. Говорят что в нем нетипичный синтаксис для языков тех лет, а мне он наоборот показался каким то догичным и понятным. Собственно, около года я на этом сраном С прокодил, и понял, что с такими знаниями я никогда в жизни работы не найду. Надо переходить на С++ потом на Python или Java где больше платят. В общем то пока что обучение С++ не задаётся - синтаксис кажется таким тупым и нелогичным, что вот порой думаешь, что кроссворды какие-то решаешь, а не код пишешь. Вроде как классы должны упрощать построение программы, но в итоге по несколько часов чешишь репу как это класс правильно сделать, чтобы не выскочило непредвиденных ошибок. И порой кажется что обычны С куда более предсказуем и понятен, чем С++ со всеми его наворотами.
Ну а Python с его производительностью вообще непонятно как может полноценно использоваться. Ладно если ещё нужно сделать то, для чего и предназначены скрипты: различные парсеры, обработка текста, сортировка, статистика, машинное обучение в конце концов. Но писать " прикладную программу" или игру на python? Зачем? Все ведь явно будет тормозить. У меня сложилось впечатление, что вообще не существует ни одного языка общего назначения помимо С.
Двачую. Я правда ещё сам вкатун, и у меня обратное поведение. Я всегда с детства бросал кодить на первом же уроке пайтона, потому что я не понимал "а зачем все эти if-else, еще какая то аутическая срань. Возьмите да на языке схем сделайте все что нужно, и понятее и удобнее. Что за глупым каким-то бесполезным вещам нас учат". Учится программированию я начал вовсе не последних курсах унивеситета, когда начались микроконтроллеры, релейные схемы. Вот тогда уже был создан так сказать "лор" компьютерного знания. То есть стало отдаленно понятно, что из себя представляет железо, и как оно должно работать. После чего естественно пошел Паскаль, ассемблер и С.
Так вот, если Паскаль просто был не особо интересен ввиду довольно кривого синтаксиса, ассемблер мне показался довольно бессплодным в плане написания прикладных программ. Ну а С как-то затянул своим подходом. Говорят что в нем нетипичный синтаксис для языков тех лет, а мне он наоборот показался каким то догичным и понятным. Собственно, около года я на этом сраном С прокодил, и понял, что с такими знаниями я никогда в жизни работы не найду. Надо переходить на С++ потом на Python или Java где больше платят. В общем то пока что обучение С++ не задаётся - синтаксис кажется таким тупым и нелогичным, что вот порой думаешь, что кроссворды какие-то решаешь, а не код пишешь. Вроде как классы должны упрощать построение программы, но в итоге по несколько часов чешишь репу как это класс правильно сделать, чтобы не выскочило непредвиденных ошибок. И порой кажется что обычны С куда более предсказуем и понятен, чем С++ со всеми его наворотами.
Ну а Python с его производительностью вообще непонятно как может полноценно использоваться. Ладно если ещё нужно сделать то, для чего и предназначены скрипты: различные парсеры, обработка текста, сортировка, статистика, машинное обучение в конце концов. Но писать " прикладную программу" или игру на python? Зачем? Все ведь явно будет тормозить. У меня сложилось впечатление, что вообще не существует ни одного языка общего назначения помимо С.
Есть момент, на С++ больше времени тратится на архитектуру программы чем собственно на саму программу что сильно дизморалит при разработке своих проектов в одиночку, я помню ситуации когда я просто бросал проекты потому что в один момент код становился просто ужасен и я не мог организовать программу, да это моя вина, я не осилил плюсы, но на си при организации проектов проблем в сто раз меньше, я как то создавая очередную 2d игрушку на плюсах поймал себя на том что я просто не хочу писать очередной класс и описывать ебаные ооп системы из-за которых полезного кода(который что-то делает) остается 50% остальное это ебаные абстрактные сальтомортале которые нужны только для того чтобы вызвать этот самый код. И это я писал на по принципу "Си с классами" а потом я посмотрел что такое настоящий С++ с шаблонами на шаблон, абстрактными класами, виртуальными методами и просто выпал в осадок, это же ад. Когда в C++ QT только у одного класса 100 наследников блять, это настоящий пиздец.
Во первых я слаб для плюсов, во вторых я не работаю программистом поэтому я не хочу ооп.
Не, ну если в одиночку по фану что-то пилить, то можно и сишкой обойтись.
Что хочу вообще? Написать симулятор распределения тепла, в объектах кубиках. Ну, просто цветные пиксели: красные движутся вверх, синие вниз. Перераспределение тепла от объекта к объекту и т.п. и т.д.
Вообщем, домашний долгострой, для изучения языка.
Хотя вот думаю, если код на С и выбранный gui фреймворм будет жуткий, то лучше останусь на Processing.
Про WinAPI и GDI уже сказали.
Всякие библиотеки для UI-шек говно ебанное и каждый пишет кто во что горазд.
Проще изучить DirectX или OpenGL и рисуй окошки через них, а для остального запили конечный автомат, который перехватывает сообщения(клава-мышь-таймер) от оконной процедуры.
Для твоего симулятора лучше всего подойдет писать все на пиксельном шейдере.
Если взялся писать на C, то лучше на OpenGL с библиотекой glfw. Минимум мороки и готовый фрейворк для конечного автомата.
Если совсем не хочешь связываться, просто запили минимальный рендеринг одной текстуры, которая будет транслироваться из удобного тебе массива.
Можешь и на DirectX, но он заточен на C++ и на C всякие ООПшные кишки не спрятаны под капот и придется в ручную с ними работать. А еще он более низкоуровневый чем opengl, отчего его сложнее освоить.
Ну насчет dx/og я не согласен, все таки они больше для 3д, GDI для 2d графики намного удобнее, очень легко рисуются линии, круги, квадраты и все остальные базовые фигуры, не надо самому описывать внутренние системы для отрисовки этих самых примитивов, можно сразу же приступить к созданию своих виджетов.
Мимо >>399782
Но насчет мультиплатформености да, GDI уже не подойдет, кроме opengl ничего не остаётся.
Мультиплатформа это чтобы на семерке и икспи работало. А линукс не мультиплатформа, а долбоебизм. Написание графических приложений под роутер иначе как даунизмом нельзя назвать, это не платформа настольных приложений. Если даже до такого додуматься не можешь, наверное стоит пойти нахуй из программирования, ну или продолжать инфоцыганить поносом из СМИ, всё равно код не пишешь, только попугаишь инфомусор как нейросеть.
>Мультиплатформа это чтобы на семерке и икспи работало.
Нищебродина, спокуху оформи. Такую мультиплатформу ты себе сам на помойке соберешь из отходов.
А линукс это удобная, современная и прогрессивная операционная система для компьютеров последнего поколения.
Не-не, линупс нахой не нужен. Я ибал писать под него. В новостях постоянно читаешь, как очередную программу героически переписаои на свежайший фреймворк. Я прям соболезную потери сил и времени затраченное на очередное (!) переписывание с гтк3 на ГТК4, с кути5 на кути6. Что там на очереди ?. При этом программа остаётся по сути той же самой, но на новом фрейворке и с новыми багами. А так же с новыми аппетитами на цпу и рам. Без слез не посмотришь, как эти бедолаги варятся в своей экосистеме да ещё и гордятся этим. Жесть просто. Как хорошо, что я вовремя всё это понял и спрыгнул с этого поезда.
>У него чистый zero-runtume, т.е. он не тащит в компиляцию никаких своих библиотек
libgcc
> и транслирует всё прямо в машинный код.
Как и хаскель. Причем простой оператор С может обернуться десятками команд.
Это еще цветочки, я на гитхабе наблюдаю обновление программ, консольная залупа, думаешь что там обновляется? Фреймворки? Нет. Библиотеки? Нет. Обновляется язык программирования.
>"Обновлен язык до 2.3"
>"Обновлен язык до 2.4"
>"Обновлен язык до 2.5"
И ко всему прочему, обновляет бот, и на каждое обновление, такой гордый релиз новой версии публикуется. Молодая, дерзкая, активная разработка ПО из 10, охуеть просто.
А ответ прост - имитация деятельности.
>Без слез не посмотришь, как эти бедолаги варятся в своей экосистеме да ещё и гордятся этим.
А чего им плакать, они довольны как коты обожравшиеся сметаны, имитируют работу, но за результат никто не спросит. Они и не хотят ничего делать рабочее, это же работать надо, труд, ответственность. Не, это не про сою, которая развлекается с кодом всю жизнь играя в показуху.
GDI легаси говно из бородатых 90-ых, когда графон на CPU рисовали. Оно тормозит даже при аппаратном ускорении, ибо реализация однопоточна и идет через еблю системных вызовов и постоянном переключении контекста. Рисовать графон несколько десятков линий и битмапов может и проще, но когда дело доходит по кастомного виджета, то становиться хуево.
И DirectX и OpenGL универсальны и в себе содержат фреймфорки для 2D графики и текста. Хотя зачем они нужны если есть шейдеры?
Хуя неосилятор бабахнул
Просто судя по тому что анон спрашивает он не имеет достаточно опыта, и отправлять его на OpenGl это а тем-более DX это в его случае 99% забрасывание своего проекта, щас он нарисует первый разноцветный треугол и охуеет.
Пишут, что медленно. Вот, сколько теоретически ФПС выдаёт окно 800х600 в котором черно-белые пиксели в виде шума рисуются?
>Пишут, что медленно.
Самое простое что ты можешь сделать, это рисовать свои точки в память RGB буфер, а потом его выводить сразу 30 раз в секунду как картинку или через GDI или GL. А еще лучше, реализуй это на JS + Canvas в браузере и не еби мозги.
мимо
Вызов одной функции рисования примерно 5-10 тыщ тактов процессора + задержка памяти. В итоге выходит 12-30 микросекунд. При самом оптимистичном варианте у тебя около 80 тыщ вызове в секунду, если ты рисование в отдельный поток вынесешь. На практике же не более 50 тыщ вызовов в секунду.
Точки и линии довольно одинаково прожорливые как и отображение битмапа. Так что рисуй в массивы и отправляй на рисовку как спрайты.
По сложности это примерно как разместить два треугольника и натянуть на нею свою текстуру в opengl. В GDI тебе нужно заново создавать устройство, привязать к окну, создать контекст устройства и привязать к нему структуру, в которую входить битмап.
>Точки и линии довольно одинаково прожорливые как и отображение битмапа.
Отображение битмапа бесплатное. А точки, линии и прочее зависит от того каким образом их рисуешь. Рисовать пиксели по алгоритму, будут дичайшие тормоза.
Чтоб битмап отобразить, то нужно как минимум переключение контакта для обработка абстракции железки. Видеопамять бутылочное горлышко и оно создает главный тормоз. Так получается, что функции отображения битмапа стоят примерно так же как и рисовании линие или изменение одного единственного пикселя.
>libgcc
Это если динамически линковать, то да, типа рантайм. Причём он уже в системе, загруженный сотней системных утилит и под капотом у каждой третьей прикладной.
Не, ну если кто-то принципиально против stdlib, то компиляй статически только те функции, что реально используешь. Или велосипедь свои. Запарно но выполнимо.
>простой оператор С может обернуться десятками команд
C не перегружает операторы, это тема плюсов.
>libgcc
Gcc не является единственным компилятором С, более того, он не является каноничным.
>Как и хаскель. Причем простой оператор С может обернуться десятками команд.
Нет. Если простой оператор С превращается всего лишь в десять команд, то хаскел вообще делает другое: он вначале подрубает функции из стандартной библиотеки, и также выполняет сборку мусора. Хаксель ни разу не низкоуровневый. А С вполне себе. На С можно писать без стандартной библиотеки вообще, чисто как на ассемблере.
Брехло, ты же никогда не писал ничего, тупой баран, ничего не понимаешь, только серешь инфомусором изображая ыксперда.
>не является каноничным
Дико извиняюсь, а что есть каноничный компилятор? Portable заточенный под стандарт `69?
двачую
tcc -r batch-rename-files.c форева
но блин попробуй хотя бы calcurse через него собрать
Охуеть, его 1 человек делал? Это реально? Насколько сложно реализовать компилятор, это же пиздец.
Нереально, поэтому заброшенный бесполезный кал годный только для хеллоуворлда. Игрушка уровня тех хакерских соревнований делать графические демки не более килобайта в размере. Показать дебилам, те покудахтают "вау! крута!" и на том всё, уровень тиктоко-видосов.
> массивов (даже одинарных!)
Формально таки есть, можно сделать же
int arr[] = {};
И arr будет массивом.
Не будет, в си нет массивов, это просто еще один вид указателя обмазанный чуток сахарком. То же самое со строками, строк в си нет, это буфера байтов, чуток обмазанные сахарком. Заметь, буфера байтов, а не массивы, потому что массивов, как уже сказано, в си нет.
Как раз arr будет статическим массивом, ты же сам только что признался, что для него и sizeof по-другому работает.
А почему нет строк? Есть же стандартная библиотека string.h
Я понимаю, что ты говоришь об структурах данных и о сопутствующих им методах, но на уровне железа это и будут те самые участки памяти в куче.
>sizeof по-другому работает
Это не делает из указателя массив, указатель есть указатель.
>Есть же стандартная библиотека string.h
Поэтому сишники пердолят сырые литералы и буферы?
Вот в крестах есть std::string, все юзают, понятно как, а что с твоим файликом? Покажи как его используют и где. Ты же не считаешь что натравить какую-нибудь strlen(void*) на байтобуфер это строка?
>А почему нет строк? Есть же стандартная библиотека string.h
Стандартная бибиотека С... Увы не "стандартная". Все функции в ней также написаны на С и предсталяют собой пердолинг с буферами. Как я уже и говорил, из-за этого некоторые функции запрещено использовать, так как они несут уязвимость переполнения буфера, а во время создания string.h никто даже не думал что найдется еблан которому зачем-то нужно будет переполнять буфер. В С++ вроде бы есть полноценные строки из настоящей "стандартной" библиотеки которая идёт в рантайм.
А использование питона не отменяет использования ассмеблера и что?
Нет, делает, потому что sizeof возвращает количество байт, которое относится к массиву, а не максимальную длину машинного слова, ок-да? Да, сопутствующих методов методов нет для массива нет, но это статический массив в стэке, а не указатель.
Потому что строка это и есть ебучая последовательность байт в куче, которая заканчивается ёбанным нулём.
Тебе надо, чтобы в заголовочном файле был typedef struct {char* str, int size;} string; или что? Я понять не могу.
>Нет, делает, потому что sizeof возвращает количество байт, которое относится к массиву, а не максимальную длину машинного слова, ок-да?
Так тебе уже пояснили, что это достигается за счёт типа "указатель на массив". Т.е. в С можно указать на произвольное количество байт, причем сами эти байты не ведут себя как массивы в привычных языках, и массивами не являются даже чисто из определения.
Ты дятел, троллишь тупостью, даже не понимаешь что такое тип. Вот в си есть тип int это число, пишешь a=123; и получаешь свое число, пишешь a+b и получаешь сумму чисел. Вот что такое тип. А что со строками или массивами? Их не существует, нет никаких строк и массивов, это лишь указатели на память. Ты не можешь сложить две строки, ты не можешь сложить два массива, это не типы. Работая со строками и массивами в си ты думаешь не о строках и массивах, а о байтах. Это байты, а байты не тип, это сырая память, машина.
Про определению типа невозможно выйти за его пределы. Ты не можешь выйти за пределы int, потому что это тип числа, нельзя выйти за пределы числа работая с числами, это абсурд. Если ты выходишь за пределы типа, это значит ты работаешь не с типом, а с системой ниже уровнем, то есть типа нет, ты бредишь, отыгрываешь тип которого нет у себя в воображении, это шизофазия.
>не ведут себя как массивы в привычных языках,
Нет ошибки при выходе за границу.
Многомерная индексация ломается при передаче в функцию.
Вот и всё.
> и массивами не являются даже чисто из определения.
Определение массива хоть на вики прочитай.
>Нет ошибки при выходе за границу.
>Многомерная индексация ломается при передаче в функцию.
Так это уже о многом говорит. Ещё нет ключевого слова array как во многих языках. Потому что такого типа как "массив" нет в С. Поведение квадратных скобочек [] аналогично поведению операции разыменовывания. Сказать что в С есть массивы, это всё равно что сказать "В С есть ссылки" и привести в качестве ссылки - указатель. Потом можно ещё больше дристануть и сказать "в С есть классы" - и привести в пример структуру с указателем на функции. Ну уж нет. С не предусматривает ни ссылок, ни классов, ни массивов. Однако для простоты можно сказать "масссивы", как мне неоднократно говориои " попробуй передать значения по ссылке" - явно имелось ввиду что по указателю, ссылок то в С нет.

Хотя пусть даже так будет. Оно наверное даже по-разному обработается или чепуху выведет, а не содержимое str...
Гы-гы-гы, угадай на основе чего реализованы ссылки в плюсах.
Но спорить не буду, механизм классный.
>Но это фича, Си минималистичен и гибок.
Фича фичей, но не будь дауном пердолящим сырые сишные строки, кончается это очень плохо, коррупцией памяти с непредсказуемым результатом. У меня есть программа работы с текстом написанная лоулевел-дебилом, она падает, может раз в день или даже раз за разом, а может год не падать, вот и сиди думай что там не так. Аналогично с массивами являющимися такими же указателями как строки. Самый верный путь обсёра - пилить на сишке эти математические задачки которые так любят в шкалках, типа "сортировка массива". Игра в сапера, один неверный шаг и подрыв.
Вим и емакс написаны на ассемблере и Си. Что-то не замечал, что они часто падают.
> меня есть программа работы с текстом написанная лоулевел-дебилом, она падает, может раз в день или даже раз за разом
Ну, потому что дебил неправильно сделал программу.
Я вот на С++ пытаюсь перейти, и не понимаю в чём суть: дроч со строками и с памятью остался. А поведение стало более непредсказуемым. Если твой С-шный код лего отдебагать и выяснить в какой момент происходит ошибка, то С++ код это какой-то говняк, в котором половина всего происходит на уровне компилятора, и нихрена не понятно что куда должно пойти.
А если брать python - то там очевижно производительность низкая, да и в бинарнико по нормальному не откомпилишь.
Интуиция
Питон это вообще не язык. Питон, java, Lua там всякие..
На C++, C#, ASM, и даже на Bas и Pas'e пишешь код и получаешь готовый продукт.
Ну что это за языкы , если для запуска творений написанных на этих языках, необходимо тщательно организовать среду выполнения (окружение так называемое) . Потом надо убедиться есть ли трансляторы этих языков на ПК (питона транслятор , джавы и т.д). Потом что-то там скомпилировать через ёбаный в рот и с божьей помощью, через какое-то консольные команды. А потом выясняется, что под эту платформу код не подходит. А писал на 32й машине, но запустить надо к примеру на 64й.
Вы извините меня за грубость конечно же, но и накипело просто.
Меня убивает главный лозунг джавы
"Напиши единожды и запускай везде"
Да нихуя это не так. Там ебля жёсткая будет если даже с разных Винд будешь байт код запускать.
Там весь код нахуй переделывать придётся.в чем смысла тогда этой ихней мультиплатформенностм?!
Я тогда лучше буду на ассемблере писать. Один хрен как и там придётся под каждую платформу переписывать код, так зато я на голом железе буду код делать высокоскоростной, чем на тех «мультиплатах» которые нихуя не мульти на самом деле и к тому же интерпретируемые.
А да, ещё по Линуксу.
Эх Линукс Линукс.. (ниже буду метафоры использовать)
А какой смысл вообще овладевать Линуксом? ( не важно на низком уровне / или на высоком уровне). Какой в этом смысл если это мёртвая система. Ну ок пусть не мертвая но сугубо «Островная» ОСь не имеющая связи с материком.
Если и овладевать Линуксом на очень хорошем уровне, то надо сразу же первым делом софт писать начинать для него. Моё мнение. Чтобы он постепенно приобрёл «связь» с материковым миром.
Материковым миром я называю софтовую экосистему где Word'oвские файлы открываются хорошо (одинаково) у всех пользователей на любых машинах, директивы одинаково выглядят, приложения легко протираются. Или чтобы хотя-бы исходные коды компилировались и запускались и там и там без проблем.
А Линукс ну хз.. Реально остров какой-то сделали непонятный. В далеке от материка.
И ладно бы если этот остров начали заселять и развивать, но нет же сука. Рядом ещё Островок поменьше сделали. И ещё рядом. И в итоге островков наебенили кучу. И все полудикие в итоге.
Но он сырой же , ваш этот Линукс. Ну чувствуется же
>Материковым миром я называю софтовую экосистему где Word'oвские файлы открываются хорошо (одинаково) у всех пользователей на любых машинах
Что за бредятину ты несёшь? Я думал ты сейчас зайдёшь с козырей, начнёшь рассказывать что в ентерпрайсе используют windows server, и админ винды - намного более образованный человек чем рукожоп на линупсах. Но нет, началось "пук серьк, а на моём линуксе 1С предприятие не открывается!!! это што получается линух - не актуал". Твой вонючий ворд и 1С - не актуал. А на libreoffice всё отлично работает.
Нет Линукс не не актуал
> > на моём линуксе 1С предприятие не отурывется, это што получается линух - не актуал".
Нет, дело не в актуал или не актуал.
Идея Линукса хорошая. НО он просто СЫРОЙ.
Понимаешь. Их много очень просто и вместо того чтобы оставить 2-3 разновидности Линьки и довести их до ума, их наплодили несколько десятков.
В этом вся проблема.
> НО он просто СЫРОЙ.
Какой впизду сырой. То что на линуксе нет 1С и нескучных обоев - это проблема только твоей больной головы. Сырой блядь... А вот если заменить линукс полностью на винду то не сырой. Траву потрогай.
Почему 1С нет? Есть же десктопная версия под линукс. Вот например учебная версия https://online.1c.ru/catalog/free/28766016/
мимо
Это фича, а не баг. Комуто убунта, а кому-то арч. А не как барин за всех решил, то и жрите.
Тем более. Хз что "недопиленного" в линукс. В линукс наоборот, есть "искажённое" и "перепиленное". Например, я адепт того что по-умолчанию в unix-like системах не должно быть видеоядра, только сонсоль. И это не какая-то дань традициям, просто вот юникс он сделан под консоль. Графика там тоже есть, но пытаться впихнуть графику в ядро - это какое-то бесполезное подражание шиндовсу. Зачем? нужен шиндовс - сиддите на шиндовс. У юникса свой путь, своя философия.
Я терпеть не могу кстати эти ваши нескучные обои и эти анимированные курсоры.. у меня на всех компьютерах дома стиль оформления win98. Щас сфоткаю рабочий стол свой и оформление компа
Нет, должно быть не так бро. Должно быть так : это Линукс! А вы уважаемый пользователь может собственноручно его под себя настроить. Хотите, можете подружить свой Линукс с такимто пакетным менеджером, хотите можете с другим и т д.
А не как на самом деле. Вот есть Линукс к примеру а он для таких то целей предназначен, есть Линукс та он для таких целей предназначен, есть Линукс ли он для тестирования безопасности, а есть ещё Линукс для музыкантов к примеру.
Эта хреновая концепция. Должно быть как в Винде . Это Линукс Линукс, он для чего угодно, он чистый, стоковый, девственный. А какие программы вы туда поставите тем и будете, хотите музыкантом станьте, хотите криптографом, хотите врачём, хотите программистом.
Вот так должно быть
Ладно извини. Хорошо
Ну и какие проблемы? Поставил себе в арч LMMS и ты уже еба диджей, поставь криту - ты уже еба художник.
Двачую. Существование нескольких ПАРКЕТНЫХ МЕНЕЖЕРОВ со своими репозиториями - это уже шиза.
Ты дурак? Дистрибутив = репозиторий = свои мейнтрейнеры. Если бы была одна репа, то небыло бы 100500 линуксов. Все должны подчиняться красношапке или Шатлворту и жрать корпоративные анальные зонды убунты?
Будущее за тивоизаций линупса и превращение его в прошивку для тех самых анальных зондов.
>превращение прошивки в анальную прошивку
Велика разница, и если начистоту, уже анальная прошивка, делают корпорации для корпораций, чем не анал.
>чем не анал
Тем что еще живы дебианы с арчами. Но тенденция такова что опенсорс загнется рано или поздно. Причины в том что корпорациям станет нвыгодно опеносрсить из-за иишки
1) Сокращения ит штатов - нехватка рук
2) Увеличение веса ad hoc решений генерированых иишкой - они по определению не могут быть переиспользованы где-то еще
3) Деквалификация уволеных айтишников, которые не смогут корпоративные решения мейтенить в опеносорсе.Те больше вопросами выживания будут заняты, чем поддержкой свободного софта.
4) Недоступность мощного ии вне корпораций. Опять же корпораци будут внедрять технологии, которые за их пределами никто не поймет и не сможет адаптировать.
Зарыть голову в песок тоже не очень умная стратегия. Вы щас визжите что llm-ки не станут ии, как раньше визжали что не может быть летательных аппаратов тяжелее воздуха.
По мне так правый поворот в мире, очень кстати по времени сочетается с желанием заменить людей везде и всюду. Корпорации будут рыть в этом направлении еще долго, потому что разочаровались в возможности управления людьми.
Ну так если ты не понимаешь как это работает, то это твои проблемы, хорошо что тебе фокусников в цирке мамка еще не показывала.
Ты конечно больше понимаешь, но не можешь понять что прогресс не стоит на месте. Первичны не технологии, а первичны идеи. В данный момент истории - желание заменить человека. Откуда стала форсится идея что у челов нет свободы воли? Оттуда что дяди в пиджаках решили, что человек - тоже стахостический попугай, а раз тоже самое, то зачем платить больше. Можно заменить на железного стохастического попугая.
Нет вакансий для джунов больше нет. Два сидящих здесь джуна все оставшиеся вакансии закрыли.
>форсится идея что человеки не нужны
>прогресс
Значение знаешь? Сам понял что спизданул?
Маня, проснись и просрись. Если форсится идея что "человеки не нужны", это банальная атака. Кто-то уничтожает своих врагов, только и всего. Прогресс это развитие человека, а не его самоубийство. Самоубийств вообще не бывает, это абсурд, бывают только убийства, в том числе и непрямые, когда жертву убеждают убить себя. Но какая разница, это всё равно что взять и застрелить, просто используется другое оружие, не огнестрельное, а психологическое.
А теперь прочитай определение киберпанка.

откуда компилятор ебёт что с твоими структурами делать? Руками допиши, там работы на миниту.
В чем противоречит? Применение побитовых операций к высокоуровневым объектам? Нахуя?
берёшь и применяешь сложение к каждой паре битов, ебать компилятор никого не должен
Тупой ты пидор, а если размер структуры превышает размер регистра? Он за тебя должен цикл создать, где к каждому байту применит побитовое сложение? Иди нахуй, пидор.
> Он за тебя должен цикл создать, где к каждому байту применит побитовое сложение?
ну да, логично, почему нет
мясо я не ем
Нихуя ты не знаешь Си, если бы знал, то не писал бы подобную чепуху, ты не заслужил потреблять углеводы и протеины, ты тварь поганная.
ну ладно извините я ухожу

Эххх.. феназепама бы.. или прегабалина. но мне не продают без рецепта.
>>402847
Нет конечно. Вообще 0. Я больше скажу, в С++ практически нереально вкатится, не то что в С ебаное.
С - это чисто для души. Если нужна работа - жава, пайтон, 1С.
>>403595
А что такое "идея С". Помоему, в С вообще использовать структуры - это зашквар. Их используют редко, и чисто по делу. Структуры - это к С++. В С принято выёбываться адресной арифметикой, и байтоёбствовать. Поэтому правильнее было бы реализовать двойной массив а и б.
https://github.com/hezenberg/Swinekeeper
Не обращайте внимание на моменты где нет комментариев или указаны неиспользуемые типы, я ее еще не доделал, но основа уже готова, остается дописать gamelogic и в общем то все.
>что без указаний на ошибки или какие-то недочеты сам не буду расти
Предлагаешь анонам вникать в твой код и искать ошибки? Неси кусок пообсуждем, ну и скриншоты игры на гитхабе выложи
У меня нет проблем с отладкой, код работает как я задумывал, я принес обсудить в общем моменты проектирования, правильного использования тех или иных инструментов и т.д. Тут люди с опытом может объяснять что-нибудь или укажут что нужно исправить, какие у меня есть недочеты.
Бездушная машина, не хочу. Такое только с людьми обсуждать.
Ну и хуле ты высрал? на чём работает твоя говно-игра? какой-то кал. пару строк - и говно.
Т.е. он захадкоден. Т.е. На FreeBSD я твою хуйню посмотреть не могу. Ну тогда открывай рот, лови мочу, хуле сказать. Либо делаешь для BSD и топовые адепты опенсорса тебя оценивают - либо терпи попуски. Извини, жЫзнь такая :(
Я не автор проекта.
А как это сделать? Это надо на Qt делать получается? Он, вроде бы, кроссплатформенный.
В общем счете да это только для windows, писать для линукса и ему подобных никакого интереса, к сожалению там нет полноценного единого графического API у системы. Нет так нет, в любом случае.
Да, через костыли в основном, как и все там.
>А как это сделать? Это надо на Qt делать получается? Он, вроде бы, кроссплатформенный
Хотя бы сделай обёртку для своей хуйни. Вот я сделал на С. Обрати внимание на модуль IO. В зависимости от того что ты подключишь io_xlib или io_winapi у тебя то и будет!!
https://github.com/drvptr/CrimewareRender
>>403968
>писать для линукса и ему подобных никакого интереса
Ну тада диннах. Чё мне твоё говно под свиндус тестить.
Писю пасаси патом праси азаза.
Окошки рисовать != графическое апи. Зачем тебе системные контролы в игре? Ты где с этим игры видел? В линупсах есть sdl есть вулкан, возьми высокоуровневую обертку для этого. Какое тебе еще надо единое?

чо нiтак?
Ок
Вчмысле? Не использую. Их и не возможно использовать. Статические функции в С означают что ты их не можешь использовать в других модулях. И логика кода как бы подразумевает, что если есть слово static - значит это не для тебя написано и не для таких как ты. А в .h такие функции даже не регламентируются.
Это называется рабочая атмофэра ваще-то
Так в плюсах та же адресная арифметика.
Да и в остальных ЯП тоже, даже в питоне индексация массива с нуля.
А вот в Паскале по массиву с единицы ходят :)
Не люблю Паскаль

Залил скрин, если кому интересно, да выглядит как говно, но это пародия на говно с пикрила.
Родные, прошу, посоветуйте для C годных курсов на степике бесплатных, пожалуйста... Очень хотелось бы обучение начинать, теорию с практикой совмещая
У Тимофея Хирьянова очень классный вводный курс по Си. Советую.
Знаю, что вопрос был про степик и задания, но всё равно.
Анончик, спасибо !!!
>Да и в остальных ЯП тоже, даже в питоне индексация массива с нуля.
При чё здесь это? Сразу видно ты похожу нихуя кроме пайтона и не знаешь.
А зачем си плюс плюсы структуры, если там есть их стероид версия в виде обьектов

Этот фрагмент кода используется только для загрузки tga изображений. На тот момент я хотел сделать игру более независимой от любых библиотек (вдруг для условного tcc забвли math.h разработать). Он не используется более нигде, кроме загрузки изображений, поэтому на скорость рендера не влияет, ведь изображение всего раз пожгружается, а затем используется из оперативной памяти.
В плюсах структуры и классы это практически одно и тоже. У них всего одно отличие. В классах данные по-дефолту private, а в структурах public.
Структуры и классы буквально одно и то же, за исключением что у классов private по-умолчанию. В целом можно и в структуре сделать конструкторы и деструкторы, методы.
Структура нужна просто чтобы логически отделить, когда мы имеем дело с композитным типом данных, а когда с классом а ООП. Язык же он для человека в первую очередь, а не для компилятора.
Не закину, вообще не понял твоих идей. Походу легче будет с нуля написать.
Вообще на счёт этого модуля, как ты понял он писался первым. Вначале идёт гора статик-функций. Эти функции используются только в самом зтом модуле (очевидно, ведь они статические, их линкер не индексирует). В файле .h перечисленны уже "внешние" функции, типо api. Они находятся внизу .с файла.
Там вначале по-моему идет
0.немного математики для этого модуля
1. Работа с разрядностью. Тут функции для конвертации пикселей от 8 до 48 битовой разрядности. В конечном итоге в памчти всё в 32 разрядности хранится, просто потому что удобно по байтам доступ иметь типо 0xRRGGBBAA
2. По-моему дальше идёт описание самого формата tga. Тут структура из "заголовка", опционально палитра, сам канвас, и "подвал".
Тут реализованы функции распознавания типа изображения, функции импорта заголовочника, функции импорта канваса, функции для выделения памяти под всё это, в также удаления этой памяти. Функции для RLE сжатия итд.
3. Прикладная часть.
Вот тут уже чисто полезные функции. Не статические.
Импорт тга, экспорт тга, удаление тга из памяти, закрасить пиксель на тга, "взять" пиксель на тга, изменить порядок байтов RRGGBBAA -> AARRGGBB, изменить размеры картинки (билинейная интерполяция). Короче всё что можно использовать на практике.
Наследие адресной арифметики, не?
Вообще, я с синтаксисом Паскаля(кроме указателей), питона(кроме ООП классов) и Си знаком.
>>404942
> Паскаля(кроме указателей)
> питона(кроме ООП классов)
Да ты и не только в этом обосрался. Что ты о программировании знаешь вообще?
В пайтоне нет массивов, потому что там вместо массивов есть более удобные вещи типо списков, библиотек, итд, более высокоуровневая масштабируемая хуйня. В Numpy есть массивы, как отдельный модуль, но я уже и не знаю зачем он нужен если есть list.
В C++ есть как обычные Сишные "псевдомассивы", так и полноценные массивы std::array.
В паскале есть полноценный тип "array" то есть тупо массив как массив.
А при чём тут "с чего начинаются" массивы, я вообще в душе не понимаю к чему ты это спизданул. Пусть хоть со 100 начинаются. Что это меняет?
А что ты хочешь запрограммировать? Давай помогу.

Ну, разъебал, нечего добавить. Но в плюсах массивы и вектора всё так же базируются на псевдомассивах, можешь сам попробовать взять адрес первого элемента и вывести следующие за ним данные.
Или нет, вроде бы, в PascalABC индексация именно, что с нуля была
Что не так?
с единицы*
Псевдмассивы должны быть в скобочках, а то доёбешься ещё, что реально считаю, что есть такой тип данных как псевдомассив.
>всё так же базируются на псевдомассивах
И всё это в конечном итоге транслируется в машинный код. Так и запишем С++ = машинный код. Диннах, клоун.
> Вообще на счёт этого модуля, как ты понял он писался первым. Вначале идёт гора статик-функций. Эти функции используются только в самом зтом модуле (очевидно, ведь они статические, их линкер не индексирует). В файле .h перечисленны уже "внешние" функции, типо api. Они находятся внизу .с файла.
А вообще есть какие-то паттерны как организовывать такое? Ну то есть взаимодействие между файлами, есть какие-то правила? Иди кто во что горазд?
Ты язык ассемблер пропустил перед машинными кодами. Соси бибу!
А какие паттерны нужны?
Для ТГА подходит помоему очевидная "фабрика" т.е. у нас есть обьект TGAimage и операции над ними обучловлены.
У меня ещё были паттерны "стратегия" в модуле с кнопками gui. Дело в том, что я не знал как описать всё разнообразие кнопок, и решил, что пусть будет абстрактная структура gui_element, в которую можно набивать всякие свойства, и в зависимости от свойств она меняет поведение. Например вон, смотри, одна кнопка - перемещается за мышью, другая кнопка - закрывает программу, третья - ничего не делает. Тут как ты видишь, я скрестил этот функционал с паттерном "наблюдатель". Дело в том, что все элементы gui_element, они ещё и помещаются в список gui, и существует функция NotifyGui, которая все кнопки опрашивает на их ответ, в зависимости от текущего состояния кнопок/мыши итд.
Просто, в какой-то момент мне показалось что всё что я делаю - это уродство, и я решил забросить. Модули gui.c, animation.c - не сохранил. Хотя реализуются они довольно просто, я думаю если хочешь - запросто допилишь. Анимация сделана по всё тому же паттерну "фабрика". Есть у нас обьект "анимация" который ссылается на какую-то 3d модель (кстати, модуль 3d моделей в том же паттерне), и мы можем воспроизвести кадр анимации, изменив её внутреннее состояние в качестве побочного эффекта.
В render3d.c фишечки с call-back. Сомневаюсь что это тянет на какой-то паттерн, но решил добавить. Там же в отрисовке как линии так и треугольника присутствует "отработчик", т.е. то каким образом отрисовывать треугольник ты задаёшь call-back функцией. Вот на третьем пике: 1.сплошной, 2.градиентный, 3.рандомный, 4. Рандомный с прозрачностью. Это и позволяет в дальнейшем сделать текстурированный отработчик для отрисовки полигонов модели.
Могу впринципе иерархию рассказать. В большинстве своём преобладает паттерн "фабрика".
I.НЕЗАВИСИМЫЙ УРОВЕНЬ.
-GRAPH/tgatool.c , можно вообще использовать самостоятельно, без всяких там других модулей. То есть можешь в отдельный каталог откомпилить tgatool и пользоваться им как инструментом для обработки tga картинок. Сам tgatool включён только в render3d, для того чтобы загрузить текстуру, и дальше елозить по ней, просто как по массиву памяти.
- IO/xlib_io.c Тоже можно использовать отдельно. Это просто обётки для стандартных функций xlib. Она описывает два обьекта - контролы, и "окно". Всё просто, окно - это в твоей графической оболочке какая-то область, на которой можно рисовать. КОнтролы - это клаво/мышь.
На окне можно рисовать.
Контролы можно "опрашивать" ожидая изменения состояния. (Точнее, опрашываются не контролы, опрашивается сервер, на наличие изменений, сам "тип" контролы обозначат состояние клавиатуры и мыши, т.е. в нём содержится массив по всем кнопкам и об их состоянии). Тут таже есть макросы типо "нажата ли кнопка".
Зачем эта херота нужна? Очевидно, чтобы инкапсулировать ввод. Теперь достаточно переписать этот модуль под винду, а обёртки функций останётся те же. То есть переписав этот модуль, вся ебучая программа портируется на Windows одним кликом!!! Все остальные модули не используют xlib, они используют только обёртки из этой функции, чтобы быть платформо-независимыми.
- GRAPHIC/algebra.с - тут даже никакого паттерна нет. Это просто чисто немного математических функций. Тут, конечно описан тип "вектор", который представляет собой массив из трёх чисел. Также описаны векторные операции, типо скалярное произведение, векторное произведение. Под вектором подразумевается только трёхмерный вектор. Двухмерных веторов у меня нет, посчитал их бесполезными. Собственно, этот модуль также можно использовать отдельно, он ни с чем не связан. Можно просто взять и начать использовать векторные операции где-то у себя в коде. Также тут реализован Fixed-point типо, т.е. числа с фиксированной точкой. Никакой скорости по сравнению с FPU он не даёт, зато смотри эффект (см скришоты) - типо погрешность, красиво.
II. ЗАВИСИМЫЙ УРОВЕНЬ
- GRAPHIC/wavefront.h - Парсер wavefront obj, 3д моделей. Также, "фабрика", есть тип "3d модель", её можно открыть, удалить, повернуть, передвинуть из неё отдельные точки, распечатать лог о модели, реканкулировать нормали. Для последних функций типо "повернуть" и "реканкултровать нормали" нужны вектора. Поэтому он зависим от модуля algebra.c.
- GRAPHIC/basics.c - тут описаны базовые примитивы для рисования. Как в паскалике на уроке "DrawLine, DrawRectangle". Исключение составляет лишь треугольник, как говорилось, треугольники требуют отработчика. Для тех кто не хочет ебать мозг есть макрос TRIANGLE(w,x1,y1,x2,y2,x3,y3,color) который использует стандартный отработчик default_plot (просто закрасить пикселы указанным цветом, без особенностей).
Данный модуль, к сожалению, зависим от IO/io.h. Ему для вывода необходимы какие-то функции вывода в окно. Я когда только разрабатывал, фантазировал сделать полносью независимый модуль который бы "рисовал ни на чём", а при подкрутке к нему графики рисовал бы графику итд. Но я не додумался как это реализовать и решил просто захардкодить. Кроме того, этот модуль поддерживает fixed-point так что если используются фикседы, то нужно и algebra.c подключеить. Впрочем, по-умолчанию тут на флоатах всё.
- GRAPHIC/render3d.c - Ну и финальный модуль, для его работы необходимо очевидно и algebra, и basics и wavefront_obj, да к тому же и tgatool.c в него включён. Собственно, в модуле описаны такие обьекты как "камера", и методы рендера. Сами модели тут не описаны, так как они уже были описаны в wavefront.
Камеру мы можем создать двух типов: перспективная, и ортогональная. Вроде всё очевидно. Схема работы такая: создаём камеру, инициализируем камеру, загружаем 3d модель, загружаем текстуру (при необходимости). И далее "фотографируем" нашу модель при помощи любой из следующих процедур:
RenderWireframe - отрендерить проволочную модель.
RenderZBuffer - отрендерить отдельно значения буфера глубины для данной модели.
RenderShaded - отреднерить плоско-затенённую фигуру
RenderTextured - отрендерить плоско-затенённую фигуру, со следующей текстурой.
RenderGouraud - отрендерить сглаженную по-Гуро обьект с текстурой.
Солнце тут захардкожено, настраивается макросом SUN, который представляет собой вектор. Т.е. чтобы изменить направление солнца - нужно изменить направление этого вектора.
Падающие тени отсутствуют.
РЕФАКТОРИТЕ!! (если хотите. если не хотите - то и пох)
-
Могу впринципе иерархию рассказать. В большинстве своём преобладает паттерн "фабрика".
I.НЕЗАВИСИМЫЙ УРОВЕНЬ.
-GRAPH/tgatool.c , можно вообще использовать самостоятельно, без всяких там других модулей. То есть можешь в отдельный каталог откомпилить tgatool и пользоваться им как инструментом для обработки tga картинок. Сам tgatool включён только в render3d, для того чтобы загрузить текстуру, и дальше елозить по ней, просто как по массиву памяти.
- IO/xlib_io.c Тоже можно использовать отдельно. Это просто обётки для стандартных функций xlib. Она описывает два обьекта - контролы, и "окно". Всё просто, окно - это в твоей графической оболочке какая-то область, на которой можно рисовать. КОнтролы - это клаво/мышь.
На окне можно рисовать.
Контролы можно "опрашивать" ожидая изменения состояния. (Точнее, опрашываются не контролы, опрашивается сервер, на наличие изменений, сам "тип" контролы обозначат состояние клавиатуры и мыши, т.е. в нём содержится массив по всем кнопкам и об их состоянии). Тут таже есть макросы типо "нажата ли кнопка".
Зачем эта херота нужна? Очевидно, чтобы инкапсулировать ввод. Теперь достаточно переписать этот модуль под винду, а обёртки функций останётся те же. То есть переписав этот модуль, вся ебучая программа портируется на Windows одним кликом!!! Все остальные модули не используют xlib, они используют только обёртки из этой функции, чтобы быть платформо-независимыми.
- GRAPHIC/algebra.с - тут даже никакого паттерна нет. Это просто чисто немного математических функций. Тут, конечно описан тип "вектор", который представляет собой массив из трёх чисел. Также описаны векторные операции, типо скалярное произведение, векторное произведение. Под вектором подразумевается только трёхмерный вектор. Двухмерных веторов у меня нет, посчитал их бесполезными. Собственно, этот модуль также можно использовать отдельно, он ни с чем не связан. Можно просто взять и начать использовать векторные операции где-то у себя в коде. Также тут реализован Fixed-point типо, т.е. числа с фиксированной точкой. Никакой скорости по сравнению с FPU он не даёт, зато смотри эффект (см скришоты) - типо погрешность, красиво.
II. ЗАВИСИМЫЙ УРОВЕНЬ
- GRAPHIC/wavefront.h - Парсер wavefront obj, 3д моделей. Также, "фабрика", есть тип "3d модель", её можно открыть, удалить, повернуть, передвинуть из неё отдельные точки, распечатать лог о модели, реканкулировать нормали. Для последних функций типо "повернуть" и "реканкултровать нормали" нужны вектора. Поэтому он зависим от модуля algebra.c.
- GRAPHIC/basics.c - тут описаны базовые примитивы для рисования. Как в паскалике на уроке "DrawLine, DrawRectangle". Исключение составляет лишь треугольник, как говорилось, треугольники требуют отработчика. Для тех кто не хочет ебать мозг есть макрос TRIANGLE(w,x1,y1,x2,y2,x3,y3,color) который использует стандартный отработчик default_plot (просто закрасить пикселы указанным цветом, без особенностей).
Данный модуль, к сожалению, зависим от IO/io.h. Ему для вывода необходимы какие-то функции вывода в окно. Я когда только разрабатывал, фантазировал сделать полносью независимый модуль который бы "рисовал ни на чём", а при подкрутке к нему графики рисовал бы графику итд. Но я не додумался как это реализовать и решил просто захардкодить. Кроме того, этот модуль поддерживает fixed-point так что если используются фикседы, то нужно и algebra.c подключеить. Впрочем, по-умолчанию тут на флоатах всё.
- GRAPHIC/render3d.c - Ну и финальный модуль, для его работы необходимо очевидно и algebra, и basics и wavefront_obj, да к тому же и tgatool.c в него включён. Собственно, в модуле описаны такие обьекты как "камера", и методы рендера. Сами модели тут не описаны, так как они уже были описаны в wavefront.
Камеру мы можем создать двух типов: перспективная, и ортогональная. Вроде всё очевидно. Схема работы такая: создаём камеру, инициализируем камеру, загружаем 3d модель, загружаем текстуру (при необходимости). И далее "фотографируем" нашу модель при помощи любой из следующих процедур:
RenderWireframe - отрендерить проволочную модель.
RenderZBuffer - отрендерить отдельно значения буфера глубины для данной модели.
RenderShaded - отреднерить плоско-затенённую фигуру
RenderTextured - отрендерить плоско-затенённую фигуру, со следующей текстурой.
RenderGouraud - отрендерить сглаженную по-Гуро обьект с текстурой.
Солнце тут захардкожено, настраивается макросом SUN, который представляет собой вектор. Т.е. чтобы изменить направление солнца - нужно изменить направление этого вектора.
Падающие тени отсутствуют.
РЕФАКТОРИТЕ!! (если хотите. если не хотите - то и пох)
-
А как надо то? Вот я сделал свою игруньку у нее архитектура говно, этот анон сделал либу, у нее ты тоже говоришь архитектура говно, я блять не понимаю как надо тогда.
Я смотрю на код людей и он у них всегда разный, поэтому я вообще не могу понять как надо и как правильно, даже правил общих никаких вывести их этого всего не могу.
Вакансий для джуниоров в текущих реалиях отсутствуют, может косвенно только через UE5
давно протух
Надо ещё переварить что ты написал, спасибо, поизучаем 😃
более того, s1 = s2 это буквально побитовое копирование одной структуры в другую, всего один шаг до побитового сложения

Блять, я обосрался, а ведь действительно...
С другой стороны одно дело байты скопировать, а другое сделать побитовую операцию для каждого числа, тут проблема в восприятии каждого отдельного поля. У компилятора Си и так проблема на уровне сложения безнакового и знакового, ТОЧНЕЕ UB, а тут структура с разными полями
А если сделать побитовую операцию через цикл?
Вот, допустим, известен размер структуры в байтах. Тогда можно взять адрес на объект структуры, привести его к char, а далее брать побайтово и совершать операцию с последующей записью назад.
К примеру:
struct foo{
int a;
long b;
char c;
};
int main()
{
struct foo o1={.a=21;.b=-6;.c=55},o2;
int s=sizeof(struct foo);
char p=(char)&o1;
do
{
s=s-1;
(p+s)=~*(p+s);
}
while(s);
}
звёздочка(p+s)=звёздочка(p+s);
Кривой движок сайта не умеет работать с квадратными скобками и звёздочкой напрямую.
Зная размер структуры можно не побайтово копировать, а по 2, 4, 8 даже, ибо размеры регистров позволяют.
Правда это и компилятор за меня сделает при -O2/-O3/-Ofast, но всё равно.
Я понимаю, что можно и по несколько байт, но для перестраховки я рекомендую сделать так.
Это правда.
Бля ебать в натуре охуенная игрушка анончик. Бля залип прям.
Бля ебать в натуре братишка а можешь мне на Xbox портировать её?? Ни в заподло внатуре.. так хорошо в неё на большой Юм экране подрлбить и джойстиком бы..
А кстати да, ещё. Я видел у тебя в сорцах строки процедурной генерации изображений. RGB (128,0,0)....
Бля ебать внатуре нахуй надо чуть чуть исправить этот файлик. На (126, 2,2). Должно чуть чуть улучшить дизайн
А вот я кстати вник!!
Бля ебать внатуре охуенный код нахуй. Вообще четенький код ебать..
Этож надо додуматься то:
if(flag == YOULOSER)
DrawText(hdc, "--- YOU LOOSER ---", -1, &looser_rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
if(flag == YOUWINER)
DrawText(hdc, "+++ YOU HACKER +++",
Бля ебать внатуре отдушина братишка. Ты талант! Не то шо эти rage и гта 5
А как надо было? Делать 2 функции? Передавать число а не константу? Что не так тут?
Передавать строку в параметр бессмысленно, там онли 2 состояния.
Работа есть, хоть и меньше, чем в популярных направлениях. В основном embedded, от микроконтроллеров до написания драйверов под Linux.
Очень желательна техническая вышка и начальные знания в схемотехнике, иначе выкатываться, наверное, смысла нет.

1920x1080, 1:40
>Походу легче будет с нуля написать
Удалось выделить пару часов и насрать.
https://vcs.v0idh4nd.xyz/v0idh4nd/sw1nek23per
работы мало кому то в жизни?
ты хоть бы на хх зашёл. В России с++ цветёт и пахнет, никогда не было столько вакансий.
Там же если вбить просто "с" то блядь все подряд находится.
>а как в хх искать вакансии на С?
Пишешь блять "embedded разработчик", "программист микроконтроллеров", "freertos", "программист встраиваемых систем". Очевидно же, что С-программисты нигде больше не нужны, кроме как программировать RTOS/микроконтроллеры.
Никаких перспектив. Для джунов вакансий нет, без опыта работы нет, только через связи.
Чем полезен? Более углубленной понимание устройства программы, работа с памятью, с АПИ вызовами ОСи, но если ты человек не глупый, то изучая любой язык это поймёшь.
Ну в принципе выше написал что требуют: контроллеры, робототехника, драйверы, ембедед, в принципе много возможностей. Забыл добавить что риск и арм архитектуры нужно понимать немного, само железо.
>зачем учить С и какие перспективы будут?
C это "лингва франка". Перспективы стать программистом на любом языке будут.
Чтоб вкатиться в дивный мир байтоебства и ощутить анальное единение с духом машины.
это интересно.
>зачем учить С
Многим это не надо. Если ты студент по-настоящему технического направления(та же радиофизика, где вам надо программировать контроллеры) или собираешься в системное программирование или программирование драйверов, то нужны C++/C+алгосы+ассемблер. Если ты собираешься в фронтенд/бекенд, то достаточно js+php(может с натяжкой питон[сейчас иногда бек на нем желают]) и sql + умение работать с open server или чем-то иным заранее готовым и многим известным для разворачивания сервера.
>какие перспективы будут?
Зависит от тебя + ситуации на рынке. Но ситуация на рынке сейчас не очень радостная: питонистов и js'ников очень много, а C/C++ требует реального опыта работы со сложными вещами, куда новичков не берут.
>C/C++ требует реального опыта работы со сложными вещами, куда новичков не берут.
Значит сикресты не требуются. Если бы требовались, брали бы без опыта и учили. Ведь даже дебилу ясно, что опыт не появится без работа, сначала работа и только потом опыт. Нельзя отказывать в работе требуя опыта наперед, это деление на ноль, фатальная ошибка C/C++.
Это тебе очевидно, а кабан хочет все и сразу. Особо упоротые готовы год ждать принца и проебывать бабло на всякие рекрутинговые агенства, вместо того, чтобы за этот год обучить человека под себя.
>готовы ждать принца
Это и есть не требуется. Если бы требовалось, не могли бы ждать. Когда не нужно, можно ждать сколько угодно кого угодно, манны небесной, всё равно похуй найдется или нет.
>кабан хочет всего и сразу
Смотри выше, ты сам себе противоречишь. Если бы хотели, да еще и сразу, брали бы на работу сразу. Не нужно, вот и не берут.
В таких местах есть Вася, который тащит всю разработку. Кряхтит, пердит, жалуется, но тащит. Вроде как и надо найти второго разработчика в помощь Васе, а вроде как пока и так сойдет. Если Вася таки психанет и уволится, будет ОЙ ВСЕ, но пока еще Вася терпит и въебывает.
>>408611
Я думаю то что неподходят вкатуны, как минимум теорию знать, желательно глубоко, и ряд программ чтоб мог написать – буквально работа с массивами, сортировки и функции, ну и очевидно знание радиоэлектроники, схемотехники. Так же видимо основы электротехники.
Других причин почему не берут я не знаю, работал в сторону АСУТП там в электро службу берут кого попало, а оттуда перекатить в АСУТП и работать с низким уровнем реально, но там чаще другие языки, редкость чтоб на st кто то писал, чаще fbd язык и скада среды и что то типа овенов-ложиков и кодесисов. В принципе если очень хочется можно там себя реализовывать сколько влезет, к тому же сишка универсальная как инструмент по железу
Есть ли в треде работающие на бэке плюсов или чистого Си? Вот условно вам через протоколы самописные пришёл пакет с заголовком в виде структуры, каким образом бы парсите данные из заголовка, чтобы их нормально интерпретировать, ибо судя по всему это вещь и от платформы зависит, и от компилятора, который код и оптимизировал.
Чел ну ты подумай. Ты знаешь размер чего то. Структуры своей. Все, большего не надо.
Я знаю содержимое структуру, но не факт, что знаю размер структуры, его только компилятор знает точно.
Да вопрос скорее как парсить данные, ибо пустые байты могут в рандомных местах оказаться по сути между полями.
Ну, условно так, если бы я не знал об оптимизации комплиятором, то я бы думал, что размер структуры 13байт и пытался бы парсить байты совсем иначе.
Окей, лежит бинарник, в который побайтово хранятся N структур, как правильно интерпритировать их, если мне неизвестно, что на той стороне не использовали макросы, которые отменяют упаковку компилятором данных?
Аргумент про то, что размер файл делиться без остатка на число N * sizeof(struct sample) можно рассмотреть конечно, но может там в конце данные остаточные о предназначении которых нам неизвестно.
>>409395
Размеры полей компилятор не меняет. Но каждое поле выравнивается в памяти на размер этого поля. Т.е. int16_t на 2 байта, int32_t на 4 байта и т.д. Между полями, если это нужно для выравнивания, компилятор оставляет дырки. В конце структуры, если нужно, компилятор тоже добавляет дырок до границы слова.
Размер структуры можно узнать с помощью sizeof.
#include <stdio.h>
#include <stdint.h>
struct
{
int8_t val1;
int16_t val2;
int32_t val3;
int8_t val4;
} my_struct;
int main()
{
printf("%li\n",sizeof(my_struct));
return 0;
}
Для 32-х систем размер структуры будет равен 12 байт (для 64-х битных может добавит ещё дырок до 64-х битного слова, точно не знаю.).
Эта структура будет располагаться в памяти так (дырки обозначаю нулями):
val1 0 val2 val3 val4 0 0 0
Никакого рандома в размещении дырок нет.
Можно сказать компилятору, чтобы он не оставлял дырок в структуре, для каждого компилятора это делается по разному. Для gcc используй __attribute__((__packed__))
Естественно, тогда снизится скорость работы со структурой и нельзя будет использовать указатели на поля структуры, т.к. они не будут выровнены на размер поля.
>>409395
Размеры полей компилятор не меняет. Но каждое поле выравнивается в памяти на размер этого поля. Т.е. int16_t на 2 байта, int32_t на 4 байта и т.д. Между полями, если это нужно для выравнивания, компилятор оставляет дырки. В конце структуры, если нужно, компилятор тоже добавляет дырок до границы слова.
Размер структуры можно узнать с помощью sizeof.
#include <stdio.h>
#include <stdint.h>
struct
{
int8_t val1;
int16_t val2;
int32_t val3;
int8_t val4;
} my_struct;
int main()
{
printf("%li\n",sizeof(my_struct));
return 0;
}
Для 32-х систем размер структуры будет равен 12 байт (для 64-х битных может добавит ещё дырок до 64-х битного слова, точно не знаю.).
Эта структура будет располагаться в памяти так (дырки обозначаю нулями):
val1 0 val2 val3 val4 0 0 0
Никакого рандома в размещении дырок нет.
Можно сказать компилятору, чтобы он не оставлял дырок в структуре, для каждого компилятора это делается по разному. Для gcc используй __attribute__((__packed__))
Естественно, тогда снизится скорость работы со структурой и нельзя будет использовать указатели на поля структуры, т.к. они не будут выровнены на размер поля.
>как правильно интерпритировать
А их тебе не нужно интерпретировать, кто хранит, тот знает в чем они
Я предположил, что ставится, что по памяти было удобно перемещаться по числам кратным двум, но если в структуре будет 3 байтовых поля, то он оставит без оптимизации. Сложно и не понятно.
Первый скрин это структура с упаковкой от компилятора, а второй без упаковки от компилятора.
Каждое поле выравнивается в памяти на размер этого поля, а не на двойку. Начало структуры выравнивается минимум на размер слова.
В моей структуре val1 хранится в 0 байте структуре.
val2 занимает 2 байта, значит его нужно выровнять на 2. В 1 байт ставим дырку, байты 2 и 3 занимает val2.
val3 нужно выровнять на 4. Как раз следующий свободный байт в структуре - 4, записываем в байты 4,5,6,7 val3.
val4 выравнивать не нужно, т.к. он занимает 1 байт, записываем его в байт 8 (в данном случае совпадение, что val4 выровнен на 8).
Теперь занято 9 байт. Выравниваем размер структуры до размера слова добавлением 3-х дырок.
Слово, которое в информатике "word" 2 байтовое? Или максимальная длина машинного слово в архитектуре, которое от разрядности ОСи зависит?
Я всё равно не понял как дырки ставятся, простите, больше объяснять не надо, сам буду читать, не хочу тратить время твоё.

Всё сошлось, это хорошо, спасибо автору статьи...
Я так понимаю на разных системах они разного размера?
В статье написано, что у типа long размер 8 байт, хотя на 32-х разрядной системе его размер 4 байта.
Вообще размеры сишных типов char, short, int, long зависят от архитектуры машины, поэтому лучше используй зазвания типов например int64_t вместо long, чтобы всегда знать размер независимо от архитектуры машины.
Если твоя программа передаёт структуру в сеть, то передавай структуру с упаковкой, чтобы избежать дырок.
В документации к твоему протоколу не привязывайся конкретно к структурам на C. Просто опиши какие данные в каком порядке идут и порядок байт (little endian или big endian).
На другом конце твои данные может принимать программа на Python/Java/Go/C# и т.д. Пусть её автор сам думает, как он будет хранить твои данные.
Например, вот описание одного из стандартов NAND-флэша https://onfi.org/files/onfi_2_0_gold.pdf
На стр.94 в разделе 5.6.1. там таблица с описанием данных, которые нам передаёт чип памяти. Есть указание, что порядок байтов - little endian (там панисано For parameters that span multiple bytes, the
least significant byte of the parameter corresponds to the first byte.)
Делаешь такую же таблицу для своего протокола.
Для чтения данных делаешь упакованную структуру по таблице, неиспользуемые поля заполняешь массивами. Например, в таблице написано, что байты 10-31 не используются, в структуре в этом месте пишешь uint8_t unused[22];
Аноны, а можно ли в WINAPI получить привелегии отладчика для всех процессов? Чтобы например я мог делать (point + любое число) и прыгать в память чужих программ, брать и менять там данные? Или хотя бы запрашивать подобное к одному процессу? Ведь artmoney как то это делает.
У мсвц лонг тоже 4 лол.
Ты еще букварь не осилил а уже претензии строчишь. В любом учебнике есть главы про виды памяти и типы данных. В сишке массивы и строки реализованы как указатель на участок памяти. Во-вторых динамическая память доступна через указатель, не все можно запихать на стек он резиновый тольк до какого-то предела. В линупсе можешь посмотреть ulimit -s в килобайтах
Очевидный шаринг ресурса без копирования.
Ну и способ передачи данных в функцию без копирования. Тоже начальная концепция обязательная к изучению.
Ага, только вместо записи значения переменной в стэк будет записан адрес переменной, что не особо выиграет по памяти, только для структур разве что, размер которых превышает размер регистров.
Я понимаю, что передавая адрес переменной мы может изменить её значение вне области определения и видимости этой переменной.
Я пользуюсь либой box2d (физический движок на с++). Долго была версия 2. Там обычно настройки для тел, фикстур создаются на стеке в виде структур, а потом указатель на них передается в функцию конструктор этих самых объектов. Автор обещал что все перепишет на современный с++. Недавно вышла версия 3. Автор переписал на чистый СИ. И там таже самая хуйня.
Тейк в том что это очень популярный физ движек для 2д и автор шарит за оптимизацию, так как это критично для физ движка
у тебя фотка весит 10мб ты хочешь в ней поменять несколько пикселей, размер стека винды 1мб. Что будешь делать?
ssize_t read(int fd, void buf[.count], size_t count);
берешь и считываешь в свой буффер который на стеке лежит.
Ага, только вот копия файла с диска в RAM загружена, а куда данные для обработки будешь записывать уже выбор программиста.
Почему он не прав?
А если
char line[10000000];
scanf("%s ", line);
./myprog < image.tiff
Будет мгновенный сегфолт из-за нехватки стека как раз для хранения массива
Куда там файл системой загружен к твоей программе не имеет отношения. Вопрос же был в том нахуя мне указатели если есть стек
Без указателей не напишешь функцию, которая меняет значения аргументов. scanf как пример.
не нужны, мы за чистый СИ без указателей и прочей чепухи!!!
Си это машинный язык. Машина (компьютер) работает на указателях, поэтому в Си указатели, их не может не быть, они не могут быть не нужны.
А "что-то другое" в Си может быть или не быть, не важно, это уже высокоуровневые абстракции реализованные всё равно на указателях.
Представь что ты хочешь создать программу, куда ты можешь записывать все испробованные тобою модели дилдаков. У тебя есть простейший текстовый файл-база данных. Ты запускаешь программу, открывается консольку, ты вводишь что-то вроде add dragondildo, и когда закрываешь программу это всё сейвится. Ты хочешь добавить функциональность, поиск по названию, сортировку, выставлять оценку. Для этого тебе придется все дилдаки скопировать в оперативную память, а не работать с файлом.
Ты не знаешь заранее, сколько у тебя дилдаков будет испробвованно. Можешь создавать при запуске программы массив из 100 позиций. Но может случитсья, что он закончится спустя пару мес, или будет пустовать первое время. Ты зря выделил память, или её не хватает. Придется переписывать программу. Так вот динам. переменные(и след указатели) нужны, например, чтобы выделить памяти ровно столько, сколько нужно.
>>410097
Не знаю как в С, но в ++ и Паскале можно легко передавать по ссылке и без знания, что такое указатель.
Тред про Си
@
Вопроси по Си
@
Не знаю как в Си, но вот в паскале..
Чел а в 1С вообще только по ссылке можо и больше никак. Только причем тут ЭТОТ тред

https://pastebin.com/Sskf5hLh
Вопрос назрел
Значица есть у PS3-4, свой формат библиотек sprx видо изменённый .elf, может у кого завалялся загрузчик .sprx
Или можете дать совет как работать с .elf и их загрузкой в связке с .bin файлами
Анончик, а это разве не слишком узкоспециализированный вопрос? Я бы такое искал на сайтах типо 4pda или подобных.
Как Раст может быстрее Си работать, если он постулирует себя как безопасный язык, а значит там постоянные проверка на выход за границы памяти?
>растишка быстрее работает.
Если только в больных фантазиях чулочников.
https://habr.com/ru/companies/astralinux/articles/891064/
>В связи с разницей в числе итераций был проведен тест с 2 048 итерациями для алгоритма на RUST (изменено значение переменной с перекомпиляцией в новые пакеты).
Результат: PBKDF2_SHA256 (на C) кратно быстрее, чем PBKDF2-SHA256 (на RUST)
Чтобы раст был быстрее Си по классике жанра растотестов нужно:
1) Переписать приложение с учетом старого опыта и использованием более оптимальных алгоритмов
2)Выбросить большую часть функциональности
3) Использовать инструкции, привязанные к конкретному тестовому стенду
4) Собирать сишный код в с -O0
5) Получить прирост в 20% перфа
Как раст может быстрее си работать, если, насколько я понимаю, раст использует llvm и только промежуточный код генерит. Оптимизации под архитектуру это не забота разработчиков раста, потому что оптимизации делает llvm из промежуточного кода. Потому что все распутывания циклов и прочее после промежуточной фазы генерации делается. Надо тода сравнивать сишку clang и руст, а не вообще сишку и руст. В чем я ошибаюсь?
мимо
>>411188
>>411185
Rust против C: библиотека zlib-rs демонстрирует 13% прирост производительности
Подробнее: https://www.securitylab.ru/news/557393.php
>3411194
И? А на сишке либу переписали или со старым говном сравнивается? Может дело в алгосах?
почитал там почему-то в качесте улучшений флаги для llvm приводятся, а не что использовано из раста для улучшения
Т .е из этого нельзя сказать что раст в общем сулчае быстрее сишки. Просто пререписали код для zlib на расте, провели работу над оптимизацией и получили лучший результат. Они так же могли переписать либу на Си, оптимизировать и с компилить на сланге.
То есть они настроили компилятор под конкретную задачу и говорят, что Раст лучше Си?
зачем мне учить С если я знаю С++?
Думаю да, но там скинули документацию слитую в 2017 , просто думаю там мало про это люди знают, именно устройство .elf и тп
Поэтому ту решил спросить
А ты чем занимаешь и что хочешь сделать? Расскажи, мб заинтересуемся и поможем, если сможем.
Ник в дискорде Daydreamer
Гит репа чего?
Зачем а главное для кого
https://github.com/GeekTripZ/KnackLaunch
Ps 11 firmware sys_module decrypt
https://www.mediafire.com/file/ordkeg7b27w62rb/11.00_sys_modules.zip/file#
https://archive.org/details/PS4SDK
PS4 4.50 offline sdk
Я писал ответ, но мне стало хуёво, я хочу умереть, я заебал свою семью, я заебал сам себя, я ненавижу себя, я проебал свою жизнь, я устал от самого себя, я хочу отстраниться от себя, я не хочу видеть себя в зеркале, я не хочу иметь хоть что-либо общее с собой. Так больше жить нельзя.

Крепись.
Надо или свой набор функций для работы с тегами и js писать, или брать готовые варианты.
Есть ещё вариант запускать отдельным процессом движок js и движок для работы с тегами и посредством семафоров взаимодействовать, но это тоже, по сути, готовый вариант.
Я думаю, тут надо будет совмещать C и ассемблер.
Сам ни разу чистый C(без системы) никогда не запускал, но вот nasm в qemu пробовал.
Допускаю, где-то финты ушами для чистого си уже проделаны(ведь целый linux и подобные ядра написаны на си), но мне такое не известно.
>почему на голом C не получится?
Для работы с вводом-выводом ядру(ос) надо использовать прерывания биоса, а в си такого я никогда не видел, кроме случая, когда такое делалось через взаимодействие с ядром.
Через Си нельзя сделать прямое управление железкой без асмы. Даже элементарная инициация системного таймера. Или передача управления от загрущика к ядру.
У АРМ и 86 разные алгоритмы по работе с памятью и дял каждого своя ебля с регистрами и флагами. Такое только через ассемблер можно.
Я хотел бы стать Си разработчиком, куда двигаться новичку? Учить ассемблер? Прошу тебя, помоги мне, пожалуйста!
на самом деле я сам не профессионал. затрудняюсь тебе ответить. могу посоветовать классный курс на stepik. вроде бы о нем уже здесь говорили.
https://stepik.org/course/193691
Электроника и линукс.
пердуино

Подрочи препроцессор.
На скрине все отлично, что значит элегантно? Засунуть все в один дефайн в одну строку что бы получилась нечитаемая хуйня?
Можешь запихнуть эти данные в структуру и передать указатель на структуру в функцию, можешь создать "указатель на область в пямати в стэке" ака статический массив и передевать его, всё что ты захочешь.
Так вот, если кто хочет присоединиться на энтузиазме, может создадим группу где нибудь?
ну ладно, выглядит странно, наверно лучше тупо копировать все переменные
1. Использовать эмуляцию ФС
2. Использовать библиотеки от пс4 СДК .prx, .sprx и тп
Как мне рассказывал 1 из разрабов psOff , их эмуль эмулирует(сори за тавтологию) ФС и всё то что я перечислил
https://pastebin.com/hNU2Gz5X
заработало! осталось теперь только отрендерить это на дисплей и я стану успешным человеком!!!
У меня есть на руках документация (которую сливали в 2к17) от SDK
Там немного расписано что за что отвечает
Но про ФС там инфы 0
Но нейросети творят чудеса
QWEN (https://chat.qwen.ai/s/6899f427-9214-4838-ac14-8b2d07502414) (я не просто инженер так что не обсудьте) рассказал что за что отвечает
(Не факт что правильно)
Осталось эту кучу информации собрать
И начать писать
+ собрать всё .sprx и .self файлы
Потом с помощью scetool декриптнуть
И работать с этим набором
вкатывайся в гейдев через raylib, потом меня констультировать будешь
Сегодня узнал, что в gnu c есть вот такой финт:
int a=({int a=6,b=76; a=a^b; a;});
Я понимаю, что для многих тут это открытием не будет, но для меня это было чем-то очень-очень новым в области си.
Собственно теперь вопрос: а есть ли книга по си, где подобные финты все собраны?
Ого, я тоже не знал, аж пришлось к ГПТ обратиться:
"Хорошо, пользователь попросил объяснить строчку кода на Си: int a=({int a=6,b=76; a=a^b; a;});. Начну с разбора каждой части этой строки.
Сначала вижу, что объявляется переменная a типа int и инициализируется выражением в фигурных скобках. Такая конструкция похожа на составной литерал или блок внутри выражения. Но в стандартном Си так нельзя, фигурные скобки обычно используются для составных операторов, а не выражений. Возможно, это расширение компилятора, например, GCC, которое позволяет использовать блочные выражения в круглых скобках.
Проверю: в GCC есть расширение, называемое "statement expressions", где можно использовать блок кода внутри ({ ... }), и результатом будет значение последнего выражения в блоке. То есть ({ ...; выражение; }) вернёт значение этого выражения. Значит, здесь используется это расширение.
Теперь внутри блока: int a=6, b=76; a = a ^ b; a;. Создаются две переменные a и b с значениями 6 и 76. Затем a присваивается результат операции XOR между исходным a (6) и b (76). Потом возвращается значение a. Внешняя переменная a инициализируется этим результатом."
Код походу не очень переносимый, скомпилирует ли это clang условный, да и в целом трудночитаемый, если честно.
А по теме — от себя могу посоветовать только подобную сайт-статью https://graphics.stanford.edu/~seander/bithacks.html
А вообще вся эта хрень буквально синтаксический сахар и буквально стараюсь писать на стандарте с89. Да, даже без цикла for, а заменяю так. Если в c99 пишут так:
for (int i = 0; i < N; i++);
То я пишу так:
{
int i = 0;
while (i < N ) {
...
i++;
}
}
Уже привык, да я знаю, что я долбаёб.

Попытался на 89 что-нибудь подобное написать и только такое придумал.
Вот тебе ответ гопоты, товарищ, я бы больше хотел помочь, но не могу...
1. Для понимания языка Си и его "тёмных уголков"
"Expert C Programming: Deep C Secrets"
Питер ван дер Линден
— Идеальна для тех, кто уже знает основы.
— Объясняет тонкости языка, включая неочевидное поведение компиляторов, указатели, стек, макросы и особенности оптимизации.
— Разбирает примеры, близкие к вашему вопросу (например, затенение переменных и работу с памятью).
"C Traps and Pitfalls"
Эндрю Кёниг
— Короткая, но ёмкая книга о подводных камнях Си.
— Описывает ошибки, связанные с областями видимости, приоритетом операторов и неявным поведением компиляторов.
2. О компиляторах и низкоуровневых особенностях
"The Definitive Guide to GCC"
Уильям фон Хаген
— Практическое руководство по GCC.
— Подробно разбирает флаги оптимизации, расширения компилятора (включая вложенные функции и statement expressions), а также работу с ассемблерными вставками.
"Compilers: Principles, Techniques, and Tools" (Книга дракона)
Альфред Ахо, Моника Лам и др.
— Классика о теории компиляторов.
— Полезна, если хотите понять, как компиляторы обрабатывают код, включая анализ областей видимости и оптимизации.
3. Продвинутое программирование на Си
"Advanced Programming in the UNIX Environment"
Ричард Стивенс
— Хотя книга фокусируется на системном программировании, она затрагивает тесное взаимодействие с компиляторами, особенности линковки и работы с памятью.
"C Interfaces and Implementations"
Дэвид Хэнсон
— Учит писать переносимый и эффективный код, используя продвинутые техники (например, макросы и inline-функции).
— Показывает, как обходить ограничения стандартного Си с помощью компиляторных расширений.
4. Онлайн-ресурсы
Официальная документация GCC:
GCC Manual
— Самый авторитетный источник по расширениям GCC, включая ({ ... }), атрибуты функций, встроенные инструкции.
"What Every Programmer Should Know About C" (Блоги и статьи):
Например, Блог Эли Бендерски — множество статей о тонкостях Си и компиляторов.
5. Для углубления в оптимизацию
"Write Great Code: Understanding the Machine"
Рэндал Хайд
— Объясняет, как код преобразуется в машинные инструкции.
— Полезна для понимания, как компиляторы оптимизируют код и какие расширения они используют.
Вот тебе ответ гопоты, товарищ, я бы больше хотел помочь, но не могу...
1. Для понимания языка Си и его "тёмных уголков"
"Expert C Programming: Deep C Secrets"
Питер ван дер Линден
— Идеальна для тех, кто уже знает основы.
— Объясняет тонкости языка, включая неочевидное поведение компиляторов, указатели, стек, макросы и особенности оптимизации.
— Разбирает примеры, близкие к вашему вопросу (например, затенение переменных и работу с памятью).
"C Traps and Pitfalls"
Эндрю Кёниг
— Короткая, но ёмкая книга о подводных камнях Си.
— Описывает ошибки, связанные с областями видимости, приоритетом операторов и неявным поведением компиляторов.
2. О компиляторах и низкоуровневых особенностях
"The Definitive Guide to GCC"
Уильям фон Хаген
— Практическое руководство по GCC.
— Подробно разбирает флаги оптимизации, расширения компилятора (включая вложенные функции и statement expressions), а также работу с ассемблерными вставками.
"Compilers: Principles, Techniques, and Tools" (Книга дракона)
Альфред Ахо, Моника Лам и др.
— Классика о теории компиляторов.
— Полезна, если хотите понять, как компиляторы обрабатывают код, включая анализ областей видимости и оптимизации.
3. Продвинутое программирование на Си
"Advanced Programming in the UNIX Environment"
Ричард Стивенс
— Хотя книга фокусируется на системном программировании, она затрагивает тесное взаимодействие с компиляторами, особенности линковки и работы с памятью.
"C Interfaces and Implementations"
Дэвид Хэнсон
— Учит писать переносимый и эффективный код, используя продвинутые техники (например, макросы и inline-функции).
— Показывает, как обходить ограничения стандартного Си с помощью компиляторных расширений.
4. Онлайн-ресурсы
Официальная документация GCC:
GCC Manual
— Самый авторитетный источник по расширениям GCC, включая ({ ... }), атрибуты функций, встроенные инструкции.
"What Every Programmer Should Know About C" (Блоги и статьи):
Например, Блог Эли Бендерски — множество статей о тонкостях Си и компиляторов.
5. Для углубления в оптимизацию
"Write Great Code: Understanding the Machine"
Рэндал Хайд
— Объясняет, как код преобразуется в машинные инструкции.
— Полезна для понимания, как компиляторы оптимизируют код и какие расширения они используют.
Конкретно для этой хуйни - да.
А так - нет, конечно, условно, если бы с массивом работал, то пропустил бы (первый)нулевой элемент.
Нет.
а что это за занчок между A и B? Это возведение в степень? В си же вроде этого нет.
Это XOR