Это копия, сохраненная 10 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт 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 (февраль 2020, с диффами)
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
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)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №60: http://arhivach.ng/thread/610540/
- №61: http://arhivach.ng/thread/610541/
- №62: http://arhivach.ng/thread/616070/ >>1807650 (OP)
Похоже что тут орудует два долбоёба. Одного я не заставл, а второй первым отметился в этой теме. Не обращай внимаение - это информационный шум от детишек, считающих что они познали Си.
Да это он сам и пиарит себя скорее всего.
Схоронил. Мы должны схоронить историю этого великого треда, о великом языке программирования лучше которого ничего не существует.
Чем можно коньпилировать сишный код под виндой не ставя при этом Visual Studio?
Синтаксис так понимаю можно и каким-нибудь Sublime проверить.
Понял. Попробую ГНУ.
Читал шапку и подумал что для ГНУ надо лялих ставить, а он кросплатформенный оказывается.
Можешь скачать любой компилятор с Сурсфоржа и через виндовую сосноль его использовать. Советую павершел.
Динамикомакака (жс+питон) пожаловала в ваш тред
Объясните плез, как обходитесь без неймспейсов? Вот если куча "импортов" (include .h-файлов), то как блять в этой мишуре разобраться?
Компилятор с библиотеками, документацией, примерами и готовой собранной программой типа хелловорлда. Всё вместе 2.5 МБ. Могу скинуть если надо.
Ты делаешь страшные вещи.
Вот тут:
Fil = &File;
Ты присваиваешь аргументу Fil) указатель на локальную переменную, находящуюся в стеке. При выходе из функции переменная File, на которую ты ссылаешься, может быть потёрта кем угодно. Всё усложнаяется тем, что она может бытьи не затёрта. Т.е. при каких-то условиях код будет работать, а при каких-то нет. Зависеть может много от чего. Короче - так делать нельзя.
Самое простое решение, чисто чтобы понять.
Замени строчку
> FILE File = NULL;
на
> #define File Fil
Если Вакакба не скушает звёздочу, то всё очевидно.
Скушала таки Вакаба звёздочку
На самом деле Windows очень близка к микроядерным ОС. Дело в не размере, а в используемых принципах.
Я бы даже так сказал, несмотря на то, Mac OS построена поверх Mach, Windows, возможно, имеет больше признаков микроядерной ОС.
>printf(FileName)
Не пиши так. Это уязвимость.
>scanf("%s", FileName)
Возможен buffer overflow.
>char Again = "N"
"N" - это строковый литерал
Чему равно значение Again?
>Fil = &File
Fil - копия, т.е. измениться только копия.
Надо присвоить адрес адресу, содержащемуся в Fil, т.е. *Fil = File
Также >>19375 писал, что ∗File выделен на стеке, после вызова fopen, File будет указывать на память в куче (пикрил), но после Fil = &File указатель проёбывается, т.к. &File - адрес переменной на стеке, которая после возврата в вызывающую функцию инвалид. Fil - просто копия адреса (тоже на стеке). Т.е. с внешними значениями функция делает ровно нихуя, зато происходит memory leak. Используй санитайзеры и ворнинги
Звёздочка филь равно файл
А вот если бы ты возвращал через return, то компилятор бы тебе написал в предупреждении что не так.
> графическая подсистема, намертво вшитая в ядро
> Windows, возможно, имеет больше признаков микроядерной ОС
Каждый раз с мамкиных баллмеровских подсосов угораю, как в первый. Дружочек, ты тредом ошибся, сирешётка-тред ниже.
Ты по размеру и фичам не суди.
Главное как себя ОС ощущает и позиционирует.
Microsoft©® Windows©®™ она как девочка внутри, только чувствует себя как микроядерная ОС. Вот и все.
Так что ты тут не залупайся, цисгендерный спермобак. Никто не вправе Windows запретить считать себя микроядерной системой.
> как обходитесь без неймспейсов
Префиксами имен, которыми неймспейсы по сути и являются. Совпадения имен, у которых есть префиксы, очень-очень редки, поэтому разницы особой нет. Желание сделать from xxx import yyy хоть и возникает изредка, но не настолько часто, чтобы мы из-за этого плакали.
> Вот если куча "импортов" (include .h-файлов), то как блять в этой мишуре разобраться?
Точно так же как в тысячах модулей ноды или в site-packages. Только проще, потому что leftpad принято писать, а не таскать библиотекой, и в либах остаются реально нужные вещи. Что касается хедеров, то там опять-таки проще.
>>19101
tcc - для хелловорлдов. Половины хедеров нет, хедеры из mingw приходится подправлять напильником, сообщения об ошибках максимально недружелюбные из-за примитивности парсера, багов хоть и стало меньше, но совсем они не исчезли.
>>19784
> графическая подсистема, намертво вшитая в ядро
Ядро отдельно, win32k.sys отдельно. Можно оторвать executive полностью и написать новую. Да, в ntoskrnl кроме ядра еще другие вещи лежат, как и в win32k кроме executive лежит графическая подсистема, но это только вопрос размещения в файлах, сами они слабо связаны. Точно так же было в еще в MS-DOS, там в IO.SYS лежали две разные вещи: подсистема ввода-вывода (IO) и сам MS-DOS.
Есть Windows 10 Headless, впрочем не знаю как она устроена
Программы на Си занимаются какой нибудь узкой специализацией и не тянут в один файл несколько предметных областей.
> Объясните плез, как обходитесь без неймспейсов?
Спокойно. Просто нужно держать жёсткий нейминг переменных и функций.
> Вот если куча "импортов" (include .h-файлов), то как блять в этой мишуре разобраться?
Разобраться не сложно, если нейминг правильно сделан.
Ах, в заголовках творится какой-то ад. Нагромождение непонятного кода, ммм. Ну все, больше на Си программировать не буду, хватит это терпеть! Долой ад в заголовках! Я за чистый код!
У меня ничего не глючит, а конкуренция стимулирует развитие, в то время как монополия приводит к стагнации.
Чулочки-то надел, болезный?
Fix that libarchive fails to return filenames for UTF-8/UTF-16 entries. The reason is that it uses locales and all that garbage, and mpv does not set a locale. Both C locales and wchar_t are shitfucked retarded legacy braindeath. If the C/POSIX standard committee had actually competent members, these would have been deprecated or removed long ago. (I mean, they managed to remove gets().) To justify this emotional outbreak potentially insulting to unknown persons, I will write a lot of text. Those not comfortable with toxic language should pretend this is a religious text. C locales are supposed to be a way to support certain languages and cultures easier. One example are character codepages. Back when UTF-8 was not invented yet, there were only 255 possible characters, which is not enough for anything but English and some european languages. So they decided to make the meaning of a character dependent on the current codepage. The locale (LC_CTYPE specifically) determines what character encoding is currently used. Of course nowadays, this is legacy nonsense. Everything uses UTF-8 for "char", and what doesn't is broken and terrible anyway. But the old ways stayed with us, and the stupidity of it as well. C locales were utterly moronic even when they were invented. The locale (via setlocale()) is global state, and global state is not a reasonable way to do anything. It will break libraries, or well modularized code. (The latter would be forced to strictly guard all entrypoints set set/restore locales, assuming a single threaded world.) On top of that, setting a locale randomly changes the semantics of a bunch of standard functions. If a function respects locale, you suddenly can't rely on it to behave the same on all systems. Some behavior can come as a surprise, and of course it will be dependent on the region of the user (it doesn't help that most software is US-centric, and the US locale is almost like the C locale, i.e. almost what you expect). Idiotically, locales were not just used to define the current character encoding, but the concept was used for a whole lot of things, like e. g. whether numbers should use "," or "." as decimal separaror. The latter issue is actually much worse, because it breaks basic string conversion or parsing of numbers for the purpose of interacting with file formats and such. Much can be said about how retarded locales are, even beyond what I just wrote, or will wrote below. They are so hilariously misdesigned and insufficient, I can't even fathom how this shit was _standardized_. (In any case, that meant everyone was forced to implement it.) Many C functions can't even do it correctly. For example, the character set encoding can be a multibyte encoding (not just UTF-8, but awful garbage like Shift JIS (sometimes called SHIT JIZZ), yet functions like toupper() can return only 1 byte. Or just take the fact that the locale API tries to define standard paper sizes (LC_PAPER) or telephone number formatting (LC_TELEPHONE). Who the fuck uses this, or would ever use this? But the badness doesn't stop here. At some point, they invented threads. And they put absolutely no thought into how threads should interact with locales. So they kept locales as global state. Because obviously, you want to be able to change the semantics of basic string processing functions _while_ they're running, right? (Any thread can call setlocale() at any time, and it's supposed to change the locale of all other threads.) At this point, how the fuck are you supposed to do anything correctly? You can't even temporarily switch the locale with setlocale(), because it would asynchronously fuckup the other threads. All you can do is to enforce a convention not to set anything but the C local (this is what mpv does), or to duplicate standard functions using code that doesn't query locale (this is what e.g. libass does, a close dependency of mpv). Imagine they had done this for certain other things. Like errno, with all the brokenness of the locale API. This simply wouldn't have worked, shit would just have been too broken. So they didn't. But locales give a delicious sweet spot of brokenness, where things are broken enough to cause neverending pain, but not broken enough that enough effort would have spent to fix it completely. On that note, standard C11 actually can't stringify an error value. It does define strerror(), but it's not thread safe, even though C11 supports threads. The idiots could just have defined it to be thread safe. Even if your libc is horrible enough that it can't return string literals, it could just just some thread local buffer. Because C11 does define thread local variables. But hey, why care about details, if you can just create a shitty standard? (POSIX defines strerror_r(), which "solves" this problem, while still not making strerror() thread safe.) Anyway, back to threads. The interaction of locales and threads makes no sense. Why would you make locales process global? Who even wanted it to work this way? Who decided that it should keep working this way, despite being so broken (and certainly causing implementation difficulties in libc)? Was it just a fucked up psychopath? Several decades later, the moronic standard committees noticed that this was (still is) kind of a bad situation. Instead of fixing the situation, they added more garbage on top of it. (Probably for the sake of "compatibility"). Now there is a set of new functions, which allow you to override the locale for the current thread. This means you can temporarily override and restore the local on all entrypoints of your code (like you could with setlocale(), before threads were invented). And of course not all operating systems or libcs implement this. For example, I'm pretty sure Microsoft doesn't. (Microsoft got to fuck it up as usual, and only provides _configthreadlocale(). This is shitfucked on its own, because it's GLOBAL STATE to configure that GLOBAL STATE should not be GLOBAL STATE, i.e. completely broken garbage, because it requires agreement over all modules/libraries what behavior should be used. I mean, sure, makign setlocale() affect only the current thread would have been the reasonable behavior. Making this behavior configurable isn't, because you can't rely on what behavior is active.) POSIX showed some minor decency by at least introducing some variations of standard functions, which have a locale argument (e.g. toupper_l()). You just pass the locale which you want to be used, and don't have to do the set locale/call function/restore locale nonense. But OF COURSE they fucked this up too. In no less than 2 ways: - There is no statically available handle for the C locale, so you have to initialize and store it somewhere, which makes it harder to make utility functions safe, that call locale-affected standard functions and expect C semantics. The easy solution, using pthread_once() and a global variable with the created locale, will not be easily accepted by pedantic assholes, because they'll worry about allocation failure, or leaking the locale when using this in library code (and then unloading the library). Or you could have complicated library init/uninit functions, which bring a big load of their own mess. Same for automagic DLL constructors/destructors. - Not all functions have a variant that takes a locale argument, and they missed even some important ones, like snprintf() or strtod() WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK I would like to know why it took so long to standardize a half-assed solution, that, apart from being conceptually half-assed, is even incomplete and insufficient. The obvious way to fix this would have been: - deprecate the entire locale API and their use, and make it a NOP - make UTF-8 the standard character type - make the C locale behavior the default - add new APIs that explicitly take locale objects - provide an emulation layer, that can be used to transparently build legacy code without breaking them But this wouldn't have been "compatible", and the apparently incompetent standard committees would have never accepted this. As if anyone actually used this legacy garbage, except other legacy garbage. Oh yeah, and let's care a lot about legacy compatibility, and let's not care at all about modern code that either has to suffer from this, or subtly breaks when the wrong locales are active. Last but not least, the UTF-8 locale name is apparently not even standardized. At the moment I'm trying to use "C.UTF-8", which is apparently glibc _and_ Debian specific. Got to use every opportunity to make correct usage of UTF-8 harder. What luck that this commit is only for some optional relatively obscure mpv feature. Why is the C locale not UTF-8? Why did POSIX not standardize an UTF-8 locale? Well, according to something I heard a few years ago, they're considering disallowing UTF-8 as locale, because UTF-8 would violate certain ivnariants expected by C or POSIX. (But I'm not sure if I remember this correctly - probably better not to rage about it.) Now, on to libarchive. libarchive intentionally uses the locale API and all the broken crap around it to "convert" UTF-8 or UTF-16 (as contained in reasonably sane archive formats) to "char*". This is a good start! Since glibc does not think that the C locale uses UTF-8, this fails for mpv. So trying to use archive_entry_pathname() to get the archive entry name fails if the name contains non-ASCII characters. Maybe use archive_entry_pathname_utf8()? Surely that should return UTF-8, since its name seems to indicate that it returns UTF-8. But of fucking course it doesn't! libarchive's horribly convoluted code (that is full of locale API usage and other legacy shit, as well as ifdefs and OS specific code, including Windows and fucking Cygwin) somehow fucks up and fails if the locale is not set to UTF-8. I made a PR fixing this in libarchive almost 2 years ago, but it was ignored. So, would archive_entry_pathname_w() as fallback work? No, why would it? Of course this _also_ involves shitfucked code that calls shitfucked standard functions (or OS specific ifdeffed shitfuck). The truth is that at least glibc changes the meaning of wchar_t depending on the locale. Unlike most people think, wchar_t is not standardized to be an UTF variant (or even unicode) - it's an encoding that uses basic units that can be larger than 8 bit. It's an implementation defined thing. Windows defines it to 2 bytes and UTF-16, and glibc defines it to 4 bytes and UTF-32, but only if an UTF-8 locale is set (apparently). Yes. Every libarchive function dealing with strings has 3 variants: plain, _utf8, and _w. And none of these work if the locale is not set. I cannot fathom why they even have a wchar_t variant, because it's redundant and fucking useless for any modern code. Writing a UTF-16 to UTF-8 conversion routine is maybe 3 pages of code, or a few lines if you use iconv. But libarchive uses all this glorious bullshit, and ends up with 3 not working API functions, and with over 4000 lines of its own string abstraction code with gratuitous amounts of ifdefs and OS dependent code that breaks in a fairly common use case. So what we do is: - Use the idiotic POSIX 2008 API (uselocale() etc.) (Too bad for users who try to build this on a system that doesn't have these - hopefully none are left in 2017. But if there are, torturing them with obscure build errors is probably justified. Might be bad for Windows though, which is a very popular platform except on phones.) - Use the "C.UTF-8" locale, which is probably not 100% standards compliant, but works on my system, so it's fine. - Guard every libarchive call with uselocale() + restoring the locale. - Be lazy and skip some libarchive calls. Look forward to the unlikely and astonishingly stupid bugs this could produce. We could also just set a C UTF-8 local in main (since that would have no known negative effects on the rest of the code), but this won't work for libmpv. We assume that uselocale() never fails. In an unexplainable stroke of luck, POSIX made the semantics of uselocale() nice enough that user code can fail failures without introducing crash or security bugs, even if there should be an implementation fucked up enough where it's actually possible that uselocale() fails even with valid input. With all this shitty ugliness added, it finally works, without fucking up other parts of the player. This is still less bad than that time when libquivi fucked up OpenGL rendering, because calling a libquvi function would load some proxy abstraction library, which in turn loaded a KDE plugin (even if KDE was not used), which in turn called setlocale() because Qt does this, and consequently made the mpv GLSL shader generation code emit "," instead of "." for numbers, and of course only for users who had that KDE plugin installed, and lived in a part of the world where "." is not used as decimal separator. All in all, I believe this proves that software developers as a whole and as a culture produce worse results than drug addicted butt fucked monkeys randomly hacking on typewriters while inhaling the fumes of a radioactive dumpster fire fueled by chinese platsic toys for children and Elton John/Justin Bieber crossover CDs for all eternity.
Fix that libarchive fails to return filenames for UTF-8/UTF-16 entries. The reason is that it uses locales and all that garbage, and mpv does not set a locale. Both C locales and wchar_t are shitfucked retarded legacy braindeath. If the C/POSIX standard committee had actually competent members, these would have been deprecated or removed long ago. (I mean, they managed to remove gets().) To justify this emotional outbreak potentially insulting to unknown persons, I will write a lot of text. Those not comfortable with toxic language should pretend this is a religious text. C locales are supposed to be a way to support certain languages and cultures easier. One example are character codepages. Back when UTF-8 was not invented yet, there were only 255 possible characters, which is not enough for anything but English and some european languages. So they decided to make the meaning of a character dependent on the current codepage. The locale (LC_CTYPE specifically) determines what character encoding is currently used. Of course nowadays, this is legacy nonsense. Everything uses UTF-8 for "char", and what doesn't is broken and terrible anyway. But the old ways stayed with us, and the stupidity of it as well. C locales were utterly moronic even when they were invented. The locale (via setlocale()) is global state, and global state is not a reasonable way to do anything. It will break libraries, or well modularized code. (The latter would be forced to strictly guard all entrypoints set set/restore locales, assuming a single threaded world.) On top of that, setting a locale randomly changes the semantics of a bunch of standard functions. If a function respects locale, you suddenly can't rely on it to behave the same on all systems. Some behavior can come as a surprise, and of course it will be dependent on the region of the user (it doesn't help that most software is US-centric, and the US locale is almost like the C locale, i.e. almost what you expect). Idiotically, locales were not just used to define the current character encoding, but the concept was used for a whole lot of things, like e. g. whether numbers should use "," or "." as decimal separaror. The latter issue is actually much worse, because it breaks basic string conversion or parsing of numbers for the purpose of interacting with file formats and such. Much can be said about how retarded locales are, even beyond what I just wrote, or will wrote below. They are so hilariously misdesigned and insufficient, I can't even fathom how this shit was _standardized_. (In any case, that meant everyone was forced to implement it.) Many C functions can't even do it correctly. For example, the character set encoding can be a multibyte encoding (not just UTF-8, but awful garbage like Shift JIS (sometimes called SHIT JIZZ), yet functions like toupper() can return only 1 byte. Or just take the fact that the locale API tries to define standard paper sizes (LC_PAPER) or telephone number formatting (LC_TELEPHONE). Who the fuck uses this, or would ever use this? But the badness doesn't stop here. At some point, they invented threads. And they put absolutely no thought into how threads should interact with locales. So they kept locales as global state. Because obviously, you want to be able to change the semantics of basic string processing functions _while_ they're running, right? (Any thread can call setlocale() at any time, and it's supposed to change the locale of all other threads.) At this point, how the fuck are you supposed to do anything correctly? You can't even temporarily switch the locale with setlocale(), because it would asynchronously fuckup the other threads. All you can do is to enforce a convention not to set anything but the C local (this is what mpv does), or to duplicate standard functions using code that doesn't query locale (this is what e.g. libass does, a close dependency of mpv). Imagine they had done this for certain other things. Like errno, with all the brokenness of the locale API. This simply wouldn't have worked, shit would just have been too broken. So they didn't. But locales give a delicious sweet spot of brokenness, where things are broken enough to cause neverending pain, but not broken enough that enough effort would have spent to fix it completely. On that note, standard C11 actually can't stringify an error value. It does define strerror(), but it's not thread safe, even though C11 supports threads. The idiots could just have defined it to be thread safe. Even if your libc is horrible enough that it can't return string literals, it could just just some thread local buffer. Because C11 does define thread local variables. But hey, why care about details, if you can just create a shitty standard? (POSIX defines strerror_r(), which "solves" this problem, while still not making strerror() thread safe.) Anyway, back to threads. The interaction of locales and threads makes no sense. Why would you make locales process global? Who even wanted it to work this way? Who decided that it should keep working this way, despite being so broken (and certainly causing implementation difficulties in libc)? Was it just a fucked up psychopath? Several decades later, the moronic standard committees noticed that this was (still is) kind of a bad situation. Instead of fixing the situation, they added more garbage on top of it. (Probably for the sake of "compatibility"). Now there is a set of new functions, which allow you to override the locale for the current thread. This means you can temporarily override and restore the local on all entrypoints of your code (like you could with setlocale(), before threads were invented). And of course not all operating systems or libcs implement this. For example, I'm pretty sure Microsoft doesn't. (Microsoft got to fuck it up as usual, and only provides _configthreadlocale(). This is shitfucked on its own, because it's GLOBAL STATE to configure that GLOBAL STATE should not be GLOBAL STATE, i.e. completely broken garbage, because it requires agreement over all modules/libraries what behavior should be used. I mean, sure, makign setlocale() affect only the current thread would have been the reasonable behavior. Making this behavior configurable isn't, because you can't rely on what behavior is active.) POSIX showed some minor decency by at least introducing some variations of standard functions, which have a locale argument (e.g. toupper_l()). You just pass the locale which you want to be used, and don't have to do the set locale/call function/restore locale nonense. But OF COURSE they fucked this up too. In no less than 2 ways: - There is no statically available handle for the C locale, so you have to initialize and store it somewhere, which makes it harder to make utility functions safe, that call locale-affected standard functions and expect C semantics. The easy solution, using pthread_once() and a global variable with the created locale, will not be easily accepted by pedantic assholes, because they'll worry about allocation failure, or leaking the locale when using this in library code (and then unloading the library). Or you could have complicated library init/uninit functions, which bring a big load of their own mess. Same for automagic DLL constructors/destructors. - Not all functions have a variant that takes a locale argument, and they missed even some important ones, like snprintf() or strtod() WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK WHAT THE FUCK I would like to know why it took so long to standardize a half-assed solution, that, apart from being conceptually half-assed, is even incomplete and insufficient. The obvious way to fix this would have been: - deprecate the entire locale API and their use, and make it a NOP - make UTF-8 the standard character type - make the C locale behavior the default - add new APIs that explicitly take locale objects - provide an emulation layer, that can be used to transparently build legacy code without breaking them But this wouldn't have been "compatible", and the apparently incompetent standard committees would have never accepted this. As if anyone actually used this legacy garbage, except other legacy garbage. Oh yeah, and let's care a lot about legacy compatibility, and let's not care at all about modern code that either has to suffer from this, or subtly breaks when the wrong locales are active. Last but not least, the UTF-8 locale name is apparently not even standardized. At the moment I'm trying to use "C.UTF-8", which is apparently glibc _and_ Debian specific. Got to use every opportunity to make correct usage of UTF-8 harder. What luck that this commit is only for some optional relatively obscure mpv feature. Why is the C locale not UTF-8? Why did POSIX not standardize an UTF-8 locale? Well, according to something I heard a few years ago, they're considering disallowing UTF-8 as locale, because UTF-8 would violate certain ivnariants expected by C or POSIX. (But I'm not sure if I remember this correctly - probably better not to rage about it.) Now, on to libarchive. libarchive intentionally uses the locale API and all the broken crap around it to "convert" UTF-8 or UTF-16 (as contained in reasonably sane archive formats) to "char*". This is a good start! Since glibc does not think that the C locale uses UTF-8, this fails for mpv. So trying to use archive_entry_pathname() to get the archive entry name fails if the name contains non-ASCII characters. Maybe use archive_entry_pathname_utf8()? Surely that should return UTF-8, since its name seems to indicate that it returns UTF-8. But of fucking course it doesn't! libarchive's horribly convoluted code (that is full of locale API usage and other legacy shit, as well as ifdefs and OS specific code, including Windows and fucking Cygwin) somehow fucks up and fails if the locale is not set to UTF-8. I made a PR fixing this in libarchive almost 2 years ago, but it was ignored. So, would archive_entry_pathname_w() as fallback work? No, why would it? Of course this _also_ involves shitfucked code that calls shitfucked standard functions (or OS specific ifdeffed shitfuck). The truth is that at least glibc changes the meaning of wchar_t depending on the locale. Unlike most people think, wchar_t is not standardized to be an UTF variant (or even unicode) - it's an encoding that uses basic units that can be larger than 8 bit. It's an implementation defined thing. Windows defines it to 2 bytes and UTF-16, and glibc defines it to 4 bytes and UTF-32, but only if an UTF-8 locale is set (apparently). Yes. Every libarchive function dealing with strings has 3 variants: plain, _utf8, and _w. And none of these work if the locale is not set. I cannot fathom why they even have a wchar_t variant, because it's redundant and fucking useless for any modern code. Writing a UTF-16 to UTF-8 conversion routine is maybe 3 pages of code, or a few lines if you use iconv. But libarchive uses all this glorious bullshit, and ends up with 3 not working API functions, and with over 4000 lines of its own string abstraction code with gratuitous amounts of ifdefs and OS dependent code that breaks in a fairly common use case. So what we do is: - Use the idiotic POSIX 2008 API (uselocale() etc.) (Too bad for users who try to build this on a system that doesn't have these - hopefully none are left in 2017. But if there are, torturing them with obscure build errors is probably justified. Might be bad for Windows though, which is a very popular platform except on phones.) - Use the "C.UTF-8" locale, which is probably not 100% standards compliant, but works on my system, so it's fine. - Guard every libarchive call with uselocale() + restoring the locale. - Be lazy and skip some libarchive calls. Look forward to the unlikely and astonishingly stupid bugs this could produce. We could also just set a C UTF-8 local in main (since that would have no known negative effects on the rest of the code), but this won't work for libmpv. We assume that uselocale() never fails. In an unexplainable stroke of luck, POSIX made the semantics of uselocale() nice enough that user code can fail failures without introducing crash or security bugs, even if there should be an implementation fucked up enough where it's actually possible that uselocale() fails even with valid input. With all this shitty ugliness added, it finally works, without fucking up other parts of the player. This is still less bad than that time when libquivi fucked up OpenGL rendering, because calling a libquvi function would load some proxy abstraction library, which in turn loaded a KDE plugin (even if KDE was not used), which in turn called setlocale() because Qt does this, and consequently made the mpv GLSL shader generation code emit "," instead of "." for numbers, and of course only for users who had that KDE plugin installed, and lived in a part of the world where "." is not used as decimal separator. All in all, I believe this proves that software developers as a whole and as a culture produce worse results than drug addicted butt fucked monkeys randomly hacking on typewriters while inhaling the fumes of a radioactive dumpster fire fueled by chinese platsic toys for children and Elton John/Justin Bieber crossover CDs for all eternity.
И чо?
||=== Build неудачно: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Насколько оправдано учить C для Data Science?
Есть ли вообще какое-то применение няшной Сишки в Data Analysis, Big Data Analysis, (короче говоря, там, где сейчас доминируют Python, R и Julia)?
Нинасколько.
Конечно, все кишки питонов/р/юли/любого-фреймворка-чилсодробилки написаны на си/плюсах, но это именно инженегровые задачи, имеющие посредственное отношение к датасаенсу.
Да я просто думал, что если знать Сишку, то можно её прямо в Юльке вызывать, а это + к скорости расчетов
А, ну и заметил вот что: если пакет для какого-нибудь R переписывают с этого самого R на C/C++, то время расчетов уменьшается раз в 10-50 минимум, без шуток. Поэтому и стало интересно.
Только в случае пакетной обработки какого-то большого множества, разве что. Потому что FFI сам по себе имеет достаточно большие накладные расходы.
>>20342
Увеличив тем самым в 10-50 раз время разработки и поиска багов.
Байтоебство хорошо только тогда, когда без него либо в принципе никак (библиотеки драйвера, рантаймы и операционные системы), либо оно дает такие преимущества продукту что без него нельзя.
Как пример - видеоигры, там если на топ пеке нельзя поиграть в 4к60фпс - тебя скорее всего обоссут и накидают минусов в стиме, по этому как минимум движок игры должен быть написан на крестах и хорошо оптимизирован.
А вот если какая-нибудь опердень ускорится с 5 секунд до двух - этого юзер "тетя маня" особо не заметит, а вот времени ты въебешь намного больше и когда наступит время релиза ты с удивлением для себя увидишь, что рынок поделен продуктами конкурентов и все обсуждают именно их.
>
> Только в случае пакетной обработки какого-то большого множества, разве что. Потому что FFI сам по себе имеет достаточно большие накладные расходы.
> Увеличив тем самым в 10-50 раз время разработки и поиска багов.
А в чем проблема написать аналоги функций R на Сишке, оставив им те же имена? Так и баги проще ловить, и скорость - топ. Банально, подключаешь библиотеку yoba_c, функции которой перекрывают стандартные и вперёд. Благо что в R можно свои функции вообще не писать, а ебашить макросы Scheme-style. Соответственно, если в маленькой функции на C явных багов нет, то их не будет и в макросе.
C нужен для разработки ПО для обезьян задействованных в дата саенс. С это про другое. Твой сраный эр, пайфон написаны на высокоуровневом С. Сечёшь мою мысль? Тот питух, что тебе писал про игровые движки — лох, чмо, дегенерат. Ffi, игровые движки, хуйню какую-то наплел олень малолетний.
MinGW GCC
А если этот сишный код как следует отпидорасить, и вынести всё что можно вынести на GPU — можно получить такой же прирост даже относительно кода на C.
Только всем похуй, датасаенс — это про хуяк-хуяк скриптик накидал, за пару часиков посчитал, гистограмку нарисовал и забыл, а не про долгую еблю с выдрачиванием перформанса.
Сравнительно да. В любом случае, всегда можно найти пакет, который делает то же самое, но в нём этого бага нет, зато есть 100500 других, которые ты не заметишь и которые похерят цифры в твоих данных.
Где ты его взял, блядь. Есть for, while, do..while./ Какой наху loop statement , ты дурак?
ПУПА
Вот когда ты исправшишь loop на for будешь ещё два дня не поймёшь почему программа падает иногда.
Что за заloop?
И как оно брать данные с массива на стеке, не зная что там вообще внутри лежит, и сравнивать с нулем?
Добавил еще *storage == EOF
Так уже получше. Во всяком случае точно не упадёт, если указатель в функцию передашь валидный. Хотя лучше проверить вместе с isspace и на конец строки.
У тебя в предыдущей версии в условии использовался || а надо было &&.
Пендюх, бизнесу делают мани те, кто пишет софт. Дата саенст окромя теории математической нихуя не могут. Весь их вклад — это реализация блоков воедино в уже готовом софте. Это как рнр макаки от мира математики.
ch = getchar() -> Ввожу в инпут igor\n, куда уходят gor\n? Если я вызову функцию типа fgets(string, n, stdin) эта часть уйдет в неё? Эти литералы стоят в стаке и ждут функцию которая принимает ввод? Или они в буфере? Или стак это буфер? Помогите долбоебу.
Спасибо. Я об этом ваще забыл.
Я готов закончить вышку ради работы на плюсах. Мне 22 просто проебался немного по молодости.
Ну, все зависит от прохождения собеседования и если контора не будет интересоваться твоим образованием. Но опять же, на собеседовании могут спросить про какое то перемножение матриц, и ты обосрешься без образования, даже школьного.
У меня при трудоустройстве никто не спрашивал об образовании, никто даже не интересовался какой вуз я закончил и какое направление. Думаю нас таких много.
Есть программа: int main(){}.
Пробовал компилировать ее
clang -Oz -nostlib
и
clang -O0 -nostlib
и она один хуй весит 9.2 кб
Вопрос: какого хуя?
В первом случае 9352 байта, а во втором 9360 байт, если быть точным. Что в этой программе, которую я уже не знаю как сделать проще, весит так много? Еще заметил, что все мои хелловорлды от 5 до 200 строк всегда весят 16-19 кб. Что помимо стдлибы занимает большую часть экзекутабла?
В исполняемом файле присутствуют адреса линкуемых либ, присутствуют GOT и PLT таблицы, для динамического резолвинга названий функций и загрузку нужных динамических библиотек(грубо говоря) с нужными функциями.
Так же main не является точкой входа фактической дл ОС, а конец ее не является выходом из процесса, и из-за этого есть ещё crt*.o файлы которые компилятор линкует к исполняемому файлу почти всегда.
Все это так называемый Сишный рантайм, без него никуда в обычных ОС, но это можно отключить флагами компилятору/линковщику.
нужно ли уметь на с закодить всего дональда кнута?
или нужно на с сортировки кодить?
или что вообще нужно уметь на с, чтобы вкатица в nasa ?
> подскажите что выучить (какие мануалы, какие либо прорешать) по с или с++ чтобы устроиться в nasa ?
Всё. Надо выучить всё.
> нужно ли уметь на с закодить всего дональда кнута?
Да, и Дональда Трампа тоже.
> или нужно на с сортировки кодить?
Можно кодить и не сортировки.
> или что вообще нужно уметь на с, чтобы вкатица в nasa ?
Надо уметь всё.
Странно обсуждать единицы байт, когда бинарники по сотне мегабайт стали нормой.
Ну смотри, можно еще уметь не все, а только половинку но тогда не совсем в NASA возьмут, в ASSA возьмут
♂ SLAVE, GET YOUR ASS BACK HERE! ♂
Скорее напоминание того как мало раньше добавляли служебной инфы в бинарь. Впрочем, a.out предельно простой формат, там иначе и быть не могло.
У МЕНЯ ЕСТЬ ♂ DEEP ♂ DARK ♂ FANTASY ♂, МЕЧТАЮ НАПИСАТЬ МИКРОЯДРО ПОХЛЕЩЕ ЧЕМ В WINDOWS И ПОХЛЕЩЕ ЧЕМ L4Ka::Pistachio НА ЯЗЫКЕ ♂ СИ ♂
>L4Ka::Pistachio НА ЯЗЫКЕ
Лучше можно. Но только, наверное, на ассемблере. И всё равно по спецификации L4X2. Т.е. закодировать можно лучше, а вот спроектировать уже нет.
Это не норма, так же как и статическая сборка не норма.
Определение нормы: посчитай средний размер бинаря на твоей системе. Это сильно меньше, чем 1е8
Я в бородатые времена использовал САПР Proteus для этих целей, там можно собирать схемки на микрухах, заливать на них hex файлы и смотреть как они отрабатывают, очень годная тема. Но она для винды и не бесплатная. А так можешь посмотреть что-то из списка на пике, может найдёшь что-нибудь.
Это заблуждение. И вообще глупо сравнивать. L4 оперирует только временем и памятью. Ядро Linux это полноценное ядро с файловой системой, сетевой подсистемой, вытеснением страниц и множеством драйверов. Ты вообще не понимаешь о чём говоришь.
Это как сравнивать кирпич и дом.
Подумай это.
Ты точно понимаешь как работает среднее арифметическое?
Достаточно пары программ в 10-100 Мб - игры, блендер, офис - чтобы такое перекрыть тебе понадобится миллион линукс-вей 10кб бинарников.
Я выбираю дом.
Тем более он сделан из нормальных кирпичей ответственных за память и время.
А не какой-то кусок говна из под немецкого исследовательского центра.
Претензии?
Я прочитал фулл спецификацию микроядра L4 и их API. Меня не впечатлило, наоборот выглядело бесполезно без остального софта, чисто бесполезное микроядро, ну и по классике - безопасность на руки программиста кладётся. То есть немцы даже не парились. Тупое говно тупого говна.
Ну и код чекал, такое говно конечно написать - это надо уметь.
Ну это просто твоё "красноглазие" говорит.
Был один true Linux, да и тот стал маргинальным.
> Я выбираю дом.
Другого от юзера ожидать не приходится.
Ну он тут прав.
Slackware же. Один из старейших линуксов из ныне живущих. Где-то ровесник Красной Шапки и Дебиана. Знаменит тем, что не прогибается под моду, а чисто идёт по классическому Unix way. За что и поплатился падением популярности.
> Ну он тут прав.
Чем?
>true Linux
А что для тебя true Linux? Чтоб консолечка и текстовый инсталлятор и ну это пакеты были простым архивом, и конфиги текстовые, да? Другого от туповатого дегрода ожидать не приходится.
>Другого от юзера ожидать не приходится.
Мать твоя юзер :)
А я вполне себе портирую ядро Линукс на другие железки на работе, маня.
>>22811
Ну основной способ передачи данных между сервисами в микроядер это посылка сообщений. Валидность сообщений кладется на руки программиста. Грубо говоря ты можешь послать хитровыебаное сообщение и обвалить нахер всю ОС.
Для сравнения у меня после kernel panic ядро линукс продолжало работать, после пропуска события, recovery из внештатной ситуации вполне работал.
>>22820
>консолечка и текстовый инсталлятор и ну это пакеты были простым архивом, и конфиги текстовые
Ясно. Можешь больше не писать. Мне все понятно.
>>22828
https://www.opengroup.org/openbrand/register/brand3581.htm
Заплатили бабло Apple, ось у них true unix как бэ де юре.
Де факто любая ос которая имплементит posix может пройти сертификацию и стать true unix, было бы желание и деньги.
>>22834
Читай матчасть.
>А что для тебя true Linux?
В глаза долбишься? Это Slackware.
И Патрик хуй ложил на systemd. А вы прогнулис.
>туповатого дегрода
Клоун, следи за базаром.
>А я вполне себе портирую ядро Линукс на другие железки на работе
Да мог бы и не признаваться. И так видно что ты обезьяна. Портирует он. Ха ха. Ну на назови ДВЕ железки, куда ты портирровал ядро Linux.
>Грубо говоря ты можешь послать хитровыебаное сообщение и обвалить нахер всю ОС.
Сразу видно что ты читал, но не понимал. L4 поддерживает три типа данных в сообщения - регистры сообщений, "строки" и memory mapping. Сможешь придумать сценарий как послать "хитровыебанное" сообщение?
>Для сравнения у меня после kernel panic ядро линукс продолжало работать
Пикрелейтед.
Ну и как бы тебе напомню что большинство микроядер позволяет сценарий запуска драйвера в выделенном адресном пространстве. Разумеется, с просадкой производительности. Но при этом kernel panic уходит в историю.
Какой-то зоопарк, я ебал, о чем вы спорите вообще? Одни делают вещи невозможное возможным, другие делают возможное нужным, и так по кругу. Воистину манямирок с какими-то односторонними иерархиями в голове. Ты еще скажи, что философы паразитируют на достижениях физиков, и стрелочка не поворачивается.
> >А что для тебя true Linux?
> В глаза долбишься? Это Slackware.
> И Патрик хуй ложил на systemd. А вы прогнулис.
У меня OpenRC в генту, впрочем не вижу ничегo плохого в systemd. Проблемы?
> >туповатого дегрода
> Клоун, следи за базаром.
Давай, клоун, поясняй что ж плохого в systemd?
> >А я вполне себе портирую ядро Линукс на другие железки на работе
> Да мог бы и не признаваться. И так видно что ты обезьяна. Портирует он. Ха ха. Ну на назови ДВЕ железки, куда ты портирровал ядро Linux.
Две борды внутреннего использования на MIPS.
> >Грубо говоря ты можешь послать хитровыебаное сообщение и обвалить нахер всю ОС.
> Сразу видно что ты читал, но не понимал. L4 поддерживает три типа данных в сообщения - регистры сообщений, "строки" и memory mapping. Сможешь придумать сценарий как послать "хитровыебанное" сообщение?
Да, посылаю сервису запрос, оно кидает дальше невалидное сообщение. Вполне себе сценарий уязвимости.
> >Для сравнения у меня после kernel panic ядро линукс продолжало работать
> Пикрелейтед.
> Ну и как бы тебе напомню что большинство микроядер позволяет сценарий запуска драйвера в выделенном адресном пространстве. Разумеется, с просадкой производительности. Но при этом kernel panic уходит в историю.
Так пишешь будто драйвер не общается с ядром вообще. Если происходит общение - возможен и обвал. Тем более если ядро не следит за валидностью посланных данных.
Дуй, маня, отсюда. Маловат ещё.
Ебать ты долбоеб, земля тебе пухом, братишка.
Мне тоже кажется что Макось это тру Юникс.
>в генту
Уровень красноглазия зашкаливает.
>Две борды внутреннего использования на MIPS.
Ну так я и говорю - обезъяна. Не приписывай себе чужих заслуг, Linux на MIPS портирован более 20 лет назад. https://opennet.ru/docs/HOWTO/MIPS-HOWTO.html
> Да, посылаю сервису запрос, оно кидает дальше невалидное сообщение.
Ты так и не ответил, как повалить. Пример невалидного сообщения приведи.
> Так пишешь будто драйвер не общается с ядром вообще. Если происходит общение - возможен и обвал. Тем более если ядро не следит за валидностью посланных данных.
Ну путай микроядро и ядро. Ещё раз - микроядро просто предоставляет абстракции для процессов, нитей, сообщений и мапинга памяти. Ему вообще похрен что передаётся в сообщениях.
Открою тебе серкет, но только тебе. При кривом дизайне того, что крутится поверх микроядра, возможна другая проблема, о которой ты не упомянул - flooding. Если какой-то процесс "сойдёт с ума" и начнёт спамить сообщениями. Вот это может быть проблемой. Но повторюсь - при кривом дизайне ОС.
>Маловат ещё.
Можешь прикинуть мой возраст, если впервые Linux я установил в 1995 году. С дискет.
И, кстати, вот на это можешь не отвечать:
>>>1822898
>>>Linux на MIPS портирован более 20 лет назад.
Я представляю трудозатраты на портирование на новое железо. С точки зрения "вкатывальщиков" это уровень Бог. Но бородатые дяди не оценят. Если без троллинга, обычная задача для обычного программиста.
> >в генту
> Уровень красноглазия зашкаливает.
Будто слака это не красноглазие
> >Две борды внутреннего использования на MIPS.
> Ну так я и говорю - обезъяна. Не приписывай себе чужих заслуг, Linux на MIPS портирован более 20 лет назад. https://opennet.ru/docs/HOWTO/MIPS-HOWTO.html
Ты тупой? Ты точно тупой. Я завел борду, а не архитектуру. И ты ещё тут что-то мне пишешь? Можешь нахуй сходить, маня.
> > Да, посылаю сервису запрос, оно кидает дальше невалидное сообщение.
> Ты так и не ответил, как повалить. Пример невалидного сообщения приведи.
Прям сейчас сяду и начну писать код под это говно. Делать мне нехуй для тупого дурачка с борд хуиту писать.
> > Так пишешь будто драйвер не общается с ядром вообще. Если происходит общение - возможен и обвал. Тем более если ядро не следит за валидностью посланных данных.
> Ну путай микроядро и ядро. Ещё раз - микроядро просто предоставляет абстракции для процессов, нитей, сообщений и мапинга памяти. Ему вообще похрен что передаётся в сообщениях.
А зря. Это его основная проблема.
> Открою тебе серкет, но только тебе. При кривом дизайне того, что крутится поверх микроядра, возможна другая проблема, о которой ты не упомянул - flooding. Если какой-то процесс "сойдёт с ума" и начнёт спамить сообщениями. Вот это может быть проблемой. Но повторюсь - при кривом дизайне ОС.
Это кривой дизайн микроядра такое допускает.
> >Маловат ещё.
> Можешь прикинуть мой возраст, если впервые Linux я установил в 1995 году. С дискет.
По-моему ты просто родился в 1995 и так цепляешься за эту цифру
Я в это время универ закончил.
Куда сложнее завести gcc/binutils/glibc для новой архитектуры.
Ядро портировать на обычную risc архитектуру дело пары месяцев.
А вот смержить в апстрим дело пары лет.
>Будто слака это не красноглазие
Sllacware это unix way.
> Я завел борду
Так это не повод для гордости.
> Это его основная проблема.
> Это кривой дизайн микроядра такое допускает.
Если бы ты ещё чего-нить в этом понимал. Пиздеть - не мешки ворочать. А дрвйвер-то хоть один написал под Linux? Вот так чтобы под новое железо, а не тупо переопределить адреса портов.
> Я в это время универ закончил.
Я тоже.
>>22925
>Ядро портировать на обычную risc архитектуру дело пары месяцев.
Ну хуй знает. В одно лицо за пару месяцев это не сделаешь. Если новая именно архитектура, то пару месяцев это только чтобы оно собралось. А затем год(ы) чтобы заработал стабильно.
Аааааа щас меня будет бесить то что моё решение не сработало. СУККААААААААААААААААААААААА
Идея очевидна, даже не читая код, сразу догадался, что там будет, хоть я и мимокрок-питонист. Но блять, насколько же СИ тяжело читать и понимать код, это пиздец.
Это типа стартовые задачки, которые легкие, легче блять не найти. Нужно написать самому все строковые функций которые в библиотеке есть.
ДА БЛЯТЬ ЧУВАК КАК? КАК?
Точно блять можно же было еще один поинтер заюзать, сукаааааааааааааааааааааааааааааааааааааааааааааааааааааа
>О, самое адекватное решение той задачи
Увы, нет. Его вариант может портить стэк. Вот так безопаснее.
Та не, я думал именно шоб конпелятор придумал какую-то дешевую проверку, чтоб в слове есть нулевые байты
Попробуй
MOV RDI, RAX
MOV RCX, -1
XOR AL, AL
REPNE SCASB
NEG RCX
MOV RAX, RCX
>>23162
Бранчи могут поломать конвейер. Вероятно что компилятор это понимает. Хотя скорее всего я гоню. По скорости всё равно так не выиграешь - укзкое место это обмен между памятью и процессором. Как только данные попали в кэш, твой вариант оптимизации смысла не имеет.
Хуй будешь?
Обосрамус в самом начале, где ты char сравниваешь c eof, который -1. Со знаковым ч это сработает на символе del, с беззнаковым - никогда.
Окей поставлю повтор ввода пока пользователь не напишет quit.
Хотя в линухе всё работает. Ctrl+D выходит по маслу. В каждой системе же свой EOF. Я потом добавлю Quit.
Да я думал типа абстрактное мышление прокачивать, в голове продумывать. Буду рисовать чо.
На примере Линуса мы узнали что никакой разницы, и грубящий гуру так же получает леща.
>мы
Не "мы", а ты. Анонимность конечно чуть-чуть помогает, но несколько строк вполне характеризуют скиллы человека.
Нет никакого "мы". Не успокаивай себя.
Никто не принимает долбоящерские идеи говенного микроядра? Нассали в рот и в жопу и никакого ощущения что кому-то есть дело до твоей писанины? Сожалею.
Может ещё накинь статеек, может 1 анчоус прочитает их, сидя на толкане. Если кому-то вообще есть дело до твоей писанины, шизик))
Никому не грублю, я вообще NPC но если будет сложная задача, буду сидеть пока не сдохну или не решу.
>выдающийся австрийский зоолог и зоопсихолог[6], один из основоположников этологии — науки о поведении животных
Ясно. Ну я предпочитаю с животными не работать. Хотя нет, попугайчик на плече сидит когда код пишу.
Я знаю что такое EOF. Не факт что в системе он будет -1, у каждой системы своё значение. А gets мне зачем перечитывать? Это строковая функция.
Сотворили себе кумира и носитесь с ним.
Лучше посмотри на картинку и охуей.
Единственное что могу сказать - только полгода прошло с того момента, как с этого сервака перешли на другой и он сейчас в резерве. До этого он обслуживал десятки тысяч запросов ежедневно.
То что у тебя аптайм большой никак не позволяет гению агриться в сторону других.
А ты - в бессильной злобе бесится воинствующая безграмотность.
Я их оторву и мы вместе пойдем на бал. В мою честь... И салюты там будут в мою честь...
Ой блять
Во первых где я сказал, что gets это одно и тоже, а во вторых я его даже не использую в коде, это какой то чувак жопой читает.
Что?
>То что у тебя аптайм большой никак не позволяет гению агриться в сторону других.
А кто гений? Торвальдс?
Ну вот смотри. Условно людей в этой теме можно поделить на несколько категорий. Одни стремящиеся, они никому не грубят а лишь впитывают информацию. Мне вот симпатичен вот этот анон ->>23445
В теме есть несколько олдов, которые хоть обмазывают друг друга говном, но видно что они понимают о чём говорят.
И есть какой-то пёс, которой скулит, но выдаёт ноль осмысленной информации. При этом, судя по ответам, кроме фекалий его пасть ничего не выдаёт. Биомусор, короче.
Я вот с трудом допускаю что говен тут заливает тот же человек, который в других сообщениях говорит что-то по делу.
Если что, то вот эти посты мои -
>>23025
>>23148
>>23167
Осталось самолеты посчитать.
Ну смотри, все хипстеры - это пидоры. А пидоры - говно. Вот эти все ваши подвороты, жидкие бородки, смузя, вот все эти "прогрессивные" идеи феменизма, толерантности, бигендерства, экофашизма, БЛМ, куколд-движение, ненависть маскулинности, вот эта вся любовь к JS и React.JS, любовь к разработке "ПАЛЕЗНЫХ СЕРВИСАВ", катание на пидорскутере и ненависть к мужским мощным авто с ДВС выдает в этих всех людях говно-пидоров и вообще червей. Психолухи, инфоцигане, бизнес-КОУЧИ, в принципе, в ту же когорту.
Смотри, я сагрессировал чутка.
Вот моё говно -> >>23220
s_gets это версия gets но без проблем оригинала. Там отбрасывается \n заменой нулем если лимит не достигнут чтобы не дублировалась новая строка в getchar() в будущем. EOF юзается если нужно выйти из системы, всё по Пратовскому учебнику. Кстати я уже дописал что делал.
https://pastebin.com/y4tCvUCW
Ладно, я понимаю что ты зеленишь. Поэтому напишу как есть на самом деле.
getchar() возвращает int. Это больше чем char, поэтому там может быть или char, или EOF. Будет он -1 или не будет действительно неважно.
gets() возвращает указатель на ту же строку, если прочитал успешно, или NULL, если был EOF или другая ошибка.
Ух сколько же тут микроагрессии.
Пойду выпью клубничный смузи и подолблюсь в жопу, повейпив чутка.
> бизнес-КОУЧИ
На этом месте рука непроизвольно потянулась к пистолету.
Не, этология заебатая хорошая наука. Многие книги по этой теме интереснее приключенческой фантастики и детективов. С трудами этологов по качеству и полезности могут сравниться лишь "талмуды" с описанием железа и протоколов.
Осеннее послабление да?
The ^D character (aka \04 or 0x4) is the default value for the eof special control character parameter of the terminal or pseudo-terminal driver in the kernel (more precisely of the tty line discipline attached to the serial or pseudo-tty device).
Короче хватит читать жопой, ты не понимаешь, что какой то шизик жопой прочитал код, заменил у себя в бошке getchar() на gets() и думает, что не обосрался, но на самом деле просто не хочет признавать.
Для справки, никто сука не говорил иначе. Все прекрасно знают как всё работает. Просто банальное слабоумие паскододебила говорит за себя.
Какой еще getchar(), шиз? Покажи пост с кодом где использовался getchar. Использовался s_gets.
>Пойду выпью клубничный смузи и подолблюсь в жопу, повейпив чутка.
Удачно подхватить спид, пидрила.
Хуево получается чот. Маняхинатор блять.
Как гомопедрильный seax? Я думаю ты в этом профессионал.
Следи за своим батей.
А я пойду писать кастомный солюшен под фриртос с использованием mqtt esp32 bluetooth mesh сетей. Тебе такое даже и не снилось.
конечно, у меня ведь есть работа, поэтому у меня не так много времени чтобы в понедельник сидеть мамке систему автополива велосипедить для дачки.
Возможно.
Но я на дух непереношу всяких Петь Хуесосиповых, Хуязов Шлюхбудтиновых, Трахформаторов (оно это непонятное, блять, хоть знает что это за устройство такое, трансформатор?!) и т.д. Атсасизатора в ту же парашу (ну, хоть один взял себе псевдоним, который чуть-чуть, но отображает суть - человек, который связан с говном но, вообще, ассенизатор - уважаемая профессия, в принципе).
Ну а забугорные инфоцигане... Как я понимаю, суть их не лучше. Только они не так в открытую чушь несут и все, собственно, за это им только и респект.
Жопочтеца не исправит даже могила
>Я делаю станцию для лифта у себя в доме.
Так это задача не для программирования, а для разработки оптимального алгоритма. Закодировать это даже школьник способен, а вот разработать какой-то новый оптимальный алгоритм под эту тему, это уже не совсем тривиально. Это ж надо держать баланс между расходом электроэнергии, чтобы лифт попусту не гонять, и временем ожидания лифта.
Factorio IRL
Ага. Дуй на работу, раб!
РНН.
Только сишечка, только микрухи, только хардкор дома.
А ты там пахай на дяденьку за копеечку.
А я вот выйду на стартап и заработаю мешок золота.
Маразматик в треде, все в транзистор!
Ты дурак? Какой нахуй расход электроэнергии, открыл электричество на электромотор и он крутит, все! Кнопку тип в кабине нажал и тащит его на определенный этаж. Какой тут нахуй алгоритм, шизик? Ты ещё скажи что ты хотел бы отдефрагментировать стек.
А вот и нихуя!
Это тебя для "затравки"
http://ea.donntu.org:8080/jspui/bitstream/123456789/925/1/Алгоритм выбора направления движения кабины лифта.pdf
Но не факт что осилишь даже это.
Даунецкий выблядок.
Очередной прорывдаже сказал бы взрыв ДНР в области микроконтроллеров принес.
А если кнопку нажал и вышел, застрял, умер, МОРГ, гроб, кладбище? Или нажал все этажи? Или нажал с нижнего этажа и людям сверху нужно спуститься, а тебе выше их подниматься? Зачем еще раз ехать вниз, когда можно подняться на нужный этаж выше вызванного, высадить и спускаться вниз? Короче много вариантов.
Судя по все ебалай пишет, у него сажа по кд включена. Мог бы и не тратить время на уебанца.
Хрюн, тред сборщиков клубники там ->
А ты то программировать умеешь? Мне кажется ты банальный лох-вкатывальщик, который нихуя не умеет. А я вот указан как разработчик в паре общемировых и известных проектов, в том числе и на их сайтах указан как разработчик. Так что засунь свою культяпку себе в жопу и помалкивай там, если не сделал для опенсоурса и рынка ПО столько, сколько сделал я.
Пруфы тащи или иди нахуй.
Что ты только что сказал обо мне? Ты маленькая сучка. Чтобы ты знал, я вышел из матфака МФТИ с отличием и медалью. Как только я вышел из универа с красным дипломом, меня тут же повели за руку на рабочее место с зарплатой от 200к без испытательного срока как стажера с годовым опытом. Меня тренировали самые лучшие умы фирмы, я ходил среди них как равный и программировал процессоры как профессионал. Благодаря мне ты наверняка, маленькая колхозная тварина сейчас читаешь это сообщение. В отличие от тебя, говноеда нищука, я никогда не работал над попенсурсными проектами, ибо я не такой неудачник как ты. Я уважаю своё время и ресурсы. Подумай еще раз, ублюдок, перед тем как писать мне, божественному со-создателю современной линейки процессоров интел. Пока я пишу здесь, мои коллеги спрашивают совета. Я бы обоссал тебя десятьютысячными способами, но не желаю тратить время на тебя, жирного уродливого девственника. Если бы ты только знал, на что себя обрекаешь, не писал бы такие глупые комментарии мне, твоему идеалу, которым тебе никогда не стать. Ты проклятый идиот. Обоссан.
>пук
Ебать у тебя полыхнуло, лошок.
Без пруфов ты подзаборная шваль и твоё слово нихуя не стоит
Я не твоя мать. Ты путаешься, ахахаха
https://pastebin.com/nuWMMPyx
Ты умножаешь на 10 в цикле для перевода числа в следующий разряд. Но ты это делаешь всегда, в том числе и когда работаешь с единицами уже.
>>23589
> станция управления лифтом
> ESP32
> MQTT
> Bluetooth
> ни слова о цепях безопасности, о том, как это все будет подключено, о том будет ли частотник или нет, вот это вот все, как этим управлять
> ОЛГОРЕТМ ШТОБЫ ИКАНОМИТЬ ЛИХТРИЧИСТВА!!!1!1!
Парни... Вы серьезно? Какой, нахер, ESP32 в станции управления лифтом?) И, тем более, какой там нахрен мктт и бт?)))
Бля. Двач такой двач)
Оставил на потом, пока работает с делением. Но сегодня голова уже ебобо. Потом найду косяк перепишу. Спс.
> Или нажал с нижнего этажа и людям сверху нужно спуститься, а тебе выше их подниматься?
Уебок так вот из за кого меня сначала увозит вверх на пару этажей где пытается втиснуться баба срака, вместо того чтобы просто доставить меня хекку на первый. Надеюсь вам таким лифт оторвет яйца и вы не будуете размножаться.
Ну связь между кабиной и блоком управления по блютузу, можно поставить ретрансляторы и организацию на базе мэш сети, esp32 стоит дёшево и влепить их можно на каждом этаже. Управлять мотором можно через драйвер с мосфетом для ардуины, вполне тока в 5а хватит, радиатор можно прилепить. Даже если какой-то этаж выйдет из строя, то система все равно будет продолжать работу. Высокая отказоустойчивость достижима. А общение по блютузу можно сделать безопасным посредством lwip over bluetooth и сделать шифрованный канал связи на TLS. Главная esp32 будет обслуживать RESTful сервер, к которому будут обращаться остальные этажи. Ну и все написать можно на FreeRTOS.
А потом, возможно, не через 20 лет этот лифт, нахуй уезжает в потолок (естественно, с последующим сотрясений мозга у пассажиров). А потому что станция на esp32 повисла нахуй и ей все до пизды.
Двачую.
Кстати, предлагаю убрать ещё цепи безопасности дверей кабины и шахты. Это абсолютно не нужно, а то это как в этих старых лифтах.
А можно приделать внешний watchdog таймер, и если есп32 не успела сбросить этот таймер, блок управления лифтом перезагружается путем сброса электричества. Удобно. Современные технологии рулят!
Лифту и трос не нужен - он когда падает, наклоняется и клинит об стенки шахты.
А можно колесики с тормозами поставить и чтобы они со стенами лифта соприкасались.
Двачую, нахуй ловители. Тоже для старых пердунов.
Смотри, короч, сейчас в 2к20 в тренде лифты на ремнях, можно, крч, ремней понаспиздить где-то и на ременном приводе запилить.
Вообще, эти ремни делают из полимера, армированного стальными тросиками (кстати, благодаря им работает подобие СПК, но для ремней). Но будем использовать, какие найдем... Хоть даже и из кожи.
С кожаными ремнями у нас будет настоящий ♂️мужской лифт♂️, с ♂LEATHER BONDAGE♂️ и ♂️FUCKING SLAVES♂️
https://pastebin.com/CMV2SRMw
А потом из выхода говорить ♂️FUCK YOU♂️
За ♂️THREE HUNDRED BUCKS♂️ поедет ♂️TWO BLOCKS DOWN♂️
Чтобы выебать всех ♂️BOY NEXT DOOR♂️ на этаже
1) История о том, что массив функциональных указателей - не лучшая идея из-за неработающего в таком случае бранч предиктора, правдива или нет?
Ведь намного же красивее(и быстрее?) (foo)[offset], чем case(key_func)...
2) Почему с метками нельзя работать как с функциональными поинтерами?
3) Компелятор всегда присваивает энумерациям значения, начиная с 0,1,2,....?
4) Как компелятор выбирает тип для (s)size_t?
> 1) История о том, что массив функциональных указателей - не лучшая идея из-за неработающего в таком случае бранч предиктора, правдива или нет?
Как правило.
> 2) Почему с метками нельзя работать как с функциональными поинтерами?
Чтобы нельзя было впрыгнуть в случайную точку функции извне. В гцц есть &&
> 3) Компелятор всегда присваивает энумерациям значения, начиная с 0,1,2,....?
Да
> 4) Как компелятор выбирает тип для (s)size_t?
В заголовке определены как знаковый и беззнаковый типы, сравнимые по ширине с адресом.
> Ведь намного же красивее(и быстрее?) (foo)[offset], чем case(key_func)...
Расписываю.
Если функция локальна, то case 1: f(х);
может подставить f или по крайней мере специализировать передачу аргументов. Если нет, то два варианта. Если свич скомпилирован в табличный переход, то это хуже, чем массив функций: время уйдет на выборку адреса ветки из таблицы, переход на ветку и потом на вызов функции. Если же скомпилирован в условные переходы, то тут поможет предсказатель.
> Ньюби квешн пак не обоссыте, плез:
> 1) История о том, что массив функциональных указателей - не лучшая идея из-за неработающего в таком случае бранч предиктора, правдива или нет?
> Ведь намного же красивее(и быстрее?) (foo)[offset], чем case(key_func)...
Да. А вообще сложная тема так как процессор черный ящик по факту.
На суперпродвинутых процессорах как у х86-64 может быть оптимизация которая узнает фактический адрес прыжка(без самого прыжка), и начинает оттуда исполнять инструкцииА потом привет spectre/meltdown
На всяких процессорах попроще(in order) видел по чертежам(на гитхабе полно), что при на наступлении на бранч или прыжок по адресу просто конвейер сбрасывает состояние и прыгает втупую на новый адрес, не заранее, а уже по факту, и никакой разницы там не было.
> 2) Почему с метками нельзя работать как с функциональными поинтерами?
По факту нельзя. Есть расширение gccмне кажется оно есть на любую возможную хотелку
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
> 3) Компелятор всегда присваивает энумерациям значения, начиная с 0,1,2,....?
Нет, можешь сам задавать значение каждого элемента же.
> 4) Как компелятор выбирает тип для (s)size_t?
Ручками при сборке, при выборе архитектуры.
вообще, компиляторы могут делать лютое колдунство, например, вместо реального колла, проверяет равенство адреса в поинтере и адреса функции, и при совпадении просто переходит на заинлайненную версию функции (со всеми плюшками заинлайненной функции), ну а если не равно, то честн прыгает на адрес. В связи с этими инлайн-оптимизации у меня такое ощущение, что сейчас стоит отходить от стандартного сишного шаблона (.h - заголовок и .c - реализация), а тупо херачить хедер онли библиотеки, шоб компилятор мог всё агрессивно заинлайнить.
вообще, компиляторы могут делать лютое колдунство, например, вместо реального колла, проверяет равенство адреса в поинтере и адреса функции, и при совпадении просто переходит на заинлайненную версию функции (со всеми плюшками заинлайненной функции), ну а если не равно, то честн прыгает на адрес. В связи с этими инлайн-оптимизации у меня такое ощущение, что сейчас стоит отходить от стандартного сишного шаблона (.h - заголовок и .c - реализация), а тупо херачить хедер онли библиотеки, шоб компилятор мог всё агрессивно заинлайнить.
Пример покажи вот этого:
>проверяет равенство адреса в поинтере и адреса функции, и при совпадении просто переходит на заи
Ты наверное пытался описать tail call но у тебя вышло так коряво, что это выглядит еще дороже (лишние проверки)
>>24806
Имеет место быть такое уже на самом деле. Компиляторы нынче пиздецки умны.
>>24869
Я другой человек. У меня другой прикол был. Проект на Си на работе. Довелось заглянуть в релизную сборку с O3 на gcc 5.4.0(весьма олдовый уже), с включенными LTO и прочим. Был ивент луп, в котором перебирались структуры соединений, в структуре были функциональные указатели на обработчики (что-то закинуть в коннект, извлечь). Я был удивлен тем, что весь ивент луп был заинлайнен со всеми возможными функциями. inline принудительно не написан везде.
О3 оптимизации были выбраны путем лоад тестинга, так как показали наибольший перф. Ну и кодогенерации такая, что фиг вообще можно что-то понять где находится что в бинаре.
Принудительного инлайна нет лет 5 - он игорится.
Алсо инлайн это не всегда плюс - код может чаще вызывать кэшмиссы.
Ну там компилятор старый был. Продакшен на centos6, а за версию gcc ручаться не буду, возможно там и старее 5.4.0. У меня в контейнере гцц 5.4.0 стоит, что-то более новое проект не собирает в силу определенных причин.
ну это понятно, что инлай - для компилятора, как звонок -для учителя, лол
а как ввобще заинлайненная функция может вызвать больше кэшмиссов, по сравнению с обычным вызовом (не говоря уже о вызове по указателю)? ваще, конечно, хер знает, но мне кажется для современного проца идельный вариант - линейный код с простыми невложенными джампами. локальными джампаи, может. колл, по идее, может вызвать кэшмис(из-за нелокального доступа к памяти) , с другой стороны, колл на статический адрес наверняка предсказывается и соответствующая страничка префетчится в кэш. колл по указателю тоже (по идее, после нескольких вызовов проц выучит, что там реально только несколько функций реально используется, или же, банально, в хотлупе соответствующие странички не успеют из кэша вылезти).
У заинлайненной функции, однако, плюс в том, что не нужно исполнять ритуалы передачи аргументов по ABI, со всеми значениями работаем тупо на месте, оставляя компилятору максимальную свободу либо регистровой оптимизации, либо тупо раработы на прямо горяченькой вершине стека. Должно работать ещё лучше, если функции написаны в функциональном стиле, лол, без изменения аргументов.
Достойный ответ. Интересная мысль.
> Принудительного инлайна нет лет 5
Есть forceinline/always_inline, который в разном виде умеют все. А inline нужен в основном для особого отношения к static inline в хедерах.
Какую IDE или текстовый редактор используете для написания кода под основу / на прод? Различаются ли выбранные инструменты (продукты) в зависимости от ОС? По возможности свой выбор подкрепите аргументами.
Уже полгода сижу на связке 10+WSL+визуальная студия, полет нормальный брат жив
Visual Studio. Алгоритмы отлаживаю в ней, а на таргете уже никакой среды нет - пакетная сборка.
Любой рандомный дистрибутив Linux и любой редактор с поддержкой lsp(vscode, vim, kate, etc).
Если не используешь тонкие особенности линукса, то можно юзать wsl, иногда вполне валидный код для Линукса будет в нем падать. Wsl2 должен быть ещё лучше, но если он включен, то могут в системе отвалится любой другой виртуализатор. Нужно будет слегка поебаться с этим.
Так пишешь будто Visual Studio это что-то адекватное и нормальное. По-моему у вас там на платформе нету других вариантов что-то другое юзать безболезненно.
Работал на 2 embedded проектах - ни разу ни у кого винды не видел. Кто-то считает что-то стандартом, а кто-то про это говноедство стандартизированное не слышал.
>Работал на 2 embedded проектах
Тут улыбка чеширского кота.
Небосьв России/СНГ? Я тебе толкую за международную практику.
>Я тебе за США говорю.
Ну удачи. Я как бы не отрицаю возможноть разрабатывать в чём либо другом. Но эффективность разработки будет от полутора до трёх раз меньше. Так-то и в vi можно кодить, а отлаживать а gdb. Но гораздо эффективнее переносить уже отлаженные решения на железо, чем ковырять с JTAG. Что не исключает ковыряния c JTAG на финальной стадии.
>>25779
Меня ещё волнует причина отказа от имплементации VS под системы, базирующиеся на Linux. Пусть проприетарно и закрыто - буду пользоваться продуктом.
VSC субъективно не нравится только посредственной скоростю работы и чрезмерным потреблением ресурсов машины. На сегодняшний день работаю с вышеупомянутым редактором.
>Но эффективность разработки будет от полутора до трёх раз меньше.
С редактором она на порядок выше, потому что не надеешься на отладчик и ебашишь сразу корректный код, который при этом еще и хорошо отлаживается просто чтением логов. Это водораздел между просто хорошим программистом и рокстаром.
>С редактором она на порядок выше,
Джвачую, сколько говноиде ломали код при рефакторинге, а говноподелия Джетбрейнс заслуживает только лучи поноса.
CLion лучшая IDE на планете!!1
Если бы мы на форуме музыкантов сидели, и они были бы как программисты, пришел бы профи и сказал, что он с листа ноты читает и импровизирует охуенно - а ему такие в ответ, да не, невозможно, самогипноз, я так не могу. Потому что тяжело представить, что человек шел к чему-то много лет, ты же не шел - вот и все не шли. Вот тут такая же хуйня. Я не могу читать ноты с листа, и я даже знаю, что мне, как любителю смысла нет этому учиться годами, но бля, как же это было бы охуенно и удобно.
Но в программировании-то я профи в том смысле, что мне бабки платят. Есть смысл улучшать скиллы постоянно - они ковертируются как минимум в свободное время. При чем такие скиллы, которые помогут мне и через 10 лет, а не очередной фреймворк, который сдохнет через 2 года. И ты не развиваешься, если не напрягаешься, ты развиваешься, если напрягаешься и постоянно ставишь себе новые цели. И вот если поставить себе задачу не пользоваться отладчиком и идешным автодополнением - ты, внезапно, научишься писать код без отладчика и автодополнения, при чем за несколько лет скилл вырастет очень сильно - ровно до того момента, пока тебе не станет это делать комфортно, а ты не будешь срывать дедлайны и отставать от коллег. Можешь не верить. Но факт остается фактом.
И дальше IDE будешь воспринимать как трехколесный велосипед - типа ну да, можно не балансировать, но неудобно же нихуя.
Кстати, ровно по этой же причине множество любителей IDE совпадает с множеством говорящих, что студия - лучшая IDE. Потому что из всех программистов вендоблядок, сидящий в студии на одном-единственном языке, выученным в универе, и сидящий на нем последние лет 10 - это самый ленивый и не развивающий себя тюфяк из всех возможных.
При чем такой может неплохо знать сишку - потому что учить сишку доставляет удовольствие, а вот страдать и самоулучшаться - не доставляет, а редактор или там никсы освоить требует все-таки усилий.
Кстати, мне вот IDE нравилось, VS2005 топчик была, потом начали появляться тормознутые монстры, да и я стал ближе к Богу. Вот проект на Qt где идет микс cpp и qml подобие js, документашка в md, еще нужно простые текстовики править, а еще есть вывод json и sql запросы, плюс править make и кое какие скрипты на bash, кек.
Есть разряд людей - говнохранители.
Они обычно привыкнут к чему-то одному. И начинают топить за это без всякой на то причины. Шаг влево или вправо им трудно даётся.
Ты хотел сказать 22?
Что у меня опыта чутка побольше.
Конечно при условии что всё это время я продолжал программировать и познавал новое.
Вообще об IDE и языках глупо спорить. Каждый кулик своё болото хвалит. Но если кто вкатывается. то лучше Visual Studio он не найдёт. В том числе и для начальных этапов разработки под встраиваемые системы.
"Ой мля, я такой умный, ведь я ещё успел написать код на basic в 90е, и вообще тру линукс это слака, а если не слака - это красноглазая дрочь, я закончил в 90е какую-то шарагу и я этим выебываюсь, и студия лучшая ИДЕ - я СКОЗАЛ, ведь я дольше живу, не согласен? а ты проживи с моё, и я так много постигаю всего нового, но примера привести не могу, ведь я такой умный, вам просто не понять"
>примера привести не могу
Ну давай я тебе расскажу за один из проектов.
Дело было в далёком 2002 году. За год до этого мы, команда из четырёх разработчиков, реализовали по спецификации некое семейство протоколов, затем портанули его на Linux и на WinCE.
Это предыстория. А затем нам прислали железку от Texas Instruments и кросс-компилятор к ней. Внезапно оказалось что на этой архитектуре размернорсть char оказалась 16 бит. Со всеми вытекающими из этого проблемами. Славно тогда поебались, но таки запустили свою имплементацию.
А ты такое железо щупал?
Я с тобой согласен, анонче. В студии не сидел, но вот турбо паскаль надцать лет назад мне очень нравился. Такой кайф жать F9! Со воеменем я взялся за реальные задачи и пересел в командную строку.
>Что у меня опыта чутка побольше.
Аргумент про возраст - это вежливый эквивалент "твою мамку ебал", пустая фраза, не говорящая ни о чем, кроме, собственно, желания доминировать. И такую хуйню как раз любят люди, которым сказать нечего. Классика: https://zadolba.li/story/110
>Конечно при условии что всё это время я продолжал программировать и познавал новое.
Так об этом мой пост. Опыт - штука с падающей отдачей, и если ты не создаешь себе целей, которые генерируют тебе батхерт от тяжести освоения - ты стагнируешь. И научиться работать без отладчика - это простая и понятная цель, которая потом окупится. Если ты к 40 не научился и работа в IDE для тебя в 1.5 раза быстрее - то что ты вообще делал все это время. Для меня это большой вопрос. Мне не важно, кто где работает, но я настороженно отношусь к людям, которые пишут, что они в IDE работают сильно быстрее.
"Ой мля я такой охуенный я щупал такие вещи что тебе даже и не снились пизду сестры, ну это там АЖ char 2 байта ебать ВСЕ В СИ ТРЕДЕ ПРОСТО ВЗЯЛИ И ВЫШЛИ НАХУЙ ОТ ТАКОЙ СЛОЖНОСТИ"
Да походу это какой-то маняфантазер местный, учится на 2 курсе ПТУ и мечтает о программировании железа.
> И научиться работать без отладчика
Отладка по JTAG это отладчик или нет? Или там в UART логи записать?
Отладка это исключительно когда делаешь это в Visual Studio
40летний маразматик из этого треда
Хуйня ты.
+30 лет в сфере)))
+22см))
+Visual Studio единственная лучшая ide)))
+Лучшие гей клубы Москвы)
+Дядя мне за сорок)))
+Char на железке 16 бит, уууух)
Макросики есть жи
Ну не конвенциональный размер. Просто самый меньший размер в системе. Только почему он с размером со short я без понятия. Для этого и создали макросики.
Да 100% какой-то доисторический монстр по типу TI DSP
>по стандврту char 1 байт, дядя
тебя, видимо, пере ЕГЭ не учили что сишный байт не обязательно 8 бит (но не меньше)
3.6
1 byte
addressable unit of data storage large enough to hold any member of the basic character set of the
execution environment
2 Note 1 to entry: It is possible to express the address of each individual byte of an object uniquely.
3 Note 2 to entry: A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit.
5.2.4.2.1 Sizes of integer types <limits.h>
1 The values given below shall be replaced by constant expressions suitable for use in #if preprocess- ing directives.
Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
— number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
Ну зачем же ты его так обоссал а?
Вообще если у них чар 2 байта то пускай будет, зачем вмешиваться че то доказывать там?
Додики кривоглазые не могут отличить байт от бита, сука, нахуй им че то доказывать расписывать тут сука
А какой порядок октетов использовался, если вообще была возможность адресовать раздельно верхнюю и нижнюю часть этого "байта"?
Ты бы прочитал сопроводительный абзац, зеленый.
Там прямым текстом написано что это implementation defined и значения в табличке должны быть заменены настоящими.
Ща бы писать int_least8_t вместо char (а int8_t это опционально отстутствующий на платформе тип)
Дураёбина, ты понимаешь, что раньше на системах char и int были одного и того же размера, не потому, что так надо, а потому, что нужно было отличие между символами и цифрами? Теперь ответь, нахуя мне использовать символ, где мне нужна цифра?
Хотя судя по всему ты рак который даже не знает что такое макросы и с чем их едят.
Приебывайся к словам дальше кретин ебаный, хотя если ты не улавливаешь смысла то можешь впринципе идти нахуй, я тебе объяснять ничего не буду, ибо в чем смысл раку что-то говорить вообще.
Сказал зеленый даун.
Децибел, если ты решил в лезть в терминологический спор, то у тебя нет права на ошибку в теминах. Цифры, блять, у него.
Если тебе доставляет радость писать непортируемые программы - так и скажи.
С таким же успехом ты можешь удивляться почему твоя чудо программа работает в линуксе но не компилится под виндой.
Че ты разнервничался то? К тебе никто и не доебывался, это ты на людей кидаешься.
Причем ты сам доебывался когда кто то перепутал чар с байтом - а чего же ты к себе не применил те же принципы про улавливание смысла?
Ты не человек, ты уебанец.
Там занято тобой.
Портируемость - это миф, в любой мало-мальски серьезной программе будет много специфичного для конкретного компилятора/платформы кода.
Ты еще скажи, что переносимость кода - это миф. Нормально делай - нормально будет
Какая может быть портируемость у рака? О чем речь вообще если у этого идиота самая меньшая единица памяти, т.е чар разница между системами? Она не 1 байт как на любой системе, а может быть размером 16 бит. Пусть использует себе такое определение, но не пиздит про портируемость.
Если для ракообразного чар и инт это одно и то же.
Ну да, для криворучки вроде тебя - это миф.
Есть кроссплатформенные либы, которые можно скачать в виде исходников и сразу подключить.
И написанные такими, вроде тебя, у которых размер чара прибит гвоздями.
Ооо ну все я понял что ты за зверь. У вас че каникулы начались?
Честное слово, вот я вообще не ебу, какой размер у кэра блядь, но есть же uint8_t для бинарной хуйни типа протоколов. Кому вообще нужно знать размер таких типов и зачем. Та же маняхуйня, как приоритет операций.
И что блядь? Переходишь на новый компилятор, где почему-то нет этого типа, тратишь целых 10 секунд на его определение.
Аутисты ебаные, лишь бы посраться по поводу какой-то маняхуйни. Хррртьфу
Аутист порвался
Линукс не нужен.
Ну например чтобы не использовать char вместо int когда он нужен. Общее понимание размеров в системе тебе даст понятие где и когда тебе использовать тот или иной тип. Если не нравится есть другие языки программирования. Так-же в разных процах своя размерность типов, поэтому придумали stdlib. Например в одной системе int был 8, в другой 4. Разделили, сделали short. Потом пошло снова, short теперь 8, а int 16. Кстати до этого еще байт называли словом. Чтобы не было непоняток сделали стандарт, где прописали просто, что short меньше int, int меньше long. Если нужно было точное определение типа, его засовывали либо в typedef, либо подключали stdint, где куча макросов которые определяют размер в твоей системе. Удобно при портирований. А так да, разницы никакой, если ты не паришься на счет утечек памяти ит.д или той же оптимизаций. Но считать char и int одним и тем же это тупость.
Ты даже не понимаешь сути обсуждения, рак.
Сколько же у тебя каши в голове
>до этого еще байт называли словом
Слово это слово оно никуда не делось (64-битные процессоры оперируют 64-битным словом, и это никак не влияет на размер байта)
>short меньше int
Short не меньше int. Short меньше ИЛИ РАВЕН int.
>до этого еще байт называли словом
>Слово это слово оно никуда не делось (64-битные процессоры оперируют 64-битным словом, и это никак не влияет на размер байта)
>Ну например чтобы не использовать char вместо int когда он нужен
Нахуя он нужен в 2020 году, когда даже контроллер за 100 рублей в розницу может в полноценные 32 бита? ASCII строки хранить?
Для байтоебли есть uint8_t, по которому сразу видно, что на любой платформе он будет восьмибитным ансайнд типом. Создавай любые бинарные структуры, сериализуй, десериализуй, обмазывайся байтиками сколько влезет. А если ты всерьез держишь в голове мысль о том, что "вот тут я использую short, но не потому что у меня 2 байта в бинарном файле, а потому что мне нужен тип с минимальной гарантией в 32767 значений...", то за такое убивать нужно. То есть наличие таких знаний в голове - гарантированный признак задрота-мудака.
>Для байтоебли есть uint8_t
Это опциональный тип.
Есть только uint8_least_t и uint8_fast_t. Которые, конечно, могут быть и 16-битными. Если процессор 16-битный онли.
Пойми уже что в программировании используются четкие определения.
Там написано что он может быть меньше или равен.
Если он равен, то он не меньше, а значит, нельзя исходить из предположения что он всегда меньше.
Че сказать хотел?
Нужно различие, хотя бы потому, чтобы было такое понятие как строка.
А ну ок.
short используют тогда, когда хотят именно short, а не твои маняфантазии про 2 байта.
В нормальных языках вообще можно заводить типы на любые диапазоны чисел, хоть на 13..37
Но тут только так.
Ты опять путаешь чары со словами, мудило?
Вот тебе в твоей википидории написано английским по белому - байт использовался для обозначения части МЕНЬШЕ ворда.
>Нахуя он нужен в 2020 году, когда даже контроллер за 100 рублей в розницу может в полноценные 32 бита?
Вот вообще бесплатный, но у него нет поддержки операций 8 и 16 бит.
>The C language defines a byte to be the number of bits used by type char , so one can have a system with a 16-bit or 32-bit byte and char type.
Как же я жидко обосрался. Признаю, я долбоебина.
Там не написано, что байт меньше слова дефакто. Там написан случай, где byte меньше word.
> Да не потому что размер будет меняться, а потому, что char был придуман для символов. char для символов, int для целых чисел.
Ну где-то так да. А для тех кто хочет именно оперировать размерами типов как количеством бит - есть stdint.h
Да, а нет что ли?
Если ты читать не умеешь это не мои проблемы. Ты шлешь аргумент, но лупиш в ворота. Я прав, ты тупой. Байтом называли слово. ИГРА В ФУТБОЛ ОКОНЧЕНА ПАЦАН.
Юноша, отвлекитесь на минуту от своих подворотов. Вы знаете такие архитектуры, как pdp-10, cdc6600, бэсм-6?
"de facto netu v si"
Пойду покомпилирую код на Javascript тогда, тем более мне сказали что так возможно в Javascript треде.
но все же хотелось бы услышать от пенсионера что за платформа была где char (байт) был 16 бит
не флейма ради
Ну ладно в /po или отбитом наглухо /b. Но не на этой же доске, тем более в таком треде. Я понимаю если бы веб-макак js/python/php троллил, что у них нихуя не объекты, а строготипизированный типы данных.
Эпоха декаданса наступила. Двач погрузился во тьму дегенератов выращенных разведенками.
Зато какой движ тут в треде был, такая дискуссия ни о чем. Почитать было весело. Спасибо обоям
Спасибо что упомянул на чем веб макаки пишут, а то бы подумали что ты один из них ахах вот троллинг бы получился да))) жыес ваще макакены еп)
Ящитаю вообще надо делать тест на входе в тред, если человек считает что char может быть только 8 бит - не давать постить.
угу
в общем, на некоторых мейнфреймах и платах dsp, char имел не 8 бит
а еще стандарт posix все же требует 8 бит в char
угу
> а еще стандарт posix все же требует 8 бит в char
И это даже хорошо. 9 битный char выглядит маргинально
Просрался слезами с твоих щюток.
Если CHAR_BITS == 32
То sizeof(uint32_t) == 1
Потому что sizeof возвращает размер в байтах
А байт по стандарту равен CHAR_BITS битам.
Этот слишком много знает
Зачем мне это вообще нужно было знать? Я хотел игры делать, почему я сижу теперь читаю списки архитектур процессоров и их размеры слов, занимаюсь байтоеблей, углубленными изучениями терминов. Что за хуйня, ловушка джокера?
Ты же хочешь быстрый код в игоре?
Тебе придется выбрать ширину КАЖДОЙ сука целочисленной переменной.
Конечно. Но byte в системе типов? А это сколько бит? Да, на pdp-11 это 8. А на pdp-10 сколько?
http://pdp10.nocrew.org/docs/instruction-set/Byte.html
Тогда зачем ввели CHAR_BIT макрос с размером чара? Может они так отождествляют размер байта, байт и тип char?
угу, но, бля, спроектирован он для pdp11, а в остальных системах уже костыли прикручивали..
почему сишникам-мидлам дяди в целом платят меньше и востребованность на рынке аналогично меньше, чем например у каких-нибудь фронтэндеров и растоебов?
Про растоебов хз, а фронтэндерам гораздо проще объяснить и показать менеджерам чем они занимаются и за что им платить деньги.
Ты идешь по улице и зависаешь на пару минут с закрытыми глазами, мечтая о высокооптимизированной игре на языке Си?
Сфера уменьшаетсячасть разработки уходит с Си на другие языки, тут думаю не секрет. Плюс ненаглядность результата. Ну что-то там на железке или в консольке. Не интересно. Всем бы приложение на телефон или сайт показать с красивой кнопкой.
>Ты дегенерат сука ебучий
Ты че кобыла ебаная охуела? Ты с кем так базарить удумала, ты ондатра плешивая, лошадь зарыганая. Ты хуев блатных обсосалась дурочка ебаная? Ты шотдура ебаная писюн возле кареньуого почувствовать захотел? Да? Мускульное кольцо тебе помассировать хуем? Дичь ты ебаная иди на хуй пидор хуеглот спермохлеб. Вафельница ты дурная.
Уныло ругаешься. Слышал брань куда покрепче.
Как будто бы что-то плохое.
Двачую, хипстеры и фемки (бляди ебанные), трахгендеры (не люди) не нужны. Мы за маскулинность и мужество в этом треде.
>suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
Ну и что вы скажете на это, стандартоёбы?
Вот та, например, где из строки пробелы надо убрать.
Как вы доки пишите? Какие инструмены пользуете?
>register pok-pok dpsrc;
>f(&dpsrc);
>...
>error: address of register variable ‘dpsrc’ requested
Почему компилятор не может копировать значение из регистра в память, передать адрес, а затем записать обратно в регистр?
>>27995
Шапка -> Керниган&Ритчи. Конкретно эта задача - в конце первого чаптера, вроде как.
>Почему компилятор не может копировать значение из регистра в память, передать адрес, а затем записать обратно в регистр?
Так в этом смысла нет. Изначально register было задумано для оптимизации. При этом, если склероз не изменяет, нет гарантии что переменная будет размещена в регистре.
>>28010
>Изначально register было задумано для оптимизации.
Условно в одной функции у меня три указателя, которые должны меняться очень часто в рантайме. Один из них (наиболее активный) и был помечен register.
>При этом, если склероз не изменяет, нет гарантии что переменная будет размещена в регистре.
Да, всё так, это лишь компилятору рекомендация. Хотя вроде в каком-то возможно старом стандарте и было жесткое соответствие, но я тоже неуверен.
Клопилятор Ричи размещал первые три такие переменные в регистрах. При встрече амперсанда он ругался, с тех пор это и пошло.
чел, программисты вообще нахуй не нужны щас
в россии щас больше половины выпускников-инженеров выпускаются с ай-ти специализацией в дипломе, это не считая вкатывальщиков
то что за раст или за реакт больше платят, тебя вообще ебать не должно, тк на одну вакансию тысячи кандидатов
но программирование интересное хобби, ты можешь им заниматься в свободное время
работать дворником, уборщиком, убирать говно за стариками, чистить толчки.. такого типа работы ибо на кассу возьмут молодуху, а охранником мента на пенсии..
с этой точки зрения интересней изучать языки lisp-семейства, ml-семейства, декларативные языки наследники prolog, языки основаннын на автоматическом выводе типа, тот же haskell, чисто ооп языки типа смоллтолка и эйфеля, куча всего интересного
эмбеддед сишка слишком простое и занудное дело чтобы быть хобби
1. Почти нет аутсорса с западными зарплатами
2. Есть огромное количество 35+ дядь, которые уже не будут переучиваться, зато у них дети и ипотека, поэтому будут получать сколько дают
Короче хуевый выбор сишка для заработка денег, ее нужно знать просто для собственного развития
>1. Почти нет аутсорса с западными зарплатами
Какой же дурак на аутсорс выложить Си проект? Зато перекатиться легче.
>программирование
>изучать языки
Это разные вещи. Языки изучают всякие аутисты, которые особо не программируют ничего интересного
Это не документ, это ковычьки у самого гцц. Все правильно советуют - надо chcp 65001, chcp 1251 или chcp 866 (скорее последнее), чтобы отображалось нормально.
>почему gcc выебывается
Visual Studio так же выёбывается. Забей на русский в консоли. US ASCII это как латынь в фармацевтике и медицине.
Используй bash, дятел.
gcc это пердоподелка для пердоконсоли, которые как правило юникодные utf-8, а виндозная консоль не умеет в юникод.
Ну, вот у меня сейчас эмбеддед сишка хобби. Ничего занудного в этом нету, весело и интересно.
Этого двачую.
Сейчас век ебучих золотых оберток.
Идеи для приложений говно редкое, я вам скажу. Но, сука, такое ощущение что клиенты нихуя не допирают до этого самостоятельно и продолжают вваливать в это деньги.
Кто этим всем говнищем пользуется - я хуй его знает.
мимо, к сожалению, мобильщик
>Ну да ну да 8 битных процессоров никогда не существовало
8-битные процессоры это сраный новодел из второй половины 70х.
Да та же кратность 8 битам это сравнительный новодел от IBM и её линейки System/360 которую совок потом копировал.
Да дрочу вприсядку, и иногда пишу hello world с мигающим диодом, весело пиздец.
Ебу DS18B20 по one wire с помощью таймеров и дма, как один из примеров.
Отклеилось, сорри.
Пишу на си. Юзаю мейк. Иде - силайон (говно без симейк, но да похуй).
Что ещё делаю... Ну, хочу сбацать саундтрек из псковского порно с помощью зумера и тех же таймеров+дма.
Также вот сегодня потихоньку читаю доки на ssd1306.
Алсо, этот пидор, >>29034, это не я. Это какой-то гомодрил тебя захотел подъебать.
int a;
int b;
a = new int[5];
b = a;
delete[] a;
delete[] b;
Звездочки при объявлении указателей съелись макабой.
Вылетит с ошибкой.
жри что дают, свинья
зато бесплатно
жри и причмокивай
и не смей жаловаться
умный дядя за тебя столько работы сделал
а ты тут ебало скривил
Да. Конечно, будет вторым освобождением уже освобождённой памяти. Что приведет к падению данной программы, кстати.
Ты же присваеваешь не кусок памяти во второй раз, а указатель на нее. Т.е., по сути, адрес.
А можешь мне чуть-чуть пососать, пожалуйста?
Ну так... Потилибомкать чуть-чуть чисто... пока молофья с моего конца не закапает... Ну так, чисто по-дружески...
Понял, снимаю штаны, открывай рот.
Кстати, я тут утром дрочил и забыл смыть подзалупный творог :( Прости, а? Ну это ж мой, а? Ты ж его всегда любил...
Анон, заранее благодарю тебя за эту работу! :3
Алсо, сорри, утром был на нервах. Забыл написать про МК - STM32F103
А что не так с ней собственно? Глянул на апи, вроде ничего сложного, если обычная задача по типу открытия картинки требуется.
> Отклеилось, сорри.
> Пишу на си. Юзаю мейк. Иде - силайон (говно без симейк, но да похуй).
А в попку даёшь? Пользоваться - clion себя не уважать. Надо ставить Visual Studio.
> Что ещё делаю... Ну, хочу сбацать саундтрек из псковского порно с помощью зумера и тех же таймеров+дма.
Лучше бы сайт сделал, чем очередное нинужно.
> Также вот сегодня потихоньку читаю доки на ssd1306.
Лучше бы почитай как можно программировать 16 битный калькулятор. Смысла больше.
> Алсо, этот пидор, >>29034, это не я. Это какой-то гомодрил тебя захотел подъебать.
Сам ты гомодрил. Наебываешь тут людей и обманываешь. Говоришь что дрочишь в присядку, а потом пытаешься сойти за нормального наркомана.
А ты, как я посмотрю, гей-хипстер со смузистическими наклонностями? Свою жиденькую рыженькую пиздобородку причесал? А подворотики? А смузи выпил? За фемок утром прокричал? А права окружающей среды и бигендеров защитил? А, так не гей? Ну, по тебе не скажешь... А что ты тогда на митинге зеленых тригендеров делал, а? Ааа, БЛМ? Так тебе, может быть, по щам нужно?
Я-то в жепу не даю, я, скажем так, гомофоб. А силайон пользуюсь так как я сильно альфач чтобы разобраться с вимом.
> А ты, как я посмотрю, гей-хипстер со смузистическими наклонностями?
Ну да. А ты завидуешь?
> Свою жиденькую рыженькую пиздобородку причесал?
Естественно, и андеркат сделал.
> А подворотики?
А зачем их причесывать?
> А смузи выпил?
А то. Вкусно пиздец.
> За фемок утром прокричал?
Да, прям с утра, каждый день в окно кричу "слава фемкам!"
> А права окружающей среды и бигендеров защитил?
Конечно же. Использую гендернейтральный компьютер от компании Apple.
> А, так не гей?
Я гей. Тебя смущает?
> Ну, по тебе не скажешь...
Ты поехавший? Я пидор.
> А что ты тогда на митинге зеленых тригендеров делал, а?
Ну люблю тригендеров, люблю к ним подсаживаться.
> Ааа, БЛМ?
Люблю ниггеров.
> Так тебе, может быть, по щам нужно?
А может тебе надо по щщам, поехавший?
> Я-то в жепу не даю, я, скажем так, гомофоб. А силайон пользуюсь так как я сильно альфач чтобы разобраться с вимом.
Какой нахуй вим? Надо использовать Visual Studio. Ровные поцоны только студию юзают.
Крч, смена кодировок в нативной шиндовой cmd давала нечитаемое месиво, либо кириллицу вообще не отображала. Если кому нужно, проблему решил установкой ConEmu и chcp1251
Ты не ровный пацан потому что ты за пидоров, фемок и, тем более, блм.
Тебе по щам, ты тело не по понятиям. Не пацан. Пидор-баба, пиздец.
А я вот чай люблю. Вкусно пиздец. И смузей не нужно.
Послушай вот, может ты ровнее станешь и начнёшь превращаться в нормального пацыка (хотелось бы): https://youtu.be/zLWF6G6AQNk
Я не он,он не я.
Visual Studio заебись.
Макось - фуфло.
gcc в целом неплох, чтобы собрать то, что было протестировано и отлажено в Visual Studio.
https://youtu.be/0r3xvd-dloU
https://youtu.be/AqS4aNi0HQY
https://youtu.be/8LhkyyCvUHk
https://youtu.be/foGkU6x3eSE
https://youtu.be/9_Iq9CWuqMM
https://youtu.be/D4y_acTR0MY
https://youtu.be/GcpPg9n-EzQ
#define ARRAY_SIZE(x) (sizeof x / sizeof 0[x] / (size_t) !(sizeof x % sizeof 0[x]))
вдупляю уже 2 часа в это и не могу понять как это блядь работает.
что за sizeof 0[x], че это за наркомания нахуй. в gdb хуй поинспектишь, помогите разобраться плз
> #define ARRAY_SIZE(x) (sizeof x / sizeof 0[x] / (size_t) !(sizeof x % sizeof 0[x]))
Ничего необычного. Просто написано уебками чтобы запутать.
Можно упростить в:
#define ARRAY_SIZE(x) (sizeof x / sizeof x[0])
Задача еще проще,получить на вход жпег прочитать и сжать обратно с задаваемыми опциями.
программа минимум:
void jpgopt(unsigned char* src_jpg, unsigned long src_size)
{
struct jpeg_decompress_struct srcinfo;
struct jpeg_compress_struct dstinfo;
jpeg_create_decompress(&srcinfo);
jpeg_create_compress(&dstinfo);
jpeg_mem_src(&srcinfo, src_jpg, src_size);
jpeg_save_markers(&srcinfo, JPEG_COM, 0xFFFF); //сохраняет метаданные по битовой маске
jpeg_read_header(&srcinfo, TRUE); // хуй знает что хуй знает зачем
jvirt_barray_ptr хcoef_arrays = jpeg_read_coefficients(&srcinfo); // еще какую то хуйню читает и возвращает указатель.
jpeg_copy_critical_parameters(&srcinfo, &dstinfo); //копирует цветовой профиль, уровень сжатия итд в выходную структуру
unsigned char хout_jpg;
unsigned long out_size;
jpeg_mem_dest(&dstinfo, &out_jpg, &out_size); //out_size заполняется, out_jpg почему то пустой пустой
jpeg_write_coefficients(&dstinfo, coef_arrays); //то же самое что jpeg_compress(&dstinfo); только с какими то коофициентами
}
Код позаимствован из jpegtran из состава libjpeg-turbo, в оригинальной библиотеке насколько я понял jpeg_mem_src/dst вообще не предусмотрен, есть только jpeg_std_src/dst ошибки предлагается обрабатывать через лонгджамп. Все функции как черный ящик в котором что то проиходит со структурами, то есть без изучения кода самой библиотеки догадаться что оно делает не представляется возможным, как и написать код без примера (у меня даже и с примером не получается).
Понятно что оригинальную библиотеку написали в дремучих годах и все современные реализации/форки тупо тянут совместимость, но API тем не менее ультрауебищное написанное каким тоо мудаком
Задача еще проще,получить на вход жпег прочитать и сжать обратно с задаваемыми опциями.
программа минимум:
void jpgopt(unsigned char* src_jpg, unsigned long src_size)
{
struct jpeg_decompress_struct srcinfo;
struct jpeg_compress_struct dstinfo;
jpeg_create_decompress(&srcinfo);
jpeg_create_compress(&dstinfo);
jpeg_mem_src(&srcinfo, src_jpg, src_size);
jpeg_save_markers(&srcinfo, JPEG_COM, 0xFFFF); //сохраняет метаданные по битовой маске
jpeg_read_header(&srcinfo, TRUE); // хуй знает что хуй знает зачем
jvirt_barray_ptr хcoef_arrays = jpeg_read_coefficients(&srcinfo); // еще какую то хуйню читает и возвращает указатель.
jpeg_copy_critical_parameters(&srcinfo, &dstinfo); //копирует цветовой профиль, уровень сжатия итд в выходную структуру
unsigned char хout_jpg;
unsigned long out_size;
jpeg_mem_dest(&dstinfo, &out_jpg, &out_size); //out_size заполняется, out_jpg почему то пустой пустой
jpeg_write_coefficients(&dstinfo, coef_arrays); //то же самое что jpeg_compress(&dstinfo); только с какими то коофициентами
}
Код позаимствован из jpegtran из состава libjpeg-turbo, в оригинальной библиотеке насколько я понял jpeg_mem_src/dst вообще не предусмотрен, есть только jpeg_std_src/dst ошибки предлагается обрабатывать через лонгджамп. Все функции как черный ящик в котором что то проиходит со структурами, то есть без изучения кода самой библиотеки догадаться что оно делает не представляется возможным, как и написать код без примера (у меня даже и с примером не получается).
Понятно что оригинальную библиотеку написали в дремучих годах и все современные реализации/форки тупо тянут совместимость, но API тем не менее ультрауебищное написанное каким тоо мудаком
Там вызывают деление на 0, когда размер масява не делится на размер элемента (у наркоманов)
Чому? В современных сишных (да и не только) библиотеках есть более менее общий принцип построения, тут же какой то венегрет.
Алсо, сейчас посмотрел в турбожпег есть оказывается свой API, который как раз уже вменяемый.
Смоуки хороши. И hot stuff Донны Саммер.
Кодировка cmd не совпадает с кодировкой выводимых сообщений от gcc. Что насчёт того, чтоб юзать Git Bash, Windows Terminal?
Обозначение указателя забыл поставить, дружок.
Да и проверку на NULL (nullptr) сделать было бы неплохо.
почему же?
Потому что ты нашел какой то дурацкий пример
Вот тут никаких setjmp https://github.com/md81544/libjpeg_cpp/blob/master/jpeg.cpp
В макросе же "!" (отрицание) стоит. Если результат от деления будет 0, то в конце выражение обратится в 1. По итогу произойдёт деление на единицу. Появляется вопрос. Когда же результат выражения будет обращаться в конце в нуль (должно произойти деление на 0 по сути)? - Правильно, когда будет ненулевой остаток (>= 1).
Мне понятен принцип работы 3-его действия, но не понятна цель (зачем так сделали). Неужели для запутывания читающих код?
Массивы же однотипные. Мы, конечно, можем записать разные типы через приведённые указатели (void *), но тип технически будет один и тот же (размеры элементов равны). Получается, что ненулевого остатка ожидать не стоит. Получается, что обсуждаемая часть кода бесполезна? Разве не так?
Это копия, сохраненная 10 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.