Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
>>1711268 (OP) Я один не использую все эти typedef, #define и прочие операторы которые просто присваивают псевдонимы типам и константам?
Не думаю что эти функции особо нужны в ЯП. Поясните, пожалуйста, прав ли я или нет. Если нет то какое практическое преминение может быть этим typedef и define
>>1711439 > Если нет то какое практическое преминение может быть этим typedef Вот будешь передавать в функцию указатель на колбек, принимающий и возвращающий указатели, и особенно указатели на массивы - поймешь. Нет, ты, возможно, даже напишешь это правильно с первого раза, но вот читать этот код когда-нибудь потом будет сложно даже тебе самому. Алсо, тайпдефы позволяют абстрагироваться от особенностей системы (например, размера unsigned long), позволяют документировать код, не используя комментарии (unsigned int color vs. rgba color в аргументах), позволяют избавиться от блядского struct.
> define Это единственный в Си нормальный способ объявления констант, это условная компиляция, это возможность гарантированного инлайна простого кода (inline может игнорироваться, всяческие forceinline - нестандартые), и это кодогенерация, когда ты хочешь что-то типа: typedef void init_func(int arg); typedef struct { init_func ∗callback, const char ∗name } initializer; initializer initializers[] = { #define ITEM(name) {.callback = name##_init, .name = #name}, ITEM(foo), ITEM(bar), ITEM(baz), #undef ITEM };
День добрый, подскажите скрин изкниги П. Дейтел, Х.Дейтел - С для программистов с введением в С11 - 2016 , первый выделенный printf работет нормально, второй вместо подчеркиваний цифры какие то печатал. пока я d на s не поменял и звёздочку не убрал. puts просто ошибку выдавало в С-free 5.0. Причем код в книжке и в исходниках одинаковый. Это опечатки или проблема в С-free + mingw5&
>>1712935 Это опечатки. Везде должно быть printf, c %s ты все правильно сделал, хотя смысл этих конструкций от меня ускользает, делать printf("%s", "строка") совершенно незачем. Это вся книга такая?
Здравствуй, анон. Мучаюсь с макросами и _Generic в c11 в попытках написать небольшую библиотеку с типа-шаблонами и типа-перегрузкой функций.
Очень интересны следующие вопросы: 1) Есть ли способ по заданному целочисленному типу T получить соответствующий беззнаковый тип UT (например, по int32_t получить uint32_t, а по uint32_t - тоже uint32_t)? Иначе говоря, пытаюсь запилить что-то в духе __UNSIGNED(T) var; которое после обработки будет UT var;
2) Есть ли хотя бы просто способ проверить, что некий T является беззнаковым?
3) В дополнение ко (2): если известны все беззнаковые типы, которые потенциально могут использоваться, можно ли решить данный вопрос без нагромождений #if в каждом месте, где требуется определить знаковость?
>>1713717 Правильно делают. Нормальный человек понимает что пишет, опечатки наоборот помогают учить язык. А дауны макаки бездумно перепечатывают, а потом ноют "пачиму ниработаит".
Допустим у нас объявлена структура и мы создали эту структуру в какой-то функции, вопрос: нужно ли использовать free() или она удалится из памяти по завершению функции?
>>1716721 > нужно ли использовать free() или она удалится из памяти по завершению функции? Нет, такие переменные называются автоматическими, и они автоматически перестают существовать при выходе из функции. Но проще всего думать по-другому: если ты сам что-то выделил или открыл (с помощью malloc или там fopen), то ты сам и должен вызвать очистку. Тут ты никаких malloc не вызывал, поэтому и free сделать не можешь.
>>1721857 arm убьёт x86, можете скринить. А потом будет RISC-V. Никому нафиг не нужен в будущем громоздкий x86, который уже невозможно допиливать, да и бум мобилок ускоряет заколачивание гроба.
Никак не влияет - 90% мобильного софта тонкие клиенты, а 90% успешных мобильных игорей - донатное дрочево без графона.
В то время как бэкенд по прежнему крутится на могучих х86 зивонах и никаким немощным рукам их там не потеснить - когда доходит до дела - нужна честная моща пер коре а не кукуруза с многоядерным потанцевалом и проблемой рожающих бабищ в 99% реальных задач.
> Никому нафиг не нужен в будущем громоздкий x86, который уже невозможно допиливать
Еще во времена мотороллы 68000 изобрели такую штуку как микрокод.
х86 ассемблер может быть сколь угодно громоздким - микроархитектурка решает и ставит рекорды производительности на ядро.
Дошло до того что зеоны ебут уже который год считавшихся непобедимыми динозавров от IBM (POWER и Z).
Пацаны, че за хуйня. Работаю над кодом вместе с libusb.
Там есть функция set_control и set_debug. Последняя немного устарела и поэтому используется первая.
Чувак жалуется, что в моей программе implicit declaration of function ‘libusb_set_option’ (первый пик). Как блять так, версия либы у нас одна, одна система и причем у меня это работает (второй пик)
>>1722014 Новые армы в бенчах уже показывают сравнимый с интелами результат: https://www.macrumors.com/guide/arm-macs/ - и это при в разы меньшем tdp. У интелов же - родовая травма в виде сложного декодера и малого числа именованных регистров, из-за чего им крайне сложно повышать число инструкций на такт. Ты забыл, так я напомню - во времена Haswell интелы росли в однопотоке на 3-5% на поколение. И мы сейчас вполне можем вернуться в это страшное время.
>>1722062 >2020 >хвалить обоссанную ноусофт консоль Я уже молчу, каким отбитым имбецилом надо быть, чтобы не видеть разницы игрушки от компьютера с набором софта за 40 лет. Ах да, это же пердоля с таким же ноусофтом и пердольными игрушками. Вот откуда рак и деградация лезет, из этого отстойника скама человеческого.
>Никак не влияет - 90% мобильного софта тонкие клиенты, а 90% успешных мобильных игорей - донатное дрочево без графона...
Ну а теперь сравни гешефт с продажи одного условного сервака для бекенда и десятков тысяч мобильников, которые этот сервак будут использовать. Сравни число произведённых процов каждой архитектуры для данного наборчика и осознай, что в недалёком будущем камни на x86 будут производить 1.5 фабрики на весь мир. А за количественными переменами последуют и качественные.
>Еще во времена мотороллы 68000 изобрели такую штуку как микрокод. Ага, что вкупе с обратной совместимостью, а также всякими непрозрачными архитектурными перделками превратило типичный проц от, допустим, интела в никому не понятный ОГРОМНЫЙ чёрный ящик с кучей бекдоров, какими-то встроенными микро-ос и прочим хламом. А агрессивные попытки все это заставить быстрее работать оборачиваются очередными уязвимостями.
>>1722096 Ну да, ну да - смартфон нинужон, дубль два. Конец уже сейчас предсказуем - нынешний айпад про станет новым форматом железа, и у жужжащих ящиков пропадет ещё половина рынка. Потом вендоры АРМ и ПОСов подтянутся и интелов станет ещё меньше. Слона съесть несложно, ежели по частям.
>>1722096 >с набором софта за 40 лет Какой, нахуй, софт за 40 лет? Сейчас уже 95% реально используемого людьми софта либо open-source, либо скомпилировано под кучу других платформ, помимо windows+x86. Хоть на чайнике запускай.
>>1722107 >Какой, нахуй, софт за 40 лет? Вот двачую. Игорей конца 90 уже хер где запустишь, разве что в эмуляторе, что съедает хваленую производительность хуй86.
Нужен кто-то, кто мог бы решить ряд задач из университетского курса. Процессы, нити. С деньгами постараюсь не обидеть, обсудим. Если кого-то заинтересовало - пишите в тележку @twoomer
>>1724521 Движок игры Дум (1993 год) напиан на Си, например. А так - писать сложную игру на Си со сложной графикой - это как пытаться съесть кита чайной ложкой. С++ - идеальный варик для ГЕЙдева.
>>1724521 Луа, гну сциентифик лайбрари. Первое это полноценный язык, занимающий всего пару тысяч строк кода. Второе образец того, как должна была выглядеть лаба1.с - реализация различных математических алгоритмов типа оптимизации, линейкит итд.
>>1724521 >Помогите найти простые примеры программ и игр на си
>>1724593 >Движок игры Дум (1993 год) напиан на Си, например. >>1724618 >Луа, гну сциентифик лайбрари. Вы нормальные? Он же просил простые игры, ПРОСТЫЕ!
>>1724653 все равно, все это попытка высрать баржу, гораздо более здраво писать такие вещи на С++ (или Сишарпе, смотря какой API хочешь и вообще какие требования к игре)
Нравится Си тем что язык не сложный, небольшой, не нужно изучать постоянно всякие фреймворки как в JS или Java. Вот только сомневаюсь что смогу найти работу. Для системных программистов высокие требования. ВО, а его у меня нет. Большой опыт работы, которого у меня тоже нет. Мало вакансий. Что делать?
>>1724718 Если ВО - не варик, то учи сам + пили личные проекты, офк нетривиальные. Это единственный выход. А вообще - байтослесарям сложно найти работу в странах СНГ. Они больше ценятся забугром, там и embedded software engineer получает не меньше, чем жс-макака. В СНГ, увы, ситуация далеко не такая.
>>1724718 >не нужно изучать 3рд пати хуйню Не нужно только до того момента пока ты тыкаешься в хеловорлды и линкедлисттуториал.с, в реальности же даже в современную микруху ты со знанием голого си не потыкаешься.
>>1724919 >какие-то небольшие либы Это конкретно в примере с бытовой микрухой может оказатсья КАКАЯ-ТО НЕБОЛЬШАЯ ЛИБА. И ты забываешь, что именно монструозность сишных фреймворков в прошлом, — вроде того же опенгла, старых директексов, снящихся в страшных снах людям вин32 и прочего, — стала от части причиной появления менее монструозных фреймворков на более современных языках. То что эту хуйню перестали использовать не значит что этого никогда не было. И не значит что не существует до сих пор поддерживаемых на них продуктов
>>1724933 > старых директексов И давно DirectX, у которого API на COM, стал сишным фреймворком? А вот опенгл нихуя не монструозный, полноценную реализацию OpenGL 1.x с софтварным рендером можно целиком написать в одно рыло, и код, как пользовательский, так и самой либы, будет понятен, в отличие от крестов в том же DirectX.
На самом деле проблема геймдева на Си заключается в менеджменте памяти в основном. Когда большие мальчики обмазываются всякими RAII и автоматическими указателями, когда они даже не знают, сколько раз выделилась память для их строчек, и сколько раз эти строчки при конкатенации скопировались, ты по-прежнему вынужден ебаться с goto cleanup и маллоками на каждый чих. И это слегка демотивирует. Чтобы как-то обойти эту проблему, ты тащишь статические буферы везде, куда сможешь дотянуться, что создает кучу других, еще более веселых проблем.
>>1725210 Да, юзать COM еще туда-сюда из сишки можно. Если MS не забыла для тебя кроме варианта class написать в хедере все эти struct и STDMETHOD, обмазав толстым слоем макросов (посмотри, в заголовках директикса отдельный #ifdef для сишки... пока еще есть или уже нету в последних версиях?). С реализацией своих объектов начинается боль, особенно когда у тебя несколько интерфейсов. Да, их тоже можно на си писать, можно хоть на ассемблере писать, но это будет больно, это будет тонна однотипных реализаций QI/AddRef/Release, которые нельзя объединить, потому что офсеты lpVtbl в структуре у разных интерфейсов разные. При этом на крестах вся эта боль почти целиком уходит. Поэтому COM - крестовый.
>>1725210 > Лично юзал DirectX из сишного кода. Алсо, я забыл добавить. Я вот юзал std::string из сишного кода (на лету генерировал обертки, превращающие __thiscall в __stdcall). Он стал от этого сишным?
>>1711268 (OP) Хочу, чтобы у меня на всех окнах было одинаковое верхнее меню (File, Edit, View, ...), но GTK почему-то не разрешает мне это сделать. Как фиксить?
>>1726773 Закинуть кусок файла после строки в память, удалить строку (и после не забыть fseek выставить на последний байт перед удаленной строкой), записать ранее сохраненный кусок по SEEK_CRT.
>>1726773 Правильный способ от олда: 1. создал временный файл 2. читаешь по символу, считаешь строки, пишешь во временный 3. fflush 4. rename(временный, оригинал)
>>1728937 fgets(указатель на массив, кол-во читаемых символов, stdin) Только он вносит символ перевода строки в строку, а не выкидывает его оттуда. Можешь либо свою функцию написать, либо обёртку для fgets, которая выкидывает символ перевода строки и очищает входной поток.
1) у вскякого арифметического типа (указателя, например) есть будевское значение. Если указатель не нулл, он true. 2) ты не проверяешь ошибки выделения памяти. это хуёво. 3) лучше не использовать strcpy. используй strncpy/ понятно, что это у тебя наверняка лаба1, но не стоит приучаться оставлять такие очевидные уязвимости. 4) ваще, какое-странное решение отмечать конец массива строк пустой строкой. Если он у тебя уже организован как массив указателей на строки, почему бы тебе не сделать просто последний указатль нулом? в твоём текущем коде, напрмер, возникают забавности, если попытаться добавить пустую строку. 5) зачем ты второй раз считаешь количество строк? ты же его уже знаешь.
>>1729115 >Если указатель не нулл, он true. Вроде это ебота от платформы зависит. null не всегда равно 0x00. >2) ты не проверяешь ошибки выделения памяти. это хуёво. Согласен. Но это нахуй никому не нужный привет_мир на две-три сотни лайнов. >3) лучше не использовать strcpy. используй strncpy/ понятно, что это у тебя наверняка лаба1, но не стоит приучаться оставлять такие очевидные уязвимости. Что и в п.2
>4) ваще, какое-странное решение отмечать конец массива строк пустой строкой. Мне так местные посоветовали. >Если он у тебя уже организован как массив указателей на строки, почему бы тебе не сделать просто последний указатль нулом? Хорошая идея, пока лучшая. >в твоём текущем коде, напрмер, возникают забавности, если попытаться добавить пустую строку. Тогда маленький мемори-лик, да. Но строки будут непустыми.
>5) зачем ты второй раз считаешь количество строк? ты же его уже знаешь.
Внезапно для меня realloc() может вернуть указатель с другим значением. Не знаю с чем это связано, но очевидно не с brk(), так как после фиксированной n строки значение указателя меняется(алсо меняются и указатели на строки). Я потому сюда и закинул эту хуиту, уж больно уродливо вышло.
>>1729201 >Вроде это ебота от платформы зависит. null не всегда равно 0x00.
короч, null pointer константа по стандарту - арифметическая константа, имеющая значение 0. или таковая, приведённая к типу (void звёздочка). чёт, я не смог прм точную цитату в стандарте про обратное преобразование лул, но все другие источники говорят, что булевское значение указателя true тогда и только тогда кода он не null pointer. >>1729201 >realloc() может вернуть указатель с другим значением
ну так ты один раз посчитай количество элементов потом прибавь к новому указателю это значение + 1, лол
>>1729201 >Вроде это ебота от платформы зависит. null не всегда равно 0x00. Нет. Это в стандарте языка, здесь от платформы ничего не зависит. if (ptr == NULL) пишут только зеленые касатики, прошаренные бати знают, что первое - говнокод, и кошерно писать if (!ptr)
>>1729273 > я не смог прм точную цитату в стандарте про обратное преобразование лул Его нет. if (expr) по определению делоет if (expr != 0), и !expr тоже преобразуется до expr == 0. Операторы сравнения != и == сами автомагически умеют сравнивать указатель с нулевым указателем такого же типа, каким бы не было представление. И уже у операторов сравнения на выходе инт.
>>1729355 Не говнокод ни разу. Исключительно вопрос выбранного стиля. Явное сравнение лучше читается, плюс некоторые пишут выражения вида if ((ptr = func()) != NULL), в них без != NULL нельзя - будет варнинг. Из этого выражения явное сравнение ради консистентности растекается и на if (ptr != NULL), и на if (ptr == NULL).
>>1729389 >if (expr) по определению делоет if (expr != 0), и !expr тоже преобразуется до expr == 0
по маняопределению. не видел такого в стандарте. там только написано, что арифметические типы имеют булевское значение true если не равны нулю. Указатели же неявно преобразуются к арифметическому типу. Про нулл поинтер сказано, что он - нулевая арифметическая константа или результат её приведения к типу войд звёздочка. Явно про обратное преобразование не сказано.
>>1729355 > if (ptr == NULL) пишут только зеленые Зеленый жир, плиз. Писать надо: if (NULL == expression) потому что expression может быть длинное, функция, и смотреть в конец неудобно и не наглядно, код плохой получается. А когда в начале, сразу видно что и как.
>>1729273 >ну так ты один раз посчитай количество элементов потом прибавь к новому указателю это значение + 1, лол Добра тебе, мелкобуквенный гений. А я просто приучил себя к указателям, как собаку Павлова. >>1729389 >в них без != NULL нельзя - будет варнинг Кстати вспомнил, почему так и начал писать, т.к. раньше тоже !ptr юзал. Энивей какой-нибудь -pedantic варнинг родит.
>>1729503 > по маняопределению. 6.5.3.3 (unary !): The expression !E is equivalent to (0==E). 6.8.4.1 (if statement): In both forms, the first substatement is executed if the expression compares unequal to 0. И никакого bool и true. Их вообще только в C99 притащили.
> Указатели же неявно преобразуются к арифметическому типу. Неявно не преобразуются вообще никогда, по этому поводу вообще варнинг будет в любом вменяемом комментарии. Явно можно, но это зависит от платформы и самого указателя, может быть как implementation defined, так и UB. Поэтому для указателей есть специальный uintptr_t, в который без UB все влезет. А что касается сравнения: 6.5.9 (equality operators != и ==): Two pointers compare equal if and only if both are null pointers, both are pointers to the same object и там много всего еще. Но заметь, никаких преобразований.
>>1729536 > Писать надо: > if (NULL == expression) Толсто.
Не смог нагуглить, как сделать вывод в консоль,чтоб сверху или снизу выводилась строка состояния, а в остальных строках выводились данные из другого потока и чтоб они не перезаписывали строку состояния в идеале чтоб данные прокручивались а строка состояния была на своем месте По сути мне надо чтоб одна строка уменьшила размер консоли и не обновлялась Как это гуглить хотя бы?
2) массив функций, вызов по номеру без свитч-кейс без регистрации
3) реализация опенгл под шинду - там по умолчанию изкаробки только фичи из конца девяностых, за нулевыми и десятыми с их шейдерами нужно добывать как руду у драйвера через указатели на функции..
Привет, анон. Есть какой-то известный быстрый алгоритм для перевода дробной части, записанной в бинарном виде, в строку с десятичной записью? Дробная часть может быть 128 бит, так что, видимо, конвертация в double и печать в строку не катит.
>>1733128 Я как-то из интереса попытался на асме написать функцию вывода числа типа float. Не получилось, конечно, но я подозреваю, что для этого нужно складывать степени пятерки в какой-нибудь int64. То есть: 0,1101 = (1/2) + (1/4) + (1/16) = 0.5 + 0.25 + 0.0625 = (10005 + 1005^2 + 5^4)*10^(-4) По сути, останется только вывести целое число, запятую и еще одно целое число. Естественно, частные случаи типа inf, nan и нуля обрабатывать отдельно
>>1733499 Это да, это понятно, но как это сделать без длинной арифметики (число бит для дробной части у меня большое)?
Я помню, что, например, для перевода из восьмеричной системы в десятичную был довольно элегантный и легковесный алгоритм (в то время как перевод в лоб требовал длинную арифметику для деления и умножения).
>>1733607 Ну, тем не менее, это релевантно для чисел с фиксированной точкой, с которыми я и мучаюсь.
>>1733892 > но как это сделать без длинной арифметики Никак, смирись и пили длинную арифметику. Не так уж это и сложно, можешь в столбик считать, как в школе.
>>1734007 Эх, печаль. Я не спорю, что не сложно, просто для 128 бит это выглядит как оверхед. Ладно, поищу, может, есть ли portable-реализация __int128_t.
Какую книгу можно почитать, новую, по последним стандартам Си? Кернигана и прату читал, но уже прошло много времени, подзабыл ось. Что-то новенького хочется. Подскажите.
>>1734855 Единственный подводный - связанные структуры данных (элементы списков, деревьев), для которых ты не сможешь использовать тип, определяемый тайпдефом, внутри этого тайпдефа: typedef struct { ??? ∗next_node; int value; } linked_list_node; ну ты понял. Потому что этот тип на момент использования еще не существует. А вот у typedef struct foo { ... } foo; или typedef struct foo foo; struct foo {}; подводных нет. Второй вариант более многословный, зато позволяет при необходимости быстро отделить интерфейс от реализации: просто оставляешь тайпдеф как есть в .h, а структуру уносишь в .c, и если у тебя все манипуляции идут через указатель на foo, то пользовательский код никогда не узнает, что там внутри.
>>1735128 Вот скрин консольной таблицы из интернета чтобы анонам понятнее было.
Вот допустим это всё вывод моей программы. И мне нужно только чтобы подчёкнутое красным число 10 изменялось, допустим 9 или 11 12 13. При этом чтобы всё таблица не перевыводилась с нуля. Как это сделать?
Аноны, без шуток, Сишечка может умереть лет через, скажем, 50? Знаю, тупой вопрос, да и мне к тому времени уже будет похуй, но чисто теоретически интересно. Или на ней столько разного софта написано, что легче скинуть очередной Чиксулуб на Землю и выпилить нахер всю цивилизацию, нежели заменить сишечку в системщине? Вроде пытаются высрать новые, модные, молодежные япы вроде раста, которые пытаются и рыбку съесть, и на хуй сесть, и через N лет заменить старичков С/С++, но чёто как-то хз... Ведь софта, написанный на С/С++ вряд ли куда-то денется/будет переписываться.
>>1736782 Проблема с таким далёким будущим — мы даже не можем предсказать, не будет ли через 50 лет ассемблер ниже уровнем чем си, лол.
А вообще, сейчас есть тенденция запихать побольше ядер (т.к. частоты наращивать не получается) и единственное что можно гарантировать — будут востребованы языки хорошо умеющие в мультитрединг. И это явно не си, но и аналоговнет, что называется.
>Ведь софта, написанный на С/С++ вряд ли куда-то денется/будет переписываться. Есть смысл новый писать не на сях если есть аналоги получше (например, если у тебя главная цель — это безопасность, то почему бы и не взять раст), но переписывать работающий софт который всех и так устраивает — это тупость.
>>1736814 >Есть смысл новый писать не на сях Не все так однозначно. Много "безопасных" программ юзают туеву хучу сишных либ. Пример, за котором далеко не надо ходить, Дискорд. Написан на джаваскрипте, гуй - Электрон, но если ты откроешь memory layout процесса - ты увидишь кучу so(в случае с Линуксом)/dll(в случае с виндой), которые написаны на Сях. И там может быть дыра, так что даже такое якобы безопасное приложение уязвимо к атакам на память. Учитывая, что даже в 2к20 продолжают писать на сях, а не только поддерживать тонну легаси, то хз-хз... При моей жизни Си точно не умрёт.
>>1736886 Ну, разница в том, что у тебя вместо 30-ти 0-day CVE будет 15-20, это на самом-то неплохой прогресс как ни крути. А с другой стороны это хорошо так поднимет цены на рынке эксплоитов, хех.
Понятное дело, что они не умрут, на них в конце концов кода куда больше чем на каком нибудь коболе, который все ещё жив спустя 30+ лет умирания, только вот имхо — область точно сузится до переносимого ассемблера. Единственный прогноз, который вообще возможно сделать на эту тему.
>>1736975 А ещё на сях и плюсах написано куча софта, который спокойно можно написать и на чём нибудь другом, приём, вас плохо слышно.
Ядром, кодеками и драйверами всё как бы не ограничивается, всякие юзерлевел хуитки вроде игор, 2/3д редакторов, синтезаторы звуков, либы для гуя и тд итп.
>>1736979 >всякие юзерлевел хуитки вроде игор, 2/3д редакторов, синтезаторы звуков, либы для гуя и тд итп. Это едва ли не половина всего софта, написанного на сях.
>>1736999 Почти все. Я си с плюсами не различаю в этом вопросе, т.к. любой плюсовый геймдев стоит на куче сишных либ от опенгла до всяких физических движков.
Из именно игр — вроде как автор factorio говорил что она на чистом си написана.
>>1736814 Предсказать, что будет через 50 лет, в принципе невозможно. Разве можно было предсказать хоть примерное развитие современного телекома и программирования в 1970 году? Уильям Гейтс со своими 640 кб оперативы и то позже был.
Сейчас тенденции на смены парадигм. Например, развитие супер параллельных процессоров, нейро-процессоров. Пока диковинка, но за 10 лет может стать чем-то обыденным. Изменения в концепциях написание программ, уход в виртуализацию всего и вся, куча всего ещё.
Нет, не думаю, что C/C++ сохранится. Слишком уж динозавр из другого мира.
>>1737195 >Нет, не думаю, что C/C++ сохранится Лол, даже ссаный кобол уже лет 30 умирает, но никак не сдохнет, хотя кода на нем написано в десятки тысяч раз меньше, чем на С/С++
>развитие супер параллельных процессоров, нейро-процессоров И подноготная всей этой параши будет как всегда на С/С++
Скорее джаваскрипт сдохнет в вебе (нет), чем С/С++ в системщине и подноготной всея мира ойти технологий
>>1737223 Кобол уже 30 лет назад сдох, просто где-то до сих под используется древний софт на древних компах или их эмуляторах.
Само собой, сишечка полностью не сдохнет. Хотя бы потому, что ядра ОС и кучи системного софта на ней написаны, которые работают хорошо, исправно, и свои задачи прекрасно выполняют.
Но само программирование может драматически измениться с тем, как поменяются парадигмы программирования.
Тупо сишечка и плюсы плохо предназначены для многопоточного программирования. А эволюция очевидно идёт в направлении супер-многопоточного программирования. Потому что возможности одного ядра давно исчерпаны, по мелочам как-то оптимизируют, зато вот возможностей для увеличения количества ядер очень и очень много. Ничто не мешает в будущем иметь не то, что тысячи, а реально даже миллионы ядер (блядь, кто-нибудь в 70-е годы мог предсказать микро-сд карты на сотни гигабайт за копейки?), но для этого надо принципиально менять парадигмы программирования и платформы.
Это неизбежно произойдёт. Но как именно это будет выглядеть невозможно предсказать.
>>1737196 >На самом деле нет, и после 2010 масса проектов или их частей стартовала на чистом Си без плюсов. Фантазии. Отдельные чудаки могут писать на чем угодно, но стандарт индустрии - с++ и с#.
>>1737294 >Ничто не мешает в будущем иметь не то, что тысячи, а реально даже миллионы ядер Физика мешает, так же как и мешает иметь процессоры на миллионы гигагерц.
>Тупо сишечка и плюсы плохо предназначены для многопоточного программирования. Отлично приспособлены, ничуть не хуже любого другого языка.
>>1736814 >будут востребованы языки хорошо умеющие в мультитрединг. Проблема не только в языках, mpc - это вообще говоря другая область, говоря проще не в языке тут вообще дело. >Есть смысл новый писать не на сях если есть аналоги получше (например, если у тебя главная цель — это безопасность, то почему бы и не взять раст) Раст не даёт той безопастности, о которой ты говоришь и думаешь. >но переписывать работающий софт который всех и так устраивает — это тупость. Всё так, а ещё большая тупость - менять коней на переправе.
>>1737362 >С гигагерцами ПОКА есть проблемы В середине нулевых был достигнут современный уровень, 3.5 GHz, на процессоре пентиум-4. Дальше он не рос, производительность увеличивалась за счёт качества архитектуры, а не тактовой частоты. Зачастую тактовая частота снижалась, а потом заново увеличивалась.
А вот количество транзисторов до сих пор растёт по экспоненте. Усложняли ядра, добавляли кеш-память, добавляют ядра. AMD уже разродился процом на 64 ядра. На видеокартах тысячи примитивных ядер, есть ai-ускорители на тысячи ядер.
Ничто не мешает в принципе сделать и миллион ядер. Пока немного не хватает технологий для этого. Но развитие идёт к тому, чтобы поддерживать массовую параллельность. А от языка требуется, чтобы он нативно удобно поддерживал массовую параллельность, как в гошечке это есть.
>>1711268 (OP) Анон, какой протокол лучше всего заюзать чтобы отправлять бинарные файлы по UART? Мне нужен элементарный flow controi, т.к. апапартной поддержки нет, а софтварный XON/XOFF очевидно не подходит из-за "бинарности" отправляемого файла. Главное требование - поддержка протокола многими существующими утилитами на винде/линуксе если бы не это, то уже давно навасянил бы какое-то кастомное простое говно
>>1737721 >>1737718 Не очень хочется заниматься этой конвертацией говна и уменьшать и так не очень большую максимальную скорость передачи... Но наверное ты прав, тут либо извращаться и пилить свой протокол, либо извращаться и использовать.то, что ты предложил.
>>1737692 >Анон, какой протокол лучше всего заюзать чтобы отправлять бинарные файлы по UART >Главное требование - поддержка протокола многими существующими утилитами на винде/линуксе zmodem
>>1737662 > Ничто не мешает в принципе сделать и миллион ядер А ты видео то смотрел? С увеличением кол-ва ядер увеличивается сложность алгоритмов, затраты на планировку и вообще при таком количестве ядер, все алгоритмы поломаются и просто перестанут работать без должных оптимизаций.
>>1738583 >все алгоритмы поломаются и просто перестанут работать без должных оптимизаций
в треде о том и разговор, что в ситуации, когда рост производительности идёт в многопоточном плане, без роста однопоточной производительности, нужно а) использовать другие алгоритмы б) использовать инструменты, языки и стили программирования которые (лучше) позволяют автоматически параллелизовывать написанное. Ну тип, если функцианальник и часто испольешь мапы в своём коде, его легко автоматически параллелизовать. А если любишь циклы в стиле си - сосёшь дупу на единственном из килоядер.
>>1738613 >Ну тип, если функцианальник и часто испольешь мапы в своём коде, его легко автоматически параллелизовать. А если любишь циклы в стиле си - сосёшь дупу на единственном из килоядер. Звучит правдоподобно.
>>1738613 >Ну тип, если функцианальник и часто испольешь мапы в своём коде То это говно на списках создает кучу cache miss'ов и прочего говна. А если заюзал pragma omp parallel for, то все просто и понятно
>>1738583 В том-то и задача языка, чтобы сделать программирование таких алгоритмов и задач лёгким и непринуждённым.
Си слишком дубовый, слишком явный и низкоуровневый. Иногда это хорошо, для каких-то системных задач, но иногда нет.
Возможности для конкурентности сильно ограничены из-за этого.
В Го отдельный тред-поток исполнения запускается просто оперетором "go", удобные каналы и агрегаторы каналов (селекты). Не нужно думать, что там внутри, не нужно детально прорабатывать схему распараллеливания, не нужно всяких #pragma-костылей. Просто запускается отдельный поток. Ты уже просто думаешь на языке потоков и корутин. В си так просто не получится. И сам язык внутри для таких задач не предназначен.
Если язык не предназначен, то значит разработчик будет максимально избегать подобных подходов.
Это просто один из примеров. Го мне не нравится, но эта концепция явно хорошая и удобная, думаю будет заимствована языками следующего поколения.
Котаны, мне нужно передать в функцию указатель на буфер с данными типа uint8_t. А в функции я хочу изменить значение этого указателя так, чтобы он изменился и на верхнем уровне. Т.е. я хочу сделать
uint8_t* p_frame = NULL; func(p_frame);
И чтобы после вызова func указатель p_frame изменился на тот, который я укажу внутри функции. Как это можно сделать?
>>1739269 > p_name = func(p_frame) Я уже возвращаю длину буфера этой же функцией, просто я упростил для примера > func(p_frame, &p_name); Мне нужно именно чтобы p_frame принял значение, вычисленное внутри. Больше мне ничего от функции не надо, только адрес буфера в памяти и длина буфера. В лоб можно было бы конечно передавать указатель на длину буфера как аргумент, а возвращать адрес. Я подумаю над этим.
А в чем опасность? Запутаюсь потом на верхнем уровне в указателях?
>>1739282 >Скорее всего да, Ну я про такое вот индексирование в духе lea. >лучше уж явно выдели скобками порядок операторов, потому что у && приоритет больше чем у ?: Всё что слева от знака вопроса - кондишн. >и непонятно чего ты хочешь передать нужный индекс.
>>1738797 >То это говно на списках создает кучу cache miss'ов и прочего говна нормальный компилятор со статическим анализатором видит, что у тебя список - не список(не нужна динамическая вставка т проч) и переделывает в массив. Плюс, ВНЕЗАПНО, мап может работать и на массивах и вообще на любых коллекциях. Далее, если у тебя на каждый кусок приличное независимое вычисление (вместо последовательности мапов ты сделал мап композиции функциий, кэш мисс твой нивелируется).
Анон, объясни, почему язык строился вокруг такой ебанутой системы типов? Как можно было додуматься до этого монстра: unsigned long long int, а не стартовать изначально с типов фиксированной длинны (которые и записываются гораздо короче)? Мне просто интересно, чем это было вызвано. Да, я понимаю, что тогда был целый зоопарк платформ, где были и байты по шесть бит, и слова по три байта, но всё равно не понятно, чем в этом случае принципиально хуже иметь по дефолту условный int32_t?
Еще куча других вопросов подобных. Например, почему нет отдельных операторов логических и арифметических сдвигов до сих пор, блять, хотя языку уже давно не первый десяток лет, но это уже другая история.
>>1738613 Найс аутотренинг. А нахуя ты свое /go/вно то здесь пиаришь? У меня и с плюсами процессоры не простаивают, есть корутины и тредпулы. Для Си умельцы скорее всего тоже либ уже налепили.
>>1739817 Так тут как раз и не 0 абстракции. Если бы типы были привязаны к байтам/словам/dword и прочее, то да. Но вместо этого преподносится лажа какая-то с замысловатыми плавающими ограничениями на размер. В итоге это нихрена не переносимый ассемблер. Но одной платформе int один, на другой - иного размера.
>>1739842 Потому что гладиолус. Почему в Си нет проверки границ массивов, хотя эта операция ничего не стоит по рантайму и дает защиту от глупых ошибок? Потому что такой язык как Си дает тебе МИНИМАЛЬНУЮ абстракцию над голыми инструкциями, которые исполняет процессор. Читай, язык полностью полагается на программиста, ты сам выбираешь способ отстрелить себе ногу к хуям собачьим обрабатывать данные, выбирать типы переменных, работать с памятью и т.п. Минимум ограничений - кредо этих языков. Тупо? Бесспорно. Но парадокс - на С/С++ (особеноо на С) держится весь мир компьютерных технологий, вся подноготная 98% технологий крутится на этих языках. Это как рак, который пустил метастазы до того, как его успели убить. Теперь хуй убьют, лол.
>>1739935 Имелось в виду, что при современных мощностях сравнение - ничтожная операция по рантайм футпринту, отсутствие которого может привести к багу, который можно превратить в произвольное исполнение кода. Сам выбирай что важнее, учитывая современное железо.
>>1739932 Ну так-то да. Си - это по сути кроссплатформенный ассемблер, а в языке ассемблера не место большому количеству абстракций (разве что над голыми битами, лол).
>>1739943 >при современных мощностях сравнение - ничтожная операция И что с чем сравнивать, если у тебя функция принимает указатель неизвестно на который алимент массива? Если передавать "дескрипторы" вместо указателей, как в Эльбрусах, то это не совсем ничтожные расходы.
>>1739958 Современное железо это компенсирует с лихвой. Сишка нужна в эмбедщине, где жетские ограничения ресурсов - бесспорно. Но в мощнейших махинах это только открывает огромный attack surface. Хотя альтернатив нет. Мы не живем в мире с розовыми пони, где высирают такое чудо техники, как Раст, и который быренько за 5 лет заменяет все наследние С/С++. Реальность куда более жестока и несправедлива. С другой стороны, мб это и к лучшему, потому что UB - это весело, хоть и небезопасно. Сама возможность произвольно исполнить код на машине, а тем более удаленной, будоражит меня. И без С/С++ наследия это вряд ли было частью реальности.
>>1739967 >Современное железо это компенсирует с лихвой. Железо ничего никогда не компенсирует, оно просто может выполнить кое-что параллельно за счет большей стоимости разработки и большей потребляемой мощности.
>>1739975 И именно поэтому все релевантные языка программирования, кроме С/С++, проверяют границы массивов? Офк они не такие быстрые, как они, порой софт, написанный на них, ползет как дерьмо, но порой и нет. И ничего, юзают. В 80ых такое было нереально и засим вся прикладуха писалась на сях. Даже в 90ых годах это было нередкостью, хотя та же безопасная в плане памяти джава с рождения жестко хайпанула. А все из-за тогдашних мощностей. Сейчас это частично нивелируется современным железом, поэтому каждый второй софт на прикладном уровне высран на скриптопараше вроде жса (привет обрыганскому Электрону)
>>1739988 быстрофикс В STL границы буферов таки чекаются, если делать это через кошерный метод at(), а не через оператор [], что есть сахар над арифметикой указателей без каких-либо проверок.
>>1739988 >И именно поэтому все релевантные языка программирования, кроме С/С++, проверяют границы массивов? Они проверяют потому, что (1) в них нет указателей, (2) они и так требуют много накладных расходов (удалены от железа).
>>1739997 Мораль басни была в другом - на прикладном уровне всем похуй на сверхпердольные оптимизации. Почему? Да блять потому, что железо 2к20 года != железо 1987 года. Вот и все. В системщине - да, бесспорно, но системщиной мир компьютерных технологий не ограничивается. >в них нет указателей В расте есть указатели, но там это проверяется, и при этом это системный ЯП. И только не заводи пластинку про unsafe, это смешно.
Блять, вопрос не про границы массива вообще был. Как использование unsigned long long вместо uint64_t влияет на производительность? Ебом токнулись? Вопрос в том, почему этл мерзкое решение задизайнили по дефолту? Мне просто интересны причины. В чисто исторических целях, так сказать.
>>1740178 > Как использование unsigned long long вместо uint64_t влияет на производительность Именно это - никак. А вот unsigned long может быть 32 или 64 бита, при этом твой код вполне переносим, потому что меньше 32 бит оно быть не может. А вот если напишешь uint64_t, и твой код на 32-битном проце будет тормозить из-за необходимости обеспечивать ненужную тебе по сути 64-битную арифметику путем ебли двух регистров одновременно. На самом деле в stdint есть int_fast типы и int_least типы, вот они норм, и их стоило запилить изначально. А фиксированные нужны, только если ты структуры упакованные в файл пишешь, или у тебя ограничения по памяти.
>>1740188 Потому что на тот момент, когда это делали, вариантов было меньше. Это сейчас у нас интов дохуя развелось больше, чем в stdint есть, а раньше или long, или short были алиасом для int.
>>1740191 >Длинные названия типов, размер которых (хотя бы минимальный) непонятен из самого имени. Ну ты же знаешь, что на VAX int = long = 32 бита, а потом придумали long long, чтобы получить 64 бита без конфликта с существующими идентификаторами.
>>1711268 (OP) С какими значениями -O, -march и/или -mtune нужно компилировать программу, чтобы бинарники работали на всех среднестатестических убунтах?
>>1740007 Я не понял, зачем вам границы массива? Если надо размер, чтобы не пройти итератором за пределы массива, то для вас есть sizeof, если не надо, то с чего бы он был по дефолту? Как программа вообще узнает вышла она за границы массива или не вышла, если она просто читает из памяти подряд? Это типа надо границы массива помечать как-то в памяти что ли? Особой комбинацией нулей и едениц? Как вы вообще себе представляете границы массива в памяти?
>>1741052 > Я не понял, зачем вам границы массива? На самом деле bounds checking для отладки много где есть. Если писать говнокод или просто на отъебись - очень помогает.
> Как вы вообще себе представляете границы массива в памяти? fat pointers или таблицы, как для виртуальной памяти в процессорах.
>>1741052 Да, проверка на выход за границу по длине. > если не надо, то с чего бы он был по дефолту Наверное потому работа с памятью одна из самых частых ошибок?
>>1741057 >Наверное потому работа с памятью одна из самых частых ошибок? Си не прощает ошибок в любом случае. Тем более когда ты работаешь напрямую с микроконтроллером.
>>1741067 > потому что он такие ошибки позволяет исключать Так и Си позволяет. Но Си еще много чего позволяет там, где в расте нужно писать заклинание на страницу, чтобы его величество компилятор дозволил.
>>1741168 ну, сишка действительно четче по хардкору поясняет за хромосомное неумение, а не разматывает темплейты на двадцать экранов, но почему хардварный фейл к крестам ближе?
>>1741052 У любого буфера есть размер при его аллокации. При любом доступе к памяти а-ля буффер + оффсет можно проверять туда ли пишут/оттуда ли читают или нет. Дешевая же операция, камон. >>1741071 Я не растошизик, но мелкософт очень хвалят раст и хотят на него переписывать винду, например. Максимум за 10 лет управятся. А вот Торвальдс ретроград, Линукс доталого будет на сишечке. Но зато будет забавно, без дыр в памяти мир сер и скучен, есть в этом некая романтика, которую рано или поздно убьет технологический прогресс (надеюсь, когда я уже буду пенсионером)
>>1741274 Ааа, да ты тот второй растошизик который форсит Rust у Microsoft. Ну так вот любые пруфы то мб будут? А я могу тебе прям сейчас ответить: раста не будет. Почему? Потому что им проще расширить компилятор С++ для фикса общих ошибок и спроектировать новый безопасный апи, чем они собственно и занимаются с огромным успехом. Кроме того, ты хоть осознаешь все масштабы операционной системы? А я тебе скажу, 6млн. исходных файлов. Можешь представить сколько там LOC? Я вот не могу.
а может такое быть, чтобы strerror(errno) выдавал неправильный указатель? я просто смотрю в gdb, и там какая-то хуйня.
надеюсь он внутри не вызвал функцию определённую мной - но они же должны их прятать, о публичных из posix у меня вроде нет - как это проверять?. ещё я в дебаггере не очень.
>>1715435 Смотри: есть целые числа (инты, например) и дробные (float).
Целые числа всегда делятся нацело, т.е. 100/6=16, а твое 5/1000=0. Дробные числа делятся примерно так же, как в школе, т.е. 100.0f/6=16.666..., ну и для 5f/1000 аналогично.
У тебя в формуле правый множитель будет равен -1 (сам сообразишь почему).
Как избавиться? Внутри формулы юзай флоаты или даблы (в зависимости от требуемой точности), а потом кастуй к своему инту.
Как белые люди пишут кроссплатформенную дин.библиотеку?
Пускай есть некоторый сишный код, который нужно скомпилить и тягать как .so в никсах или как .dll в винде. С никсами все понятно - берешь gcc и компилишь. Слышал по mingw и cygwin, но это костыль костыля, как мне кажется. Как компилять либу на винде?
>>1741274 Когда все проверяется в черном ящике каждый раз без исключения - эта а приори не оптимизированный код. segment-naebnulsa-safe контейнер - не экстрасенс какой-то, чтоб проанализировать вызывающий алгоритм на инвариативность условия, что индекс меньше размера, стало быть говно.
>>1741274 Да и хули толку, что рантайм ошибки не будет, если алгоритм все равно по факту обосрался с индексацией и задачу не выполнил? Все равно руками проверять, раз на то пошло.
>>1741274 Есть тяжелые структуры данных, вся жизнь которых сводится к хождению по индексам на индексы через индексы, и если всрать в реализацию безопасные массивы, время основных операций в такой системе вырастет не на какую-то там >дешевая же операция, камон а пропорционально, то есть в разы
Привет. Чарльз Петцольд в своей книге утверждает, что количество адресуемой памяти влияет на скорость процессора аргументируя тем что на пике. Читаю и не пойму что он имел в виду. Может кто шарит? Тред ассемблерщиков пустует, там решил не спрашивать.
>>1741300 Я не имел в виду только аллокацию памяти на куче, в мире микроконтроллеров это, в большинстве своем, непозволительная роскошь, ибо ресурсов маловато даже для обрыганского аллокатора памяти и менеджера кучи.
Аллокация происходит и на стэке (читай, статическая аллокация). Пример: sub rsp, 0x10 Произошла аллокация статического 16-ти байтового буфера на стэке.
>>Нет, нельзя, производительности придет конец. Как тогда раст позиционируется как системный яп и проникает потихоньку в эмбеддед? У него ведь не только тяжелый статический анализатор кода, а еще и рантайм проверки (в случае с МК могут быть нерелевантны, ибо там, как правило, не имеют дело с кучей)
>>1741626 Скорее всего у него там обосновано почему.
Вообще проблем масса. Как минимум процессору необходимо управлять всей этой памятью, загружать страницы в кеш, сбрасывать и т.п. Процессор и ОС отвечают за преобразование виртуальной памяти в физическую, чем больше память, тем сложнее ею управлять.
Из каких-то таких соображений и появляются ограничения на поддержку памяти компьютерами. Вроде бы у тебя безграничная 64-х битная память, но обычный ноут современный скорее всего будет ограничен где-нибудь 16 гигабайтами. Во многие серверные платы ты тоже сколько угодно не вставишь.
>>1741739 > но обычный ноут современный скорее всего будет ограничен где-нибудь 16 гигабайтами Совершенно не по этой причине, не из-за быстродействия. Просто чем больше бит, тем больше площадь адресной шины, а место на кристалле дорогое. К тому же разводить широкую шину сложнее. Поэтому адрес 64 бита, а реально бит в адресной шине меньше.
>>1741739 >Вообще проблем масса. Как минимум процессору необходимо управлять всей этой памятью, загружать страницы в кеш, сбрасывать и т.п. Процессор и ОС отвечают за преобразование виртуальной памяти в физическую, чем больше память, тем сложнее ею управлять. >
Бля, чем ей "сложнее управлять"? у тебя кэшлайны такие же, развелось дебилов. менеджеры памяти тоже нормальнве люди пишут, и количество имеющейся памяти не влияет на скорость элементарных операций.
Есть инфа, зачем в сетевой библиотеке функции, переводящие endianness, представлены парами htonl/ntohl и htons/ntohs? Разве это не операция с четным периодом, как xor?
>общаться в си треде где 90% постеров это ебанаты студентишки и бывшие трактористы из юнитфактори не написавшие в своей жизни ни строчки кода отличного от linkedlisttutorial.c по туториалу, для которых авторитет это не имя и опыт за ним, а кто за скока вкатился кринж
>>1711268 (OP) Хочу вкатиться в Natural Language Processing, Data Visualisation и всякий статический анализ. Для себя, для будущего диплома. Знаю, придется переписывать половину pandas на Си и творить ебанутые вещи.
Хочу выучить C11. Есть время для этого хобби, два года, есть мрачная решимость не подходить ко гвидопыху даже с десятифутовым копьем.
Люто ненавижу ООП-парашу, скриптобесие. Функциональщину уважаю, но Haskell оставлю на сладкое.
Я, конечно, добаеб и земля мне пухом, но если анонс подскажет полезных библиотек/книжек, буду рад.
>>1742135 Ну, тащемта, это даже не ты ебанат, а эта тема вообще не имеет никакого развития, даже вкат в NLP И так далее сомнителен. Вкат в визулизацию — это вообще кекус, там задачи — написать скрипт чтобы разобрать массив данных, причём в большинстве случаев это разовая акция на порисерчить.
>C11 Чел, во-первых это не плюсы, и 11 от 99 отличаются на 1,5 фичи в языке и 3 новых хидера в стдлибе, а во вторых С11 не то, чтобы что то нужное и везде используется в лучшем случае 99.
> Люто ненавижу ООП-парашу, скриптобесие. Функциональщину уважаю, но Haskell оставлю на сладкое. Тащемта даже хачкель для анализа данных подходит лучше, на си ты просто будешь ебаться с памятью и ловить сегфолты вместо того, чтобы изучать эту область (которая вообще не то, чтобы сидьно про программирование, оно там вообще вторично).
А про ненависть к ооп — а что для тебя вообще ооп?
>>1742322 . спецом, шоб писать охуительно качественный человекочитаемый код хоть под распечатку на чб принтере . на то и есть домашние проекты, чтоб доверять самому себе и не обмазываться бест практиками . в чем космический смысл писать константы КАПСОМ, если можно просто с Капса? . write писал еще когда nlSendStr не было, ща оберну
>на си ты просто будешь ебаться с памятью и ловить сегфолты вместо того, чтобы изучать эту область
Что с памятью-то ебаться? Сел, написал алгоритм, разобрался с типами данных, начертил примерную карту адресного пространства в памяти, прикинул, чтобы информация размещалась более-менее свободно для входного набора данных.
>А про ненависть к ооп — а что для тебя вообще ооп? ООП для меня просто школьная травма.
Бесконечные классы за гранью нормального, всякие get/set, и -1 балл на контрольной за printf вместо cout с охуительным объяснением "ты должен относиться к строке как к объекту, а не описывать форматированный вывод процедурно". Пять лет прошло, а я злой как собака как вспомню.
>>1742457 >, разобрался с типами данных, начертил примерную карту адресного пространства в памяти, прикинул, чтобы информация размещалась более-менее свободно для входного набора данных. Это и есть та самая меморимодел?
>>1742457 >Что с памятью-то ебаться? Сел, написал алгоритм, разобрался с типами данных, начертил примерную карту адресного пространства в памяти, прикинул, чтобы информация размещалась более-менее свободно для входного набора данных. Ты же понимаешь, что это _абсолютно_ write-only подход, который практически невозможно поддерживать и развивать? Ты же сам 2 месяца не разберёшься в коде без полного погружения в это. Это даже хуже типичного говнокода от датасатанистов.
>всякие get/set А при чём тут ООП-то? Когда тебе понадобится присобачить минимальную логику, начиная от отладочной информации или просто ассертов просто ради приблежиния к уровню self documenting code, и заканчивая серьёзными изменениями (например, строка превратилась в бинарный формат, который надо печатать форматированно), то ты и на ассемблере всё на гет/сет все публичные интерфейсы перепишешь, лол.
>ООП для меня просто школьная травма. Таки да, всё нормально, порефакторишь то же, что сам понаписал и начнёшь спокойно юзать ооп, реальных производственных травм у тебя нет.
>>1742634 Со стороны нормального программного дизайна это как раз таки нормальное замечание. На уровне лабы3 конечно похуй, но с практической стороны лучше иметь возможность тюнить даже такой функционал не меняя саму логику программы.
inb4: Ух, чую как злая шкила меня сейчас говном закидает, лол.
>>1742708 > Со стороны нормального программного дизайна Со стороны программного дизайна потоки в C++ - это полный пиздец, ничего хуже еще не придумывали.
>>1742711 А что такое ООП, чел? В С вот реализация инкапсулируется от интерфейса с помощью хидеров, инкапсуляция — 1 из 3 принципов ООП, С — ООП язык на 1/3?
>>1742723 Я же и не говорил обратного, но это хоть какая-то инкапсуляция. Ебашь на здоровье массивы байтов напрямую, кто же запрещает-то. Просто через пару лет догонишь что это хуйня а не подход.
>>1742732 Ну смотри, есть C++ а есть Obj-C. И там и там есть "сахарок", только реализует он всё примерно диаметрально противоположно. Кто из них ООП?
ООП — это, блядь, концепция. Ясен хуй, что никому не нравятся всякие там паттерны итд, но паттерны — это костыли для конкретного языка, а не ООП. ООП — это 3 ебучих принципа, ничего лучше которых никто не придумал (разве что про наследование можно поспорить).
>>1742743 > ООП — это 3 ебучих принципа Нет. Только один: объекты обмениваются сообщениями. И он нихуя не применим на практике без проблем с производительностью. Поэтому ООП-ом каждый называет какие-то свои фантазии. Ну или то, что в вузике вдолбили.
>>1742708 >Со стороны нормального программного дизайна это как раз таки нормальное замечание. Со стороны нормального дизайна использовать сиаут для форматирования строки это пиздец.
>>1742728 >А что такое ООП, чел Это когда оперируешь объектами классов их иерархией. И все это говно сильно зависит от контекста, плюс поддерживание инкапсуляции, один васян решил скрыть доступ, а второй городит огород чтобы нормально считать значение переменной или избавится от оверхеда проверки значения. Короче оч на любителя, как разведенки с прицепами. Но Qt для мордочек юзаю, да. Философия Перл/С здесь ближе, написал в документашке не лезь и все этого достаточно.
>>1742746 >Нет. Только один: объекты обмениваются сообщениями. В понимании примерно всего коммьюнити — 3, и почти весь софт на планете пишется с их применением, поэтому Алан Кей идёт нахуй.
Даже в Objective-C завезли __attribute__((objc_direct)) что как бы намекает, что этот подход мертв.
>>1742759 А аналоги-то какие? Как в новомодных фп архитектурах просто использовать композицию вместо наследования и копипастить код из редюсера в редюсер стейта и создавать заново весь стейт (а лучше и контекст) при каджом изменении а потом гнать по скомпозированному дереву функций?
Мне в ООП нравится только инкапсуляция. Сам я пишу драйвера и системы управления железками разными, и вот именно это я всегда использую в си. Я бы еще перегрузку функций использовал, но она какая-то костыльная в си11, да и боюсь я на си11 переходить, лол.
Честно говоря я вообще не понимаю ООП в Сипипи. Вот в шарпе с ООП все в порядке и там все понятно сразу. Там объектом является ваще все, даже небо, даже Аллах, даже DBNull. А в плюсах нужно постоянно сворачиать мозг, чтобы думать объектно в процедурном языке.
>>1742797 Ага, если учитывать все кодировки и системы письма, то твой класс улетит в ебеня. Но обычно получается ни то ни се и все работают с байтовым буфером по своим потребностям.
>>1742804 > надо согласовывать форматные спецификаторы с типами параметров. Если ошибешься с %s То компилятор скажет, что ты ошибся. Да, это работает только для printf-like функций, а если у тебя свой собственный формат спецификаторов или вообще его нет, тогда тебе никто не поможет.
Как заставить gcc проверять количество и тип аргументов вызываемой функции? Т.е. я объявляю прототип типа void func(int a, int b); И если в коде по ошибке вызываю так funс(1, 2 , 3); то компиль молчит как партизан "-Wall" не помогает
Какое же сложное это ваше программирование. Вот хочу смочь в С - а где мне компилировать? Ставить себе линух или на виртуальную машину и использовать gnu? Или тупо в вижуал студио на виндоусе для начала сойдет? Для чего нужно ставить clang и что это вообще такое?
>>1743166 Вижуал студио сказал что не хочет работать без обновления, а чтобы обновиться нужно залогиниться в учетку майкрософт, от которой я забыл пароль. Сбросил пароль - ввожу и тут он мне говорит что это старый пароль, хотя он не подходил. Видимо я уже менял пароль, и это старый старый пароль и он почему-то больше не подходит им. Вот нахуя программисты майкрософт создают такую еблю для пользователя?
>>1743166 >Или тупо в вижуал студио на виндоусе для начала сойдет? На форточках я бы посоветовал использовать Code::Blocks + MinGW. Со студией хоть и проще начать работать, но в сравнении с CB её функционал для новичка является overkill, поэтому освоить её сложнее.
А вообще, учить человека программированию начиная с C - издевательство, так можно его превратить в Си-дебила. Типичный Си-дебил ничего, кроме императивных языков с Си-подобным синтаксисом освоить практически неспособен.
>>1743242 > Code::Blocks + MinGW двачирую, и весит мало и бесплатная. >>1743242 а что бывает кроме императивных языков? по-моему это самый удбный для понимания код. особенно для пддержки другими людьми.
>>1743175 лол. в рот ебал эти эко-коко-системы. есть ли какие-то форумы/движения/репозитории, которые продвигают идею что комп должен быть ВСЕЯДНЫМ ? (без крайностей)
>>1743036 >>1743063 Забыл добавить, что func объявлена в func.h файле и реализована в func.c файле. При этом главный файл не содержит include "func.h", т.е. в теории функции вообще не должно быть видно. Тем не менее компиль компилит, а линкер линкует.
>>1743166 >Ставить себе линух? Попробуй. Еще захочешь, базарю. На самом деле не нужно, используй удобную для себя систему.
>Или тупо в вижуал студио на виндоусе для начала сойдет? Сойдет и для продолжения. Хотя лично я предпочитаю Clion, но на винде он обычно поверх студии ставится, лол. Не спрашивай.
>Для чего нужно ставить clang? С - компилируемый язык, так что для превращения твоих буквочек в программу нужен компилятор. Дефолтный выбор для винды - msvc(visual studio сама его поставит), для линуксов\макоси - gcc.
Clang - это тоже компилятор, можно поставить в качестве альтернативы тем что выше и все будт заебца.
>что это вообще такое? Не стоит вскрывать эту тему, но вы все равно будете спрашивать.. Clang - часть проекта llvm.org Если коротко, то clang отвечает за фронтенд компилятора, за счет опен-соусности и хорошего api эту хуеверть используют в разных IDE для подсветочки кода, функций рефакторинга, пиздатых сообщений об ошибках и прочих кодоанализов. В связке с llvm превращается в черную магию, способную работать с кодом на любом этапе компиляции, сожрать твой разум, сделать новый язык программирования или даже перевести код с одного языка на другой, попутно забрав твою душу. Ты был предубежден.
>>1743249 >а что бывает кроме императивных языков? по-моему это самый удбный для понимания код. особенно для пддержки другими людьми. Это субъективно, но не стану спорить.
Как минимум какой-нибудь Scheme или Standard ML очень в тему, если приспичило углубиться в Computer Science. У редкого адепта K&R не выносят мозг рекурсивные алгоритмы, обычно используемые в ФП (бинарные деревья из книги они осилили с горем пополам).
>>1743242 Да я не совсем нулевой, в университете вроде бы сдал курс программирования, и даже численные методы на паскале на самом деле не помню чё там было, вроде C++, было похуй сдал и забыл так что сейчас думаю научиться хоть чему-то полезному, не важно какой синтаксис учить сначала мне кажется. Я не из тех кабанчиков которые через 1 месяц хотят устраиваться погромистами.
>>1743264 Откуда вообще такие гигантские масштабы жопоебли и танцов с бубнами, просто чтобы заставить железо выполнить твою команду? Хотя сюда наверное точно не стоит влезать, придёт время пойму.
>>1743242 >На форточках я бы посоветовал использовать Code::Blocks + MinGW >MinGW Может лучше wsl или уже линукс?
>>1743268 >Откуда вообще такие гигантские масштабы жопоебли и танцов с бубнами, просто чтобы заставить железо выполнить твою команду? Тебе как обычному посону достаточно нажать кнопочку compile в ide или как ты там предпочитаешь. Всю еблю и танцы с разными железками, преобразованием говнокода чтоб анубыстроблядь работало и прочие заботы берет на себя компилятор(тот же clang). В 99% случаев думать о том что там под капотом происходит вообще не надо.
>>1743268 >жопоебли и танцов с бубнами, просто чтобы заставить железо выполнить твою команду? Хотя сюда наверное точно не стоит влезать, придёт время пойму. Можешь попробовать Code block портабельную сборку, на сайте у какогото инфоцыгана что ли видел, тредов 20 назад про неё спрашивал обосрали конечно но работает только вроде пути к компиляторам если не в С копируешь вручную надо поменять.
>>1743242 Как раз си, и Книга Кернигана и Ритчи идеальны для вкатывания в проргаммирование вообще. Там же все с самых азов. Еще лучше если купить отладочную плату при этом.
>>1743416 Как один из концов. Пацанское рвение прошариться в ламповом низкоуровневом коддинге утроит общую продуктивность занятий, даже если "КПД" не очень. А так, SICP правильнее.
>>1743445 ЛЕГЧЕ было бы просто новый аккаунт в макйрософте зарегистрировать и какать в визуальную студию, но нужно же блджад в пр в мертвый тред насрать
Имеется некий пакет передачи, который нужно заполнить в правильной последовательности, например: 5 битов - адрес 3 бита - номер функции 10 битов - данные 7 битов - контрольная сумма Ну и решил для удобства всё это сделать структурой с битовыми полями. На байтах всё выходило как надо(потому что биты в байтах, переменных и элементы в массиве всегда размещаются одним и тем же образом). Но когда я стал тоже делать битовыми полями, всё вышло через жопу. Опытным путем я установил, что компилятор размещает битовые поля в памяти рандомным образом, вне зависимости от того, как они указаны в структуре. Я правильно понял, что в таких случаях лучше тупо пользоваться битовыми операциями без битовых полей?
>>1743979 > Опытным путем я установил, что компилятор размещает битовые поля в памяти рандомным образом, вне зависимости от того, как они указаны в структуре. Какой опытный путь, гуглить ты не пробовал?
В зависимости от платформы расположение полей структуры в памяти может отличаться. В частности, на Windows порядок расположения следующий: поля в начале структуры имеют младшие адреса, а поля в конце структуры имеют старшие адреса.
>>1743979 > Я правильно понял, что в таких случаях лучше тупо пользоваться битовыми операциями без битовых полей? Да. Ни обычные структуры, ни структуры с битфилдами нельзя отправлять через сеть в сыром виде, их можно только писать в файл, если этот файл будет прочитан той же программой на той же платформе. Для обмена данными надо писать (де)сериализатор, который возьмет байтики (или битики) из принятого буфера, распарсит их и запишет в поля структуры: myshit.smth = read_uint(&src); myshit.some_bitfield = bitstream_read(&bs, 5), ну типа того.
Да, многие пренебрегают этим, надеясь на то, что big endian их не коснется, и что исключения у флоатов выключены, и что что выраванивания у членов структуры и буфера с полученными данными правильные, и что -fms-bitfields их спасет. Но лучше не стоит.
>>1744124 >Битовые поля хуёво стандартизированы. Они стандартизированы, просто каждый компилятор располагает их по разному в памяти. >Поэтому лучше воздержаться от их использования. Не все так однозначно. Если ты работаешь с битовыми полями только в программе, то их можно использовать, они намного удобнее. А если собираешься куда-то пересылать, то лучше тогда биты распределять в пакете передачи вручную с помощью битовых операций. Тот же MISRA C не запрещает битовые поля, хотя как бы этот стандарт во всем придерживается, чтобы код не зависил от компилятора.
>>1744006 >Какой опытный путь Изменял биты в полученном пакете передачи, а потом на бумажке отмечал, где находится то или иное битовое поле. >, гуглить ты не пробовал? Потом, когда увидел такое говно, загуглил, оказалось, что расположение битовых полей в памяти отличается от компилятора к компилятору. >В зависимости от платформы расположение полей структуры в памяти может отличаться. В частности, на Windows порядок расположения следующий: поля в начале структуры имеют младшие адреса, а поля в конце структуры имеют старшие адреса. Да это я знаю, порядок байтов в массивах и структурах всегда одинаков - элементы в начале структуры/массива имеют младшие адреса. А биты в байте располагаются от старшего к младшему. Речь про битовые поля, а они могут быть не кратны байту, и как расположит компилятор их в структуре это всегда загадка.
>>1711268 (OP) Блин, а это говно: >- Brian Kernighan, Dennis Ritchie "The C Programming Language": разве обязательно читать? Просто я прочёл справочник Шильдта(и иногда заглядываю в его при работе) и мне этого с головой хватает для проганья, не вижу смысла что-то ещё читать дополнительно.
>>1744425 > чем константы отличаются от дефайнов Пиши в файле: const int nelem = 42; int array[nelem]; И компилируй. Алсо, const не гарантирует, что переменная nelem не будет читаться там, где ее можно было оптимизировать до immediate-операнда в инструкции.
>>1744425 Тем, что дефайн - это find & replace ДО начала компиляции. При абузе дефайнов ты охуеешь дебажить это говно, так как переменной как таковой нет, до процесса компиляции просто идет замена x на y, если макрос: #define x y
А константа - переменная, под которую выделяется место в read-only сегменте памяти. И при дебаге, в отличие от дефайнов, у тебя будет не много веселых магических чисел, а переменная с конкретным адресом в памяти.
>>1741626 Он пишет про процессорный кеш. В его лучшие года он был 8-16 килобайт, сейчас он даже в 10 поколении топ L1 512кб L2 18 L3 24.75 мб соответственно. Очевидно что процессор при считывании чего-то большого в памяти будет прогонять часть через L1 разбивая на кусочки меньше 512 килобайт. А это в свою очередь отдельные. Очевидно что в таком случае 4 гига прогнать проще и быстрее чем 128 гигов.
Но это лишь моё предположение, надо смотреть в каком контексте он это говорил.
Блядь, какой-то долбойоб прокукарекал про то, что const записывается в "read only" память. Нету такого говна, нету. const - тупо квалификатор типа, запрещающий определённые операции (модификации) на уровне синтаксиса, вот и всё. Вообще, нахуя тебе явный каст? Конверсия указателя в указатель на константу происходит неявно и вообще абсолютно легальна (то, что функция принимает указатель на константу, обычно означает, что она не будет менять передаваемые таким образом данные). Система типов в си - достаточно мудра и держит тебя в узде.
>>1748721 Куча детских болезней. Есть профит по сравнению с каким-нибудь JS, Java, Kotlin или PHP. Когда речь заходит о сравнениис C - все профиты пропадают. В основном растошизики орут что раст круче при работе с памятью и что сложнее выстрелить себе в ногу при этом умалчивая факт того что это профиты перед стандартом C 1997 года!
>>1748865 Это у него просто отладчика нет. Если исходники есть - можно source-level отладкой пользоваться, если нет - код обычно оптимизированный, и никаких отдельных переменных под const там уже нет.
>>1748725 >что const записывается в "read only" память. Нету такого говна, нету. Ну вообще в микропердолинге, например, приблизительно так и происходит. Всё зависит от платформы и компилятора.
>>1748786 А что сейчас поменялось? Сишка так и продолжает невозбранно срать в память, ub на ub и ub погоняет. В крестахс этим проще, там контейнеры и умные указатели, этот язык на 90% избавился от проблем 80ых, в отличие от Сишки. А в расте так вообще срать в память можно только в ансейф блоках, и то со своими нюансами. При этом пристальное внимание при тестах можно сосредоточить именно там и поэтому вероятность критических багов в целом снижается чуть ли не к 0.
Я вообще мимо другой анон. Моя единственная претензия к расту это раздутость. У меня один проект занимает что то около 1.3 Гб (target) и еще 400 метров rls-овских файлов, ну и небольшое примечание: это хеллоу ворлд, для отрисовки одного единственного треугольника с градиентом. Как я понимаю это все скомпилированные зависимости, то есть дальше размер проекта будет расти только от моих собственных файлов. Но если я захочу сделать еще один проект, который рисует квадраты, то у меня будет два проекта по ~1.7 Гб, и так далее....
>>1749114 Ага, только вот утечка памяти сама по себе не эксплуатабельна. Ты не можешь дойти до состояния исполнения произвольного кода имея лишь мемори лик, в отличие от переполнений и мисменеджмента работы с указателями, что раст элиминирует накорню (не считая ансейф, но я уже высказался по этому поводу).
>>1749125 Да, attack surface меньше, тем не менее, раст не такой идеальный каким его многие описывают. Мне кажется, если не было фанатичной рекламы раста из всех щелей, то не было бы хейта в сторону раста и относились бы к нему спокойнее. Ну а так, мне кажется, что уже стоит начинать изучать раст, тем кто хочет в системщину, не обязательно писать, но уже даже мелкомягкие и мейнтейнеры линукса уже начинают работать с растом. Хотя, кмк, сишка все также незаменима на микроконтроллерах и embedded.
чувак спрашивал, про касты указателей в указатели на константы, ты пишешь что-то ОЧЕНЬ implementation defined, и то, что в данном случае не имеет вообще никакого отношения к сути вопроса.
>>1748903 >А что сейчас поменялось? Язык обновили, баги исправили. Ты же тоже не пишешь на первой версии раста. Вот и C скакнул вперёд. А вы со своими спорами напоминаете мне кукареки смузихлёбов против PHP, вроде и дельная критика, а на деле выясняется что относится она к первым детским стандартам, а на том языке к которому критика относится уже никто не пишет много лет. В итоге слышу звон, да не знаю где он. >>1749114 Ну тут никаких утечек памяти ненужно. 1,3 гига - видимо предполагает что она уже везде где только можно протекла.
>>1749114 >Как я понимаю это все скомпилированные зависимости У раста нет нормального компилятора который берёт только то что используется кодом? Такая штука даже в делфях была, даже в паскале. Мол используешь мат функцию дискриминанта, в своём коде. Вот эти 16 строк и берёшь. В итоге даже жирные проекты не превышали 1.2 мегабайта. Неужели это какие-то забытые техники? Или там какое-то другое устройство бинарников?
>>1750958 Нет, братан, это ты иди кури матчасть. Пикрил: константная целочисленная переменная sosatb, равная числу 1337, находится по адресу 0x7fffffffdf7c. При инспектировании адреса видно: а) Этот адрес лежит в пределах лэйаута стэка - команда vmmap stack дает ренж адресов стэка, как видишь, адрес константной переменной лежит в этом ренже. б) При обращении по адресу 0x7fffffffdf7c, видно значение 0x539 на стэке, что равно 1337 в десятичной системе исчисления.
Вывод - константная переменная находится непосредственно на стэке (нет никакого указателя на .rodata сегмент, как видишь), засим семантика языка С хэндлит такие ситуации, но никак не перемещение константных переменных в .rodata Если тебе интересно что хранится в .rodata, могу дать пример - строковые литералы. То бишь, условный char* literal = "yayayoyo"; улетает в .rodata
На будущее, советую проверять подобные утверждения в отладчике, дабы не вводить в заблуждение маслят. Бобра!
>>1751063 #define это по сути find & replace До начала компиляции при условном макросе #define a b все а в текущем файле заменяются на b, ДО начала компиляции. Это не является переменной, скорее как магическое число (именно поэтому абьюз дефайнов превращает отладку в ад).
В случае с const, все происходит не ДО начала компиляции, а непосредственно ВО ВРЕМЯ компиляции, под переменную выделяется память, соответственно, у нее есть адрес.
Как перестать тестировать вложенные циклы "на лету" и начать жить? Не могу в голове построить как оно будет работать, приходится шажками допиливать условия. Больше практики?
>>1748725 >Блядь, какой-то долбойоб прокукарекал про то, что const записывается в "read only" память. Нету такого говна, нету. const - тупо квалификатор типа, запрещающий определённые операции (модификации) на уровне синтаксиса, вот и всё.
Для полной ясности. Глобальные константы char yoba[] = "yoba"; const float pi = 4; будут размещены компилятором/компоновщиком в секции ro data, если таковая поддерживается. Эта секция при исполнении помещается/отобращается в память read only, при наличии поддержки в ядре.
MACRO просто заменяется на 1337 во всех местах в текущем файле. Если макрос привязан к числу, то MACRO - магическое число без адреса в памяти, так как не является переменной. В чем проблема?
>>1751149 >char yoba[] = "yoba"; Это не константа, это обычная строка, не литерал. И если эта строка вне стэкового фрейма какой-либо из функций (то бишь глобальная), то такая строка улетит в .data сегмент, куда можно, разумеется, писать. Литерал же в любом случае улетает в .rodata, неважно глобальный он или же находится в стэковом фрейме одной из функций, которая его объявила. >const float pi = 4; Да, тут ты прав. Если эта константа глобальная, она улетит в .rodata. Если не глобальная, просто хранится на стэке в стэковом фрейме функции, где была объявлена, без референса в .rodata сегмент, так как она не там в таком случае.
>>1751158 Вы заебали выдавать детали реализации за истину.
> Если не глобальная, просто хранится на стэке в стэковом фрейме функции, где была объявлена, без референса в .rodata сегмент Все зависит от компилятора, от флагов оптимизации, а в случае с float еще и от использования fpu или sse для плавающей точки. Алсо, .rodata - это линуксы. В винде оно может улететь в конец .text, в .rdata, да и в .data даже с какими-то компиляторами. В каком-нибудь ARM-коде оно может лежать в виде литерала прямо после функции, а функция, естественно, в .text.
>>1751257 >пук среньк найс обосрался, анон В моей компетенции можешь не сомневаться, а доебываться до слов - признак слабого ума и отсутствия контраргументаций
>>1751106 Обосрался ты, маня, ведь в данном случае данные (инт) лежит в .text секции кода и уже после подгружается в стек. И так всегда было. Не до конца ты вкурил видимо, ну ничего, заглядывай к нам в асм тред, научим тебя.
>>1715236 Непонятно, для каких конкретных жизненных задач может понадобиться непременно СПИСОК ВСЕХ UB БЕЗ РЕГИСТРАЦИИ И SMS. Сдается мне, у тебя какой-то реферат, сам смысл которого в том, чтоб ты, как раз таки, сам выколупывал крупицы знаний, и ты пришел с этим на двач. Аноны?
>>1751356 Сосунок, ты думаешь я не знаю, что такое строка в Си? Что это нуль-терминированный массив символов? Камон, я писал драйвера и кастомный кернел с половиной кода на асме еще до того, как твой батя твою мамку тобою запузырил, не пытайся маняврировать, ты выглядишь нелепо. Единственное, что ты пытался сделать, это доебаться до слов, чтобы выйти из нелепой для себя ситуации.
>>1751405 Маня, у тебя этот конст находится в стэковом фрейме функции и при обращении по адресу нет никакого адреса ни в какую секцию, а есть просто голое значение инта, че ты несешь? У тебя перед глазами вывод отладчика, а ты маняврируешь. Более того, в .text секции хранится код, там пермишены read & execute, причем здесь переменные, ебалай? Они там не хранятся. Если ты, уебок тупой, перепутал это с .data/rodata, то тоже нет, для этого переменная на пикриле должна быть глобальной, а не локальной. Проверь в отладчике. Нихуя не знаешь и еще пытаешься выебываться. Пиздуй учить матчасть, щенок.
>>1751477 >пуксреньк Что ж вы такие сливные, я вам вывод отладчика на реальной программе даю с доказательствами, а вы маняврируете, лол :-) За мной аргументы и факты, за вами кукареканье. Так не интересно.
>>1751455 Ребёнок, ну прекрати проецировать и копипастить. Ты ведь даже 2/3 из написанного не понимаешь. Каждая твоя строчка пропитана жалким негативом, что выдаёт в тебе закомплексованного юношу. Нельзя так себя вести, не красиво. Соблюдай нормы приличия, ты всё-таки не в подворотне или /b.
>>1751506 Я предоставил факты, вывод отладчика не врет. Спор против доказанных фактов - признак долбоеба и слабохарактерного червяка. С моей стороны пока были только факты и доказательства, вы пытаетесь здесь маняврировать и троллить тупостью, камон. Раскройте глаза/откройте сами отладчик и проверьте, это не так сложно. Гораздо проще, чем пытаться кого-то задеть на анонимной борде (лол) и спорить в лоб с доказательствами, не имея своих.
>>1743254 К сожалению, это наследие для обратной совместимости. Древние реализации имели другой синтаксис объявлений, а при отстутсвии объявления компилятор молча предполагал, что все аргументы int, и возвращаемое значение тоже int. Такие ошибки мега трудно дебажить, особенно если один из аргументов/возвращаемого значения является укащателем, который обрежется компилятором до 32битного инта (особенно на 64битной системе).
И да, -Wall, как ни парадоксально, ловит не все. Попробуй добавить во флаги компиляции явное указание стандарта не ниже C99 (а лучше сразу C18, хуле), либо попробуй явно включить предупреждения - Wimplicit-declaration
Да що это такое ваше системное программирование я хуй пойму. Это получается все эти ваши ебомбаные ядра линупса и другие дрочева для взаимодействия оси с железом или даже что повыше? И какие показатели заработной платы у всей цей хуебты для условного джуна-мидла на it рынке ммм? И сколько вы по времени в это всё вкатывались до уровня достойной зп? Можно ли жить на одной шишечке без крестов или с ними получаемые мной сабжики вырастут по экспоненте?
>>1752406 А что это за забугор такой ты мне скажи а то я хз. Вот я в Финке живу це забугор уже или ещё нет? Знаю типа из россиюшки который катает 1 неделю в месяц по всем кокотельным своего города, редачит там что-то на сишке пару часов и получает за это 200к в месяц.
>>1752580 Это то, что мне рассказывает знакомый. Как там на самом деле - я без понятия. Может он аптекарем работает. >тралль 0 мотивации. Просто интересно узнать на хороший ли путь я встал.
Ну, если цель - попасть в железячный интырпрайз вроде телекома или прочих нвидий или на худой конец - прошивки для индезита писать в конторе-подрядчике - то да.
Если разрабатывать аналоговнет в засаленной ниишке с тащмайором за спиной и подпиской о невыезде - то нет
>>1752318 В юзерленде это разработка демонов, какие-нибудь движки баз данных, что-то для виртуализации/эмуляции. Плотют за такое хорошо (100-200), если компания крупная, в других хз. На шишечке самое то писать ядрышки и демоны, а в проекте покрупнее быстро вляпаешься в плюсы.
>>1752596 Яснооо. А как обстоят дела с временем вката? Как многие любят писать ~10 лет или получше? Сейчас Прату читаю, там хоть какая-то база для этого будет?
>>1752675 >А как обстоят дела с временем вката? Если ты нуб и тебе интересно низкоуровневое программирование/системщина, то надо самообучаться лет пять (в т.ч. копать чужой код), чтобы нахуячить приличный код для резюме и ответить на каверзные вопросы. Дальше еще 5-10 лет настоящих задач, чтобы стать профи. Повышение зряплаты при этом зависит от галеры. >Прата Не читал.
Стоит ли читать книгу по устаревшему стандарту?(Керниган, Ричи 2 издание) или лучше поискать что-то поновее. Хочу вникнуть в азы си и перекатиться на плюсы.
>>1753327 Да там немного осталось, за пару дней осилю и за си++ уже детально возьмусь. Просто на си лабы писал и если что на крестах можно как на си писать(вроде)
Простите, сегодня перечитал свой вопрос, никакой дополнительной информации не предоставил. Итак: Win10 Code::Blocks + очевидный MinGW (шел вместе с CodeBlocks, должен быть последний). * Из чтения разной документации пришел к выводу что больше всего мне подходит SDL2.
В гугле полно видео от индусов, но нихера не работает.
>>1753927 CreateWindowEx и весь стандартный win32 gui app skeleton, который можно без проблем спиздить в гугле. По WM_PAINT ты просто BeginPaint/LineTo/ArcTo/EndPaint и все.
SDL тебе никаким образом тут не поможет, она про растровую графику, свои кружочки тебе придется по точечкам рисовать. OpenGL как бы умеет в линии, но это функциональность давно deprecated, а в современном OpenGL линии принято рисовать длинными и тонкими треугольниками. Поэтому из всех вариантов GDI - самый простой способ.
>>1754137 Это говорят про GDI+ (хотя GDI+ тоже можно, если заморочиться), а я говорю про GDI. Ничего серьезного на GDI давно не делают, но оно по-прежнему поддерживается, работает в любой винде, и достаточно просто в использовании: https://pastebin.com/raw/7nu7GzsP
Как начать понимать чужой код на си? Я открыл случайный проект на гитхабе, а там куча папок и хрен знает что за каждая отвечает. Что мне нужно гуглить, чтобы понимать(хотя бы почему так располагаются файлы и где главная функция)?
>>1711268 (OP) Форматирование флешки (в NTFS, например) это просто запись некоторого двоичного кода (одинакового для всех флешек)? Где его можно посмотреть?
Алсо, как проводится запись на флешку? Я знаю что у usb 1 пин для получения данных, но как на него подавать напряжение (вручную) чтобы что-то писалось? Где это всё можно посмотреть?
TL;DR ищу гайд для написания lite аналога partition wizard с нуля.
>>1754252 >Форматирование флешки (в NTFS, например) это просто запись некоторого двоичного кода (одинакового для всех флешек)? >Где его можно посмотреть?
Форматирование это по сути создание базы данных на носителе. Посмотреть начиная с педевикии и списка источников.
> Алсо, как проводится запись на флешку? Я знаю что у usb 1 пин для получения данных, но как на него подавать напряжение (вручную) чтобы что-то писалось? Где это всё можно посмотреть?
Вручную ты никак не подашь напряжение даже на ассемблере даже на самом низком уровне драйвера - это кремнием в транзисторах контроллера USB зашито.
Короч, тебе танненбаума "архитектура компьютера" внутривенно 2 раза в день до появления понимания.
>>1754270 > ручную ты никак не подашь напряжение даже на ассемблере даже на самом низком уровне драйвера Вручную сорт оф можно. Гугли, например, какой-нибудь AVR USB bitbanging.
>>1754355 >>1754353 Анон, послушай меня, самый простой способ и стаковерфлоу со мной согласен это bgi turbo c через dosbox. В свое время я так и писал простенькую графику, рад в 21м веке узнать что нихуяшеньки не изменилось. Новичку в си другого выбора не дано, то что тут выложено в gdi через указатели с нулем инфы и спецификаций. И то хуй найдешь. Удачи вам.
>>1754182 добавил в compiler options: -Wall -Wextra -pedantic -Wno-unused-parameter -std=c11 добавил в linker options: -luser32 -lgdi32
>skipping incompatible ... when searching for >skipping incompatible ... when searching for >skipping incompatible ... when searching for >skipping incompatible ... when searching for >skipping incompatible ... when searching for >skipping incompatible ... when searching for
>>1754182 Ах тыж питрасян :)) Через CMD скомпилилось без ошибок, а через ide хуй. Stackoverflow говорит что я пытаюсь создасть -64 приложение на -32 библиотеке. Но это мне ни о чем не говорит. ПАМАГИТИ.
Поясните за IDE. VS же считается топом? А норм она в самом начале изучения языка? Вчера полчаса ебался с scanf_s поэтому интересно какие косяки могут быть впереди. Codeblocks не выношу из-за ущербного интерфейса и ужасной настройки внешнего вида из-за которой я не могу сделать себе ламповый чёрный интерфейс. И почему вообще в разных IDE абсолютно идентичный код может давать разный вывод? Как это доджить?
>>1754374 > dosbox Ну если тебе просто кружочек нарисовать, то самый простой способ - это JS и <canvas>, там даже устанвливать ничего не нужно. Я думал, мы о чем-то практически применимом разговариваем.
> в 21м веке узнать что нихуяшеньки не изменилось В 21 веке завезли сишный апи для Skia, например. Признайся, ты просто не хочешь изучать ничего нового.
> с нулем инфы и спецификаций MSDN более чем достаточно, там не только описания функций есть, но и вводные статьи, вот потыкай: https://docs.microsoft.com/en-us/windows/win32/gdi/windows-gdi Но для неосиляторов раньше специальная книжка была Feng Yuan "Windows Graphics Programming".
>>1754469 > VS же считается топом Для серьезных проектов. Для хелловорлдов - что угодно, хоть вимы, хоть вскоды и саблаймы, хоть clion.
> Вчера полчаса ебался с scanf_s Один запрос в гугле, первый результат. Или можно смириться и писать, как хочет MS.
> какие косяки могут быть впереди Некоторые возможности из C11 поддерживаются только с бубном. Например, надо запустить VS Installer и доустановить там clang.
> И почему вообще в разных IDE абсолютно идентичный код может давать разный вывод? IDE тут не при чем. Это проблемы твоего кода. Нормально пиши - нормально будет.
>>1754578 >первый результат Да вот нифига, я несколько ссылок пролистал где подсказывали отлючать проверку через дефайн, а надо было в настройках проекта. Но ебался я с тем, как указывать размер буфера для ввода.
>>1739810 > Для Си умельцы скорее всего тоже либ уже налепили. Зачастую, кстати, у С-дедов такие библиотеки дают лучшую производительность, чем у С++-миллениалов. Быстрее только на чистом ассемблере. Деды в целом и это могут, но долго это. Поэтому на чистом ассемблере пишут только местами: ту логику/вычисления, которая исполняется 85-99% от общего времени.