М.Двач / Программирование

Этого треда уже нет.
Это копия, сохраненная 12 декабря 2017 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

78 Кб, 792x1023

C Programming Language #25 # OP 13 окт, 16:26 #1074988 В конец треда | Веб

Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [​i​] или ∗.

Что читать:

- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://web.archive.org/web/20160727235220/http://c.learncodethehardway.org/book/ (автор внезапно захотел денег)
- Немного примеров хорошего стиля: 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 (драфт)
- man/Dash/zealdocs

Чем конпелировать:

- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.

Что еще почитать:

Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.

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://www.iso-9899.info/wiki/Books#Learning_C

Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.

Прошлые треды:

- №22: https://arhivach.org/thread/262491/
- №23: https://arhivach.org/thread/277223/
- №24: https://arhivach.org/thread/291766/

Ответы8113386518884409294995104

13 окт, 16:37 #2 #1075005

Вход С++ макакам запрещен!

Ответы7503979203

13 окт, 17:32 #3 #1075039

>>1075005

двачую
Си-господин

13 окт, 18:05 #4 #1075059

Поясните веб-макаке, пожалуйста, в чём разница между компиляцией под линукс и винду? Код си ведь комилируется в двоичный код, а это инструкции процессору. Почему нельзя тогда скомпилировать с помощью gcc в linux, потом перенести этот файл в винду, добавить .exe и запустить? Только не стукайте, пожалуйста

Ответы750617506675134

13 окт, 18:06 #5 #1075061

>>1075059
https://ru.wikipedia.org/wiki/Сравнение_форматов_исполняемых_файлов

Ответы7506675097

13 окт, 18:20 #6 #1075066

>>1075059
>>1075061
Не совсем так. Никто не мешает использовать ELF под винду или PE под линукс (я вот писал лоадер Mach-O под винду, никаких сложностей не возникло). Проблема в либах, но либы можно собрать под нужную ОС. А основная проблема в несовместимых системных вызовах, которые используют эти либы или исполняемые файлы напрямую. Если решить все проблемы, получится WINE (алсо, раньше был LINE еще) или тот же WSL.

Ответы7507275097

13 окт, 18:28 #7 #1075072

>>1075066
>Проблема в либах, но либы можно собрать под нужную ОС
на 64 разные размеры типов в вин/лин. так что не совместимо будет бинарно.

Ответы7507675079

13 окт, 18:31 #8 #1075076

>>1075072
или я хуйню несу - я не знаю.

13 окт, 18:37 #9 #1075079

>>1075072
Это все решается, хотя и не отменяет того факта, что все это - дикое извращение, требующее овердохуя работы. Ради ничего.

13 окт, 19:33 #10 #1075097

>>1075061
>>1075066
Интересно, спасибо. А где можно поподробнее изучить? Чтоб не сильно углубляться, но базовое представление получить чёткое. Имею в виду, что происходит с кодом при компиляции, как операционные системы исполняют двоичные коды и прочую низкоуровневые штуки. Таненбаум какой-нибудь?

Ответы75776

13 окт, 20:51 #11 #1075134

>>1075059
Во-первых, разных ABI.
Во-вторых, разное API syscall'ов ядра.
В-третьих, разный формат бинарников.
В-четвертых, разные либы.
В-пятых, разное окружение.

В общем, то все эти проблемы решаются платформо-независимым кодом, и кросс компилятором, например как тот же gcc под винду в виде MinGW.

Но тут если приложение использует GUI, то все становится намного сложнее и без использования кроссплатформенных фреймворков, типа Qt, GTK+ и т.п. не обойтись. Конечно разработчики, в основном конченые ебланы, и много программ делается без поддержки кросс-платформености, хотя могли бы делать кроссплатформенные, ведь это не так сложно.
Ну что сказать, ебанутая сфера, ебанутые люди.

Ответы75157

13 окт, 21:57 #12 #1075157

>>1075134
>В-третьих, разный формат бинарников.
>В-четвертых, разные либы.
>В-пятых, разное окружение.
Уже вошло в (1) и (2), не?

13 окт, 22:13 #13 #1075167

Только начал вкатываться в программирование и решил учить С, потому что так советует шапка раздела. Там рекомендуют учить по Дейтелу, а тут только один его учебник. В чем суть? Какой учебник лучше всего?
Алсо, какие задачи решает С? Кругом только и слышно про кресты, Яву, питон, шарп. Где используют С?

Ответы751837527375388

13 окт, 22:27 #14 #1075183

>>1075167
я твою мамку использую в с позе.

14 окт, 02:33 #15 #1075273

>>1075167
Драйвера, модули ядра, обоссанные нии.

14 окт, 12:40 #16 #1075388

>>1075167
>Алсо, какие задачи решает С
Программирование микрококо и прочих встраиваемых систем.
>Какой учебник лучше всего?
Мне понравилась книга "Язык программирования C" Стивена Праты. По плюсам у него тоже для начала неплохая книга, на мой взгляд.
>Кругом только и слышно про кресты, Яву, питон, шарп.
Потому что под них задач гораздо больше, чем под это говно мамонта. Драйвера и ядра пишут намного реже, чем всё остальное, а программирование контроллеров сейчас многие расценивают как студентоподобные поделки на ардуино. Скоро и в контроллерах много где будут наверняка использоваться высокоуровневые языки типа того же питона, если ЖОСКИЙ РИАЛТАЙМ не нужен.
Мой тебе совет: как вкатишься в C, бери другой язык, подучи и пиздуй работать, иначе с этим говном ты так и будешь решать одни и те же задачи всё время в нии или в частной фирме, работающей на фсб/армию. Сколько знал людей, все ушли на высокий уровень как только смогли, получают в 2-2.5 раза больше меня и радуются, а я всё ещё сосу хуи и блюю от одной только мысли, что надо снова идти на работу и писать какое-то говно.

Ответы7539075421

14 окт, 12:42 #17 #1075390

>>1075388
Съеби от сюда маня, к своему шалашу с педиками в JS треде.

Ответы75421

14 окт, 13:31 #18 #1075421

>>1075388
>>1075390

тоже угораю с этого бойскаута. но не спешу уходить его - пусть будет.

14 окт, 13:40 #19 #1075427

Если в main объявлена переменная n = 1, которая передается в функцию типа
void function (int n) { n = 5; }, то значение n в main не поменяется.

Но если из main передается массив в функцию
void function2 (int mass[], int size) { mass[0] = 5; }, то соответствующее значение в массиве из main тоже меняется.

То есть для массивов обязательно нужно каждый раз в функции дублирующий массив создавать, чтобы можно было присваивать ему значения и он не менял бы при этом значения в main?

Ответы7543075438

14 окт, 13:42 #20 #1075430

>>1075427
просто если ты хочешь массив передать в функцию, просто оберни в структуру и передай.

14 окт, 13:53 #21 #1075438

>>1075427
передача в функцию int mass[] равнозначна int mass, а mass[0] = 5 равнозначно (mass + 0) = 5

Ответы75439

14 окт, 13:54 #22 #1075439

>>1075438
Бля забыл про макаку, сожрала звездочки.
>int mass[] равнозначна int(звездочка) mass, а mass[0] = 5 равнозначно (звездочка)(mass + 0) = 5

10 Кб, 1119x293

vasqa 14 окт, 14:39 #23 #1075462

Поясните мне за пикчу, плиз.
Как я понимаю, тут объявляется структура tagBITMAPFILEHEADER, потом описывается. Потом в создавая экземпляры этой структуры мне нужно будет указывать имя структуры как BITMAPFILEHEADER. Так зачем то, что подчеркнуто красной чертой?
И нахуя это вообще делать, если можно просто структуры с нужным именем объявить?

Ответы7546475469

14 окт, 14:47 #24 #1075464

>>1075462
> Так зачем то, что подчеркнуто красной чертой
Это вопрос предпочтений, конвенции (и легаси еще слегка). В Microsoft считают, что PBITMAPIMAGEHEADER header выглядит лучше, чем BITMAPIMAGEHEADER *header.

Ответы7546575466

14 окт, 14:51 #25 #1075465

>>1075464
Понятно.
То есть если я напишу
struct _mystruct {//} *mystruct;
А потом где нибудь сделают
mystruct _ptr;
То _ptr будет указателем на структуру?

Ответы79030

14 окт, 14:52 #26 #1075466

>>1075464
но ты умалчиваешь. понятно желание, ведь объявление void a, b; это не void a, *b;

но какой же это конченный стиль, ворд, дворд - всё чаше думаю, что мы слишком запареваемся. просто пишем как есть. а вместо int пишем intptr или что-то типа того.

Ответы754677547075471

14 окт, 14:53 #27 #1075467

>>1075466
ах да, забыл заменить - блин, в этом что-то есть, в этом преодолении естественной фильтрации.

14 окт, 14:55 #28 #1075469

>>1075462
Это блять майрософт там писать не умеют нихера на С, как впрочем и на все остальном.
Писать typedef на структуры не желательно, если это не opaque объекты к полям которого не должен быть доступ из вне.
Ну блять в майрософт вообще все уебищно, даже эти капитал летерс в названиях - просто пиздец. еще и венгерская нотация, еще и ебанутые тайпдефы на инты. Короче неудивительно что винда такое говно.

Ответы75474

14 окт, 14:56 #29 #1075470

>>1075466
> понятно желание
Нет. Ошибка с указателем, как у тебя, возникает, если ставить звездочку у типа, не понимая сути (духа, лол) объявлений в Си:
int∗ foo, bar; // Непонятно.
а если писать правильно, то никаких проблем не возникает:
int ∗foo, bar; // Сразу видно, что имеется в виду.
Ну а нормальные люди вообще не смешивают разнородные типы в одном объявлении:
int foo = 1, bar = 2; // Допустимо.
int ∗foo = NULL, bar = 2; // Говнокод.

Ответы75472

14 окт, 14:58 #30 #1075471

>>1075466
WORD, DWORD нужен для того, чтобы можно было писать более менее платформонезависимый код в том смысле, что стандартные типы данных на разных платформах могут в принципе отличаться по размеру. И тогда вместо того, чтобы перелопачивать весь код, тебе в header файле достаточно typedef переписать и всё. Переписать 1 строку легче чем тысячи.

Ответы7547275473

14 окт, 15:00 #31 #1075472

>>1075470
понятный хуй - это все так делают, но всё же, не всегда очевидно, * как модификатор мог бы быть и частью названия типа.

>>1075471
хуйню сказал. платформа назначают размер типов, укладывающийся в стандарт - нет смысла уродовать язык.

Ответы75475

14 окт, 15:01 #32 #1075473

>>1075471
Да но как можно выбрать такие ебанутые имена, да еще и капитализированные? Почему нормальные люди в линуксе сделал все понятно u32 u64 i32 i64, а у этих блять WORD, DWORD это вообще какие типы signed unsigned как их складывать умножать делить? Этож просто пиздец. Рак мозга налицо.

14 окт, 15:02 #33 #1075474

>>1075469
> Писать typedef на структуры не желательно
Да ты охуел. Отдельный неймспейс для struct и enum - это костыль и косяк разработчиков, вызванный по большей части техническими ограничениями, а не желанием сделать именно так.

Ответы75476

14 окт, 15:03 #34 #1075475

>>1075472
>хуйню сказал. платформа назначают размер типов, укладывающийся в стандарт - нет смысла уродовать язык.
Вот щас ты хуйню сказал. Т.к. long на 32 битной архитектуре равен 4 байта, а long на 64 битной 8 байт.
на 32 битной надо писать long long что получить 64 битный. Но с С99 есть замечательный хедер <stdint.h> в котором все тайпдефы на инты типа uint64_t и т.д

Ответы7547875480

14 окт, 15:05 #35 #1075476

>>1075474
https://www.kernel.org/doc/html/v4.10/process/coding-style.html#typedefs

Ответы75481

14 окт, 15:05 #36 #1075478

>>1075475
> Но с С99 есть замечательный хедер <stdint.h>
Этим хедером подавляющее количество людей пользоваться не умеет. Типы фиксированного размера нужно избегать, если они не нужны вот прям пиздец как (например, для type punning и упакованных структур), в stdint есть правильные типы least и fast, вот ими и стоит пользоваться.

Ответы75487

14 окт, 15:07 #37 #1075480

>>1075475
> ещё раз пропуках.
что ты несёшь, у каждого типа есть минимальный размер - это хватает практически для всего. и твои угарные -наивные представления о типах, тоже, улыбают - как захотят на платформе так и сделают.

Ответы7548175487

14 окт, 15:11 #38 #1075481

>>1075476
В линуксовом стайлгайде очень много всякой дури. Мне в любом случае, что со struct, что без название типа ничего не скажет, надо идти и смотреть на него. Какая мне нахуй разница, структура ли foo_t. Если это что-то целочисленное, мне стоит узнать лимиты, узнать о наличии знака, узнать о каких-то специальных значениях (типа -1). Если это структура, мне как бы неплохо знать ее поля. Если я все это знаю - кейворд не нужен. Если не знаю - кейворд не нужен.

>>1075480
> у каждого типа есть минимальный размер
Удачи в следующий раз при компиляции 16-битного кода, использующего int. И удачи разгребать говно после дебилов, которые считают, что Си обеспечивает переносимость, а не люди.

Ответы7548875492

14 окт, 15:15 #39 #1075487

>>1075478
Ну использовать least и fast стоит только если ты пишешь пиздец кроссплатформенных код под максимальное число архитектур, да и то я думаю лучше под каждую архитектуру иметь свои типы, если ты действительно делаешь что-то такое.

>>1075480
Я хз что ты вообще несешь. Ты походу вообще не понимаешь что такое размер типа и какие это может вызвать проблемы и баги.

Ответы75490

14 окт, 15:16 #40 #1075488

>>1075481
или я слишком много дунул, или мы просто не понимаем друг друга. на всякий случай - блин, секс, да, вот чего хочется. заебали вы все уже.

14 окт, 15:17 #41 #1075490

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

Ответы754937549475495

14 окт, 15:19 #42 #1075492

>>1075481
>Если это что-то целочисленное, мне стоит узнать лимиты, узнать о наличии знака, узнать о каких-то специальных значениях (типа -1).
Там все целочисленые типы определены для каждой архитектуры u8 u16 u32 u64 и т.п которые сами за себя говорят обо всем. А кейворд struct помогает четко разделить тайпдефы которые могут быть opaque типами аля typedef struct _my_type my_type и открытые структуры с полями.

Ответы75495

14 окт, 15:24 #43 #1075493

>>1075490
Меняет то, что достаточно изменить 1 typedef, а не листать весь код и заменять каждый int

14 окт, 15:25 #44 #1075494

>>1075490
Нет, ты начал загонять что все разруливает стандарт, я говорю что нихуя он не разруливает, ты стал загонять что вообще похуй на размер типа мол платформе виднее какой размер использовать, я говорю что такой подход 100% приведет к тяжело излечимым багам а то и вовсе неработающей программе. Теперь ты решил мне доказать, что типа ты изначально имел в виду обратное, а я был не прав?

Ответы75501

14 окт, 15:26 #45 #1075495

>>1075490
> махрасофтовская типизация что-то меняет?
В ней иногда есть смысл. Например, они однажды написали (когда еще не было uint32_t), что палитра в BMP - это массив DWORD, и ни одна сука, ни на какой разрядности процессора это уже не сломает - нужно будет изменить только тайпдеф дворда, а не все 50 метров Platform SDK.

>>1075492
> сами за себя говорят обо всем
Так сколько там бит в pid_t?

> четко разделить тайпдефы которые могут быть opaque типами
Покажи мне юзкейс, когда мне просто пиздец как нужно знать, opaque тип это или нормальная структура.

Ответы75509

14 окт, 15:30 #46 #1075501

>>1075494
я просто курнул - я вот и потерял нить. не знаю зачем я эту вкалдку оставил открытой. но.

не, подожди. я всё равно считаю, что тебе почти никогда не нужны фиксированные типы, а если нет - то и не тыёбуйся, пусть платформа их определит.

а ошибки переносимости зачастую из за того, что в своё время не было модного типа intptr и все кастовали к тому, что у них на платформе эквивалентно.

14 окт, 15:34 #47 #1075509

>>1075495
>Так сколько там бит в pid_t?
Ты походу не понимаешь что такое opaque типы. pid_t как раз им и является, ты не должен знать сколько там бит и т.п это закрытый типа, с которым работает некоторый сет функций и только через них ты должен с ним обращаться, но никак не напрямую.
u64 это специальные тайпдефы на инты в названии которых заложен знак и разрядность независимо от платформы, ты знаешь что размер будет 64 байта хоть на x86_64 хоть на ARM хоть на sparc хоть на аллахе. И ты можешь с ними работать как с обычными интами.

Ответы7552075525

14 окт, 15:44 #48 #1075520

>>1075509
> ты не должен знать сколько там бит
Ну охуеть теперь. А как мне pid процесса-то напечатать? Какой спецификатор в printf пихать? Это не структура, так что, я думаю, %lf подойдет.

> u64 это специальные тайпдефы на инты
Да-да, я уже понял, что они не осилили stdint. Такие-то стайлгайды.

14 окт, 15:50 #49 #1075525

>>1075509
> Ты походу не понимаешь что такое opaque типы
Это ты не помимаешь. Opaque-типы декларируются через incomplete структуры, чтобы в клиентском коде нельзя было объявить переменную этого типа и нельзя было прочитать что-то осмысленное. Со структурой такого типа можно работать только посредством фунций (методов), которые получают только указатель на тип. В реализации, естественно, есть определение структуры. Очевидно, что pid_t ни разу под такое не подходит: я могу объявить pid_t, могу читать pid_t, могу передавать в функции целочисленные литералы, скастованные (или нет) к pid_t.

Ответы75530

14 окт, 16:10 #50 #1075530

>>1075525
Во-первых, я все это пересказал уже пару постов выше.
pid_t я немного не точно сказал, т.к. это относится к user space типу из ядра, чтобы была переносимость юзер кода. Linux kernel code style такое не запрещает, этот случай там описывается, и это единственный возможный вариант сделать платформонезависимый тип во вне.

Ответы75532

14 окт, 16:11 #51 #1075532

>>1075530
Алсо, забыл добавить, что к таким типам арифметика в идеале не применима и ты не можешь им пользоваться как обычным интом, так что считай тип opaque.

Ответы75538

14 окт, 16:19 #52 #1075538

>>1075532
Это знаешь как в OpenGL практически все возращаемые хендлеры имеют тип GLuint хотя полезной информации в себе не несут никакой для пользователя, и не понятно при чем тут uint, могли бы указатель возвращать на настоящий opaque тип, либо хотя бы не приписывать uint к типу, который только сбивает с толку. Но не все идеально в этом мире.

25 Кб, 302x243

15 окт, 01:15 #53 #1075776

>>1075097

Таненбаум тебе коротко пояснит, всего на 2100 страниц. Да это коротенько совсем. Если углубляться, то лучше не считать страницы... нужно уже годами считать.

15 окт, 21:05 #54 #1076287

Ну что мужики, единственный нормальный тред на борде. Куда обезьяны-пидоры практически не заходят.
Что делаете, делитесь кодом, мыслями, проблемами?

Я вот уже неделю делаю CPU scheduler для одной реалтайм приложеху в юзер спейсе. Заебался че-то, сегодня вот потратил день на рефакторинг, разделения всего на модули и т.п. т.к. чето тупанул и хуярил сначала все в одном вайле и сам не заметил как он перевалил в 3к строк.

Ответы764077646876504

16 окт, 00:22 #55 #1076407

>>1076287
>Заебался че-то, сегодня вот потратил день на рефакторинг, разделения всего на модули и т
это то, чем я занимался последнюю неделю. а ещё тесты писал.

а я пишу какое-то говно. вон, тут спрашивал на тему курутин.

но сложно, не всегда код можно отделить друг от друга - я нарисовал схему, где одни подсистемы пользуются только такой-то частью структур и прочее...

(pk) (ph)
keya-+--> subcxt <------------2[cxt]
.---:----:-^ key(pck)
| | | ^ ^
| | '----> cxtins(pci)<-2[key]
| | |
| +--> substt <--:-------1[stt]
~ | .:---------1'2
[main] | .-----||-----------'
~ | | |'------1.
| +--> subper <-:-----1[per]
| | | |.------1'
| | | vvv------1[vrt]
| | .--:-> appins(pai)
| | +--:-> appcnt(pac)
| '--> subapp <------------2[app]
'---------^ '-^

16 окт, 00:26 #56 #1076411

ну и да, писал тесты - нашёл кучу багов, разнервничался, пришлось выпить, поэтому теперь я в запое.

16 окт, 05:25 #57 #1076468

>>1076287
>3к строк
что в этом плохого?

Ответы76584

16 окт, 10:04 #58 #1076504

>>1076287
>разделения всего на модули и т.п. т.к.
Как остановится? Я разделяю код на совсем уж мелкие объекты, чтобы было проще покрывать тестами пользуюсь cmocka. В итоге даже небольшой проект состоит из нескольких папочек. Иногда кажется, что нарушаю принцип KISS.

Ответы7650576584

16 окт, 10:05 #59 #1076505

>>1076504
>остановиться
быстрофикс

16 окт, 14:20 #60 #1076584

>>1076468
Плохо, когда слабо связанные функции находятся во всем этом, например после рефакторинга шедулера, у меня появились отдельные файлы для очереди, для профайлинга, для воркеров, файл с общими макросами и структурами, и главный файл с хедером в котором все это собрано в шедулер и в хедере торчат уже апи.

>>1076504
Разделяй по смыслу и по архитектурным особенностям приложения, выделяй общий код в отдельные файлы.
Я вообще не особый сторонник разработки через тестирование, ибо работал в одном проекте где на каждый пук надо было тесты писать и это пиздец как утомляло и замедляло разработку, очень сильно замедляло, ибо порой на простую функцию сделанную за пару часов, тебе нужно было писать несколько сложных тестов на которые у тебя мог уйти день, а потом могло оказаться что нет, нам эта функция не нужна, отменяйте там все. И спрашивается нахуя мы пишем тесты эти?

Вообще я считаю, хорошо спроектированное приложение, с хорошим дизайном, разделенное на модули, с обработкой ошибок и т.д. вообще не нуждается в тестах ( ну максимум в каких-то совсем общих ), ибо любую ошибку можно легко отследить, при таком раскладе, она останется локальна в каком-то модуле и по логам сразу всплывет. Ну и конечно уровень разработчиков если они пишут на С должен быть соответствующим, чтобы не допускать глупых ошибок.

Ответы766397750679033

16 окт, 16:06 #61 #1076639

>>1076584
> не нуждается в тестах
Двачую этого. Тесты нужны, если разработчик не до конца понимает, что делает (например, не кристально ясно видит алгоритм, не полностью знаком с API, пишет по-быстрому, чтобы успеть к дедлайнам и т. д.). К сожалению, сейчас почти весь код так и пишется.

Ответы76654

16 окт, 16:32 #62 #1076654

>>1076639
>Тесты нужны, если разработчик не до конца понимает
Тесты нужны, если разработчик не работает в одиночку. Если я ковыряю чужой говнокод, мне проще добавить фичу/изменить что-то, а потом прогнать тесты, чтобы удостовериться, что я ничего не сломал.

Ответы766637667476675

16 окт, 16:37 #63 #1076663

>>1076654
Разработчик никогда не работает в одиночку. Ты сегодня и ты через месяц - два разных разработчика.

мимопроходил и охуел с обсуждения таких пубертатных тем в си-треде. сосака, хуле

Ответы76674

16 окт, 16:45 #64 #1076674

>>1076654
>говнокод
Ключевое слово.
>>1076663
>Ты сегодня и ты через месяц - два разных разработчика.
Вот этот прав. Поэтому в хороших проектах, особенно опенсорсных, придерживаются жесткого код стайла. Чтоб новички только начавшие заниматься проектом, как можно быстрее в этом разобрались и чтоб старые разрабы не запутывались в своих поделиях.
Время потраченное на поддержку хорошего код стайла и дизайна в проекте, намного меньше чем написание говнотестам к ковнокоду, в котором никому не охото разбираться.

16 окт, 16:45 #65 #1076675

>>1076654
> Если я ковыряю чужой говнокод, мне проще добавить фичу/изменить что-то, а потом прогнать тесты
Ну так и я о том же. Ты не понимаешь, как кусок твоего кода взаимодействует с чужим, поэтому надеешься на тесты вместо того, чтобы писать качественно.

17 окт, 18:36 #66 #1077227

Реально вкатится за пару месяцев на приличном уровне?
скриптоёб в треде

Ответы7723277365

17 окт, 18:44 #67 #1077232

>>1077227
Изучить синтаксис и писать мелкие утилиты - да. На приличном уровне - нет.

Ответы77282

17 окт, 20:23 #68 #1077282

>>1077232
мне он нужен чисто как дополнение к питону для повышения быстродействия. видимо все же придётся, жаль пока нет библиотек для интеграции Go в питон

17 окт, 22:50 #69 #1077365

>>1077227
Изучи строение компьютера.
Примитивные процессорные комманды, типа движение байт влево-вправо, двоично посклатывай\вычитай в уме.

Адресное пространство. Регистры. Как выполняется программа на ассемблере, в каком порядке.

Ну всё вроде.

18 окт, 07:54 #70 #1077478

кто шарить в стандарте С99 объясните чем кардинально отличаются прототипы функций типа:
void func(int arr[], int n);
и
void func(int n, int arr[n]);

Ответы77615

18 окт, 08:14 #71 #1077480

Посоветуйте пожалуйста справочник по языку на русском, в формате как стандарт языка, но на русском.

Ответы77483

18 окт, 08:58 #72 #1077483

>>1077480
Вот в виде конспекта в 4 частях. PDF.
http://kpolyakov.spb.ru/school/c.htm

18 окт, 10:32 #73 #1077501

Двач, хочу по приколу попытаться переписать свой игровой движок на "C" с "C++", ладно классы и прочая хуйня, скажите как жить без пространств имён, перегрузок и куда девать глобальные переменные?

Ответы7750295510

18 окт, 10:37 #74 #1077502

>>1077501
>пространств имён, перегрузок
вырпботать стиль именования фанкций, обычно префикс служит как пространство имени. но если ты будешь хуярить ооп на си, заворачивая например указатели на функции в структуры, то ты нахуй съезжать с плюсов?

18 окт, 11:02 #75 #1077506

>>1076584
>она останется локальна в каком-то модуле и по логам сразу всплывет
Что теперь весь стек в лог переписывать или в каждую процедуру отдельную пихать систему логирования и обработки ошибок? И как потом использовать такие процедуры в других проектах, выковыривать всю эту систему логирования и обработки ошибок?

18 окт, 14:48 #76 #1077615

>>1077478
> чем кардинально отличаются прототипы функций
Ничем. Когда Си видит массив в выражении или в формальных параметрах функции, он неявно преобразовывает массив к указателю на его первый элемент. Следующие объявления эквивалентны:
void func(int n, int ∗arr);
void func(int n, int arr[]);
void func(int n, int arr[100]);
void func(int n, int arr[n]);
void func(int n, int arr[∗]);
Последние два объявления используют (и соответственно требуют поддержки компилятором) VLA. Но из-за преобразования массива к указателю никаких VLA там не остается, и прототипы становятся совместимы с предыдущими. Вот если бы у тебя было два и более измерения, тогда вариант с VLA отличался бы типом.

Ответы78687

18 окт, 15:31 #77 #1077634

Ответьте на вопросы про формальную верификацию:
https://2ch.hk/pr/res/1077629.html (М)

18 окт, 15:50 #78 #1077645

Как файл поксорить по 4-х байтовым сегментам на 25 24 74 и 05 соответственно ???

Ответы77707777197964480091

18 окт, 17:01 #79 #1077707

>>1077645
читаешь в буфер по 4ре байта и ксоришь?

18 окт, 17:25 #80 #1077719

>>1077645
>25 24 74 и 05 соответственно
почему?

19 окт, 02:17 #81 #1077949

Ребята, верно ли, что что указатель "знает" свой размер? В смысле, мы можем неписать примерно такую конструкцию:

double (звездочка)x = malloc(50*sizeof(double));
int size = sizeof(x) / sizeof(double);

Так нафига при передачи указателя в функцию мы пишем
int f(double (звездочка)x, int size_x)
?

Ответы77955

19 окт, 02:58 #82 #1077955

>>1077949
> верно ли, что что указатель "знает" свой размер
Нет. Указатель знает свой размер, но не размер объекта, на который он указывает. Указатель тупо содержит адрес области памяти (смещение до первого байта объекта в адресном пространстве), не больше. Даже информация о типе существует только во время компиляции.

Значение size во второй строке не имеет смысла и зависит от платформы. sizeof(x) равен размеру самого указателя x - ну, например, 4 на x86, а sizeof(double) будет, например, 8.

Ответы77957

19 окт, 03:12 #83 #1077957

>>1077955
Тогда немного не понял, чего хочет препод (строкой выше в коде был объявлен массив LIST_OF_PLANETS):
> const unsigned LEN_LIST_OF_PLANETS = 11;
> можно так: sizeof(LIST_OF_PLANETS) / sizeof(LIST_OF_PLANETS[0])
> и не придётся следить за соответствием массива и его размера.

Алсо, почему так получается, что мы никак не можем узнать количество выделенной памяти, а free, получая указатель на нулевой элемент, очищает память? Ведь получается, free точно знает количество выделенной памяти.

Ответы77969

19 окт, 03:50 #84 #1077969

>>1077957
Ключевое слово - массив. Если у тебя именно массив, то компилятор знает его размер (или знает, где его взять в рантайме в случае с VLA):
int foo[10]; printf("%zu\n", sizeof(foo) / sizeof(foo[0]));
напечатает 10, потому что первый sizeof вернет размер массива в байтах, а второй - размер элемента. Делим, получаем количество элементов. Это работает. А вот:
int ∗foo = whatever; printf("%zu\n", sizeof(foo) / sizeof(foo[0]));
уже не будет работать, как ожидается. Этот вариант - очень частая ошибка (особенно если делают #define countof(array) (sizeof(array) / sizeof(array)[0]) и случайно скармливают ему указатель). Поэтому у компилятора обычно можно включить предупреждение о попытке сделать sizeof(указатель).

> Ведь получается, free точно знает количество выделенной памяти
Да, malloc(), выделяя память, в том или ином виде запоминает размер блока (или указатель на следующее за ним свободное место, или используются иные способы). free() знает, как в данном конкретном аллокаторе хранятся размеры, поэтому может освободить память. Стандартного и доступного программисту способа узнать, сколько было выделено, не существует, но в зависимости от используемой стандартной библиотеки есть всякие расширения типа malloc_usable_size и прочих _msize() (может вернуть значение слегка больше того, что ты передавал в malloc). Но лучше не закладывайся на нестандартные фичи и храни размер сам, если он динамический.

Ответы78094

19 окт, 10:06 #85 #1078060

2ch, мне во всей программе нужно сменить тип с int на long long int, как это можно сделать?

Ответы78124

754 Кб, 948x800

19 окт, 11:43 #86 #1078094

>>1077969
Благодарю.

114 Кб, 850x800

19 окт, 12:50 #87 #1078124

>>1078060
#define int long long int

19 окт, 18:44 #88 #1078319

посоветуйте Ide для gcc.я понимаю что нет ничего лучше нотепада и командной строки но все же

Ответы7834478425

19 окт, 19:15 #89 #1078344

>>1078319
Кодеблокс.

19 окт, 20:45 #90 #1078425

>>1078319
clion

19 окт, 20:48 #91 #1078429

начал изучать си по k&r
какого хуя если не указывать celsius в printf, он всё равно выводится после табуляции? как блять? компилирую gcc из терминала

#include <stdio.h>
int main()
{
int fahr;
int celsius;
int lower, upper, step;

lower = 0;
upper = 300;
step = 20;

while (fahr <= upper) {
celsius = 5 * (fahr - 32) / 9;
printf("%d\t%d\n", fahr);
fahr = fahr + step;
}
}

Ответы78432

19 окт, 20:53 #92 #1078432

>>1078429
Так блять.
Во-первых, указывай -Wall -Wextra, особенно пока учишь язык.
Во-вторых, это неопределенное поведение (баг), не делай так. В другими ключами компиляции или в другую фазу луны будет выводиться другое значение.
В-третьих, суть спецэффекта в том, что printf просто читает аргументы последовательно, начиная с какой-то локации в стеке. Рядом с аргументами лежат и локальные переменные функции. И если ты указываешь меньше аргументов, чем нужно, то у некоторых функций типа printf появляется шанс прочитать локальную или какую-то временную переменную вместо аргумента.

Ответы7844878707

19 окт, 21:00 #93 #1078443

Почему C, а не C++?

Ответы78456

19 окт, 21:04 #94 #1078448

>>1078432
интересно, спасибо!

19 окт, 21:08 #95 #1078456

>>1078443
Потому что Си можно объяснить нормальному человеку на нормальном уровне за полгода и выучить качественно года за два. А кресты во много раз сложнее, и хорошо его знают очень немногие.

19 окт, 23:39 #96 #1078559

Такой вот вопрос, все таки лучше пердолиться и читать скрипя зубами K&R на английском или на своем РОДНОМ РУССКОМ пидорашьем языке?

Ответы78568

20 окт, 00:01 #97 #1078568

>>1078559
Ты можешь читать хоть на китайском, но имей в виду, что большого количества документации и статей на русском не существует вообще. Привыкать читать на английском понемногу с самого начала или скрипеть зубами, когда припрет - дело твое. На самом деле, технический английский очень простой же.

Ответы78569

20 окт, 00:04 #98 #1078569

>>1078568
Ок, буду стараться, с художественным так-то проблем нету, но вот технический открываю, прочитаю страницу и хочется закрыть уже

Ответы78624

20 окт, 02:49 #99 #1078624

>>1078569
Пиздёж какой-то, технический буквально на порядок легче.

20 окт, 09:51 #100 #1078687

>>1077615
Огромное спасибо, теперь я хоть понял как работать с многомерными массивами разных размеров, а то до этого ебался с массивами.

20 окт, 11:12 #101 #1078707

>>1078432
>Во-первых, указывай -Wall -Wextra, особенно пока учишь язык.
Вместе с -Wall -Wextra надо ещё -Werror добавлять.

Ответы787507876586727

20 окт, 13:33 #102 #1078750

>>1078707
А еще -Wpedantic и -Wpedantic-errors и еще лучше -ansi

Ответы78765

20 окт, 14:32 #103 #1078765

>>1078707
> -Werror
Чушь. Если у тебя стремление анально ублажить компилятор, ты, наверное, и в жизни так поступаешь? Не все ворнинги одинаково полезны. Они на то и ворнинги, а не ошибки. Они призывают обратить внимание. Особо ебнутые ворнинги вообще нужно затыкать. В качестве отличного примера можно привести высер столмана -Wdate-time.

>>1078750
> -ansi
Фу таким быть. 2017 год подходит к концу.

Ответы78772

20 окт, 14:52 #104 #1078772

>>1078765
Ты не прав. Ворнинги на то и ворнинги, что чтоб предупреждать об отклонении от правил языка и потенциальных ошибках. Если ты затыкаешь ворнинги, думаю твоя программа упадет в один прекрасный момент. Я всегда пишут со всеми включенными ворнингами, кроме иногда -Wpedantic. Если в моей программе появляется ворнинг, то я его сразу пытаюсь устранить пересмотром кода.
Меня это очень много раз спасало от ошибок и багов.
А -Werror не плохая идея, ибо в большом проекте можно и не заметить за кучей вывода ворнинг. Да и при рекомпиляции они затухают и можно забыть о их существовании и ускать баги в другом месте, когда ворнинг чекто указывает туда.

-ansi конечно я сам не использую, ибо сложно отказаться от вкусностей С99, но для обучения С отлично подойдет.

Ответы787827878478948

20 окт, 15:12 #105 #1078782

>>1078772
Удваиваю этого. Когда пишу по AVR всегда правлю все ворнинги. Потому что обычно то, что считается ворнингами довольно критично при работе самой программы, особенно если там сорт оф байтоёбство.

Ответы78786

20 окт, 15:20 #106 #1078784

>>1078772
Ты забыл ответить, чем __DATE__ отклоняется от правил языка, и какие потенциальные ошибки привносит.
Ты забыл рассказать новичку, что из-за твоего -Werror у него не будет компилироваться добрая половина примеров. А как исправить причину, он может пока и не знать.

Ворнинги - это способ, которым автор (или авторы) компиляторы говорят, что конкретно им что-то не нравится (есть ворнинги, которые требуются по стандарту, и они обычно адекватные). Это не всегда имеет отношение к языку, это всего лишь личные предпочтения. И чаще всего это ломает чьи-то привычки и хуже того, ломает чей-то работающий и не имеющий проблем код.

Например, по мне if (fp = fopen(...)) вполне нормальный код (стандарт языка со мной согласен), я не помню ни одного раза, когда я бы перепутал = и ==, но разработчики из GCC считают иначе, и из-за них я не могу так писать. Еще они не любят неиспользуемые аргументы, и мне приходится либо ублажать компилятор и замусоривать код всякими UNREFERENCED_PARAMETER(), либо не использовать Windows API, наполненный колбеками, в которых половина аргументов чаще всего нахуй не нужна. Еще в GCC много лет не было никаких предупреждений на тему "забытого" break в switch, но затем они изменили свое мнение, и вот, наконец, в GCC 7 у нас есть -Wimplicit-fallthrough, причем переносимого способа ублажить компилятор на этот раз вообще не существует (атрибуты появятся только в C2x). Охуенный подарок мейнтейнерам тех дистрибутивов, в которых кто-то, подобный тебе решил, что сборка пакетов с -Werror - это замечательная идея. Ну и, например, разработчики шланга не любят definition внешней функции без предварительного declaration, поэтому даже в проекте из двух .c-файлов нужны хедеры или бесполезные объявления.

Ответы7882678858

20 окт, 15:30 #107 #1078786

>>1078782
> особенно если там сорт оф байтоёбство
foo = bar + 127 | 1;
> SUGGEST PARENTHESES AROUND ARITHMETIC
> МЫ НИПОМНИМ ПРЕОРИТЕТАВ, НАМ НИПРИЯТНА!!1111

20 окт, 16:38 #108 #1078826

>>1078784
А что с __DATE__ то не так?
>If GCC cannot determine the current date, it will emit a warning message (once per compilation) and __DATE__ will expand to "??? ?? ????".

>Ворнинги - это способ, которым автор (или авторы) компиляторы говорят, что конкретно им что-то не нравится
Опять ты не прав.
Даже тот же педантик
>-Wpedantic
>-pedantic
>Issue all the warnings demanded by strict ISO C and ISO C++; reject all programs that use forbidden extensions, and some other programs that do not follow ISO C and ISO C++. For ISO C, follows the version of the ISO C standard specified by any -std option used.

> if (fp = fopen(...)) вполне нормальный код
А по мне это потенциально опасный код и плохой code style ибо заставляет задумываться, что там имелось ввиду, сравнение или присвоение.

> Еще они не любят неиспользуемые аргументы, и мне приходится либо ублажать компилятор и замусоривать код всякими UNREFERENCED_PARAMETER()
Вот это очень полезный ворнинг, предупреждающий многие баги. Меня лично сотни раз спасал от неинициализированных переменных и т.п. Особенно когда делаешь рефакторинг, можешь запросто удалить часть кода и забыть исправить логику.

>не использовать Windows API
Это очень хорошая идея. А лучше вообще не использовать Windows.

>наполненный колбеками, в которых половина аргументов чаще всего нахуй не нужна
Так, чего ты хотел от говнокода сделанного в майкрософте, где 95% разработчиков индусы.

>есть -Wimplicit-fallthrough, причем переносимого способа ублажить компилятор на этот раз вообще не существуе
Тоже полезная вещь, ибо очень легко забыть поставить break после case и долго не понимать почему твоя программа работает по другой логике, если вообще работает.
Алсо, любой ворнинг можно отключить через Wno-{warning_name}.

>сборка пакетов с -Werror
Так никто не собирает с -Werror пакеты, -Werror должно стоять у разработчиков, а у пользователей кто собирает нет, ибо вероятность появления ворнинга на друглой платформе или компиляторе большая из-за разности стандартов и т.п. но если разработчики делают, что-то что вызывает ворнинги, значит сами виноваты и это на их совести.

Вот например скажи мне почему ядро линукс, собирается без ворнингов на любом поддерживаемом gcc? При том они там успользуют С99 c GNU расширениями, а не -ansi.

20 окт, 16:38 #108 #1078826

>>1078784
А что с __DATE__ то не так?
>If GCC cannot determine the current date, it will emit a warning message (once per compilation) and __DATE__ will expand to "??? ?? ????".

>Ворнинги - это способ, которым автор (или авторы) компиляторы говорят, что конкретно им что-то не нравится
Опять ты не прав.
Даже тот же педантик
>-Wpedantic
>-pedantic
>Issue all the warnings demanded by strict ISO C and ISO C++; reject all programs that use forbidden extensions, and some other programs that do not follow ISO C and ISO C++. For ISO C, follows the version of the ISO C standard specified by any -std option used.

> if (fp = fopen(...)) вполне нормальный код
А по мне это потенциально опасный код и плохой code style ибо заставляет задумываться, что там имелось ввиду, сравнение или присвоение.

> Еще они не любят неиспользуемые аргументы, и мне приходится либо ублажать компилятор и замусоривать код всякими UNREFERENCED_PARAMETER()
Вот это очень полезный ворнинг, предупреждающий многие баги. Меня лично сотни раз спасал от неинициализированных переменных и т.п. Особенно когда делаешь рефакторинг, можешь запросто удалить часть кода и забыть исправить логику.

>не использовать Windows API
Это очень хорошая идея. А лучше вообще не использовать Windows.

>наполненный колбеками, в которых половина аргументов чаще всего нахуй не нужна
Так, чего ты хотел от говнокода сделанного в майкрософте, где 95% разработчиков индусы.

>есть -Wimplicit-fallthrough, причем переносимого способа ублажить компилятор на этот раз вообще не существуе
Тоже полезная вещь, ибо очень легко забыть поставить break после case и долго не понимать почему твоя программа работает по другой логике, если вообще работает.
Алсо, любой ворнинг можно отключить через Wno-{warning_name}.

>сборка пакетов с -Werror
Так никто не собирает с -Werror пакеты, -Werror должно стоять у разработчиков, а у пользователей кто собирает нет, ибо вероятность появления ворнинга на друглой платформе или компиляторе большая из-за разности стандартов и т.п. но если разработчики делают, что-то что вызывает ворнинги, значит сами виноваты и это на их совести.

Вот например скажи мне почему ядро линукс, собирается без ворнингов на любом поддерживаемом gcc? При том они там успользуют С99 c GNU расширениями, а не -ansi.

Показать весь текст
Ответы78855

20 окт, 18:09 #109 #1078855

>>1078826
> __DATE__ will expand to "??? ?? ????".
Да, есть такое. И часто ты видел компы без RTC, которые дату не знают, но при этом на них собирается код на Си? Но ты, видимо, не в теме. Ворнинг, про который я говорил - безусловный, просто из-за факта использования __DATE__ или __TIME__, просто потому что сталману захотелось воспроизводимые сборки, а биндиффы он не осилил.

> заставляет задумываться
А меня заставляет задумываться математика в DSP. Иногда очень надолго. Давай сделаем ворнинг -Wой-сложна? Или лучше -Werror-ой-сложна?

> от неинициализированных переменных
Про неинициализированные переменные - отличный ворнинг, и стандартный к тому же. Но он не имеет отношения к неиспользуемым параметрам.

> лучше вообще не использовать Windows
Лол, чего еще я мог ожидать.

> Так, чего ты хотел от говнокода сделанного в майкрософт
Я сомневаюсь, что там был хотя бы один индус, когда дизайнился Windows API. Ну да похуй. Поговорим про sigfunc_t и ее параметр? Про кучу 3rd-party кода, который тоже не сделан в майкрософте, а колбеки использует?

> -Wimplicit-fallthrough
> Тоже полезная вещь
Согласен. Очень полезная. Только в стандарте такого нет, а код сломался.

> можно отключить через Wno-{warning_name}
Можно. Только это не спасет от тех, кто будет собирать с -Werror и вопить, что у него не компилируется. Поэтому приходится городить полстраницы всяких #pragma GCC diagnostic ignored и аналогов в ифдефах для каждого компилятора. Но и это не спасает от внезапно появивишегося -Wой-сложна.

> Так никто не собирает с -Werror пакеты
А ты думаешь, я на пустом месте бугурчу? Нет, собирают. Ближайший пример - арч, в котором пару лет назад внезапно перестали не собираться дрова, использовавшие __DATE__. Хотя чего это я... арч же.

> Вот например скажи мне почему ядро линукс
Тебе принести вопли Торвальдса про strict aliasing, или сам найдешь? Ядро собирается без ворнингов, потому что они сосут GCC, при выходе нового GCC досасывают недостающее, а в тех редких случаях, когда не сосут, указывают ключиками, что они умнее. Лучше ты мне скажи, почему ядро линукс более никаким компилятором не собирается, и как после всего этого без смеха слушать про переносимость линукса и Си?

20 окт, 18:09 #109 #1078855

>>1078826
> __DATE__ will expand to "??? ?? ????".
Да, есть такое. И часто ты видел компы без RTC, которые дату не знают, но при этом на них собирается код на Си? Но ты, видимо, не в теме. Ворнинг, про который я говорил - безусловный, просто из-за факта использования __DATE__ или __TIME__, просто потому что сталману захотелось воспроизводимые сборки, а биндиффы он не осилил.

> заставляет задумываться
А меня заставляет задумываться математика в DSP. Иногда очень надолго. Давай сделаем ворнинг -Wой-сложна? Или лучше -Werror-ой-сложна?

> от неинициализированных переменных
Про неинициализированные переменные - отличный ворнинг, и стандартный к тому же. Но он не имеет отношения к неиспользуемым параметрам.

> лучше вообще не использовать Windows
Лол, чего еще я мог ожидать.

> Так, чего ты хотел от говнокода сделанного в майкрософт
Я сомневаюсь, что там был хотя бы один индус, когда дизайнился Windows API. Ну да похуй. Поговорим про sigfunc_t и ее параметр? Про кучу 3rd-party кода, который тоже не сделан в майкрософте, а колбеки использует?

> -Wimplicit-fallthrough
> Тоже полезная вещь
Согласен. Очень полезная. Только в стандарте такого нет, а код сломался.

> можно отключить через Wno-{warning_name}
Можно. Только это не спасет от тех, кто будет собирать с -Werror и вопить, что у него не компилируется. Поэтому приходится городить полстраницы всяких #pragma GCC diagnostic ignored и аналогов в ифдефах для каждого компилятора. Но и это не спасает от внезапно появивишегося -Wой-сложна.

> Так никто не собирает с -Werror пакеты
А ты думаешь, я на пустом месте бугурчу? Нет, собирают. Ближайший пример - арч, в котором пару лет назад внезапно перестали не собираться дрова, использовавшие __DATE__. Хотя чего это я... арч же.

> Вот например скажи мне почему ядро линукс
Тебе принести вопли Торвальдса про strict aliasing, или сам найдешь? Ядро собирается без ворнингов, потому что они сосут GCC, при выходе нового GCC досасывают недостающее, а в тех редких случаях, когда не сосут, указывают ключиками, что они умнее. Лучше ты мне скажи, почему ядро линукс более никаким компилятором не собирается, и как после всего этого без смеха слушать про переносимость линукса и Си?

Показать весь текст
Ответы7887778953

20 окт, 18:16 #110 #1078858

>>1078784
>в которых половина аргументов чаще всего нахуй
К примеру? Там вроде всегда один и тот же набор аргументов более менее. Хендл объекта ядра, какие нибудь смещение битовое, парочку текстовых строк, какой нибудь флаг и может быть зарезервированное слово какое нибудь.

Ответы79013

20 окт, 18:51 #111 #1078875

Выручайте:
Convert.ToInt32(t2.Text) = Convert.ToInt32(t1.Text) % Convert.ToInt32(t2.Text);
Почему выдаёт ошибку:
the left-hand side of an assignment must be a variable a property or an indexer

Ответы78927

20 окт, 18:53 #112 #1078877

>>1078855
> безусловный, просто из-за факта использования __DATE__ или __TIME__
Что-то я не пойму о чем ты. Никаких ворнингов нет.
>printf("%s", __DATE__);
gcc 7.2.0 -Wall -Wextra

Может ты себя накручиваешь просто?

>А меня заставляет задумываться математика в DSP.
Так конструктивно есть что сказать? Без иронизирования моих аргументов с целью увильнуть от объективного рассуждения.

>Про неинициализированные переменные - отличный ворнинг
Есть но он не может угадывать, как в твоем коде что может инициализироваться. Например, например ты забыл заполнить поле структуры из входящего аргумента, но тот ворнинг тебе ничего не скажет ибо та структура была инициализорованна, а вот на счет неиспользованного параметра ругнется.

>код сломался
Так опять же, никто не заставляет тебя в релиз билды в параметрах конфигурации пихать -Werror.

>Ближайший пример - арч
Слушай я сам на арче сижу уже несколько лет, до этого сидел на генту.
Но ты в курсе же что арч это бинарный дистрибутив и пакеты уже собраные устанавливаются., а то что лежит в AUR за это не несут никакую ответственность сами разработчики арча. Да и потом, переодически что-нибудь ставлю из AUR и очень редко в популярных пакетах не от Васяна, возникают какие-либо проблемы. Чаще всего проблемы возникают из-за того что меинтейнеры этих пакетов просто перестают их поддерживать и обновлять.

>strict aliasing
Так при чем здесь алиасинг и ворнинги? Алисинг серьезная вещь, которая может заставить проект вообще не работать. Тем более в гцц есть же атрибут для указания алиасинга.

> Ядро собирается без ворнингов, потому что они сосут GCC, при выходе нового GCC досасывают недостающее, а в тех редких случаях, когда не сосут, указывают ключиками, что они умнее
Тут я не особо понял, что ты имеешь ввиду. Да они кооперируются с разработчиками гцц, потмоу что ядро требует особого подхода во многих вещах, которых нету в стандарте, но это проблемы стандарта, а не кого либо из них.

>ядро линукс более никаким компилятором не собирается, и как после всего этого без смеха слушать про переносимость линукса и Си
Слушай братишка, это откровенная ложь , я лично сам собирал полностью ядро со всеми драйвера и т.п. интеловским компилятором. Да и цланг там вроде допиливают, по крайней мере видел в сорцах хедеры специально для цланга типа compiler-clang.h. Вопрос в том, какие еще компиляторы тебе нужны и какие реально существуют, а не заброшенны пару десятков лет назад? На сегодняшний день 3 основный компилера это GCC, Clang и Intel, другими в основном никто уже и не пользуется, даже майкрософт поняла что их компилятор говно и перешла на цланг.

20 окт, 18:53 #112 #1078877

>>1078855
> безусловный, просто из-за факта использования __DATE__ или __TIME__
Что-то я не пойму о чем ты. Никаких ворнингов нет.
>printf("%s", __DATE__);
gcc 7.2.0 -Wall -Wextra

Может ты себя накручиваешь просто?

>А меня заставляет задумываться математика в DSP.
Так конструктивно есть что сказать? Без иронизирования моих аргументов с целью увильнуть от объективного рассуждения.

>Про неинициализированные переменные - отличный ворнинг
Есть но он не может угадывать, как в твоем коде что может инициализироваться. Например, например ты забыл заполнить поле структуры из входящего аргумента, но тот ворнинг тебе ничего не скажет ибо та структура была инициализорованна, а вот на счет неиспользованного параметра ругнется.

>код сломался
Так опять же, никто не заставляет тебя в релиз билды в параметрах конфигурации пихать -Werror.

>Ближайший пример - арч
Слушай я сам на арче сижу уже несколько лет, до этого сидел на генту.
Но ты в курсе же что арч это бинарный дистрибутив и пакеты уже собраные устанавливаются., а то что лежит в AUR за это не несут никакую ответственность сами разработчики арча. Да и потом, переодически что-нибудь ставлю из AUR и очень редко в популярных пакетах не от Васяна, возникают какие-либо проблемы. Чаще всего проблемы возникают из-за того что меинтейнеры этих пакетов просто перестают их поддерживать и обновлять.

>strict aliasing
Так при чем здесь алиасинг и ворнинги? Алисинг серьезная вещь, которая может заставить проект вообще не работать. Тем более в гцц есть же атрибут для указания алиасинга.

> Ядро собирается без ворнингов, потому что они сосут GCC, при выходе нового GCC досасывают недостающее, а в тех редких случаях, когда не сосут, указывают ключиками, что они умнее
Тут я не особо понял, что ты имеешь ввиду. Да они кооперируются с разработчиками гцц, потмоу что ядро требует особого подхода во многих вещах, которых нету в стандарте, но это проблемы стандарта, а не кого либо из них.

>ядро линукс более никаким компилятором не собирается, и как после всего этого без смеха слушать про переносимость линукса и Си
Слушай братишка, это откровенная ложь , я лично сам собирал полностью ядро со всеми драйвера и т.п. интеловским компилятором. Да и цланг там вроде допиливают, по крайней мере видел в сорцах хедеры специально для цланга типа compiler-clang.h. Вопрос в том, какие еще компиляторы тебе нужны и какие реально существуют, а не заброшенны пару десятков лет назад? На сегодняшний день 3 основный компилера это GCC, Clang и Intel, другими в основном никто уже и не пользуется, даже майкрософт поняла что их компилятор говно и перешла на цланг.

Показать весь текст
Ответы79013

20 окт, 19:42 #113 #1078927

>>1078875
Твоё Convert.ToInt32(t1.Text) % Convert.ToInt32(t2.Text);
Должно куда-то записываться. А ты его пытаешься запихнуть в Convert.ToInt32(t2.Text)
У тебя там должно быть что-то вроде
t2.Text(Сonvert.ToInt32(t1.Text) % Convert.ToInt32(t2.Text)) = Convert.ToInt32(t1.Text) % Convert.ToInt32(t2.Text);

Ответы78930

20 окт, 19:43 #114 #1078930

>>1078927
ой лол
t2.Text(Сonvert.ToInt32(t1.Text) % Convert.ToInt32(t2.Text));
Вот так конечно же. Забыл удалить твой код

20 окт, 20:10 #115 #1078948

>>1078772
ебать ты наложница компилятора.

калят ворнинги по & я что даун который не может запомнить таблицу приоритетов?

20 окт, 20:19 #116 #1078953

>>1078855
>Лучше ты мне скажи, почему ядро линукс более никаким компилятором не собирается, и как после всего этого без смеха слушать про переносимость линукса и Си?
так это на самом деле нормально, хотя-бы исходя из того, что платформа (ос) определяет размеры типов.

106 Кб, 595x439

20 окт, 22:02 #117 #1079009

Ебать как тут сраки всем разворотило от -Werror. А я то им всего лишь ньюфаней на работе траллю, дописывая в мэйкфайл в параметрах гцц.

20 окт, 22:07 #118 #1079013

>>1078858
> Там вроде всегда один и тот же набор аргументов
Например, я сделал SetTimer с колбеком. Аргументы колбека: hwnd, uMsg, idEvent, dwTime. Главное окно одно, сообщение всегда WM_TIMER, таймер один, время нужно редко. Итого, колбек может не прочитать ни одного аргумента. Или, например, во многих функциях Enum и им подобных может интересовать только какой-то один аргумент. Вообще, навскидку сложно вспомнить, но ублажать компилятор на эту тему требуется достаточно часто.

>>1078877
> Что-то я не пойму о чем ты. Никаких ворнингов нет.
Окей, видимо, мне не везло с CFLAGS. Сейчас посмотрел, и не нашел Wdate-time ни в Wall, ни в Wextra. Но оно, разумеется, есть в шланговском Weverything.

> Так конструктивно есть что сказать?
Так я ж уже сказал. Вариант с присваиванием в if для тебя кажется непривычным и диким, потому что наличие ворнинга тебя к этому приучило (а может, и не тебя, а тех, у кого ты учился языку). Но на самом деле он не сложнее тех конструкций, к которым ты привык. Если уж говорить о вещах, которые заставляют задуматься, то if (NULL != (fp = fopen(...))) гораздо сложнее воспринимается, но кто-то все равно считает это хорошим стилем. Когда разработчики компилятора относят один вариант синтаксиса к хорошему стилю, а на второй выдают ворнинг - это их личное мнение, а не какая-то объективная оценка. И вот ворнинги как раз и придуманы для того, чтобы дать тебе шанс согласиться и исправить или наоборот решить, что разработчики пидоры и послать компилятор нахуй. Werror у тебя этот выбор отнимает. Все может измениться, если ты придумаешь способ заткнуть ворнинг в конкретном месте на всех компиляторах сразу без уродования кода и комментариев с бессмысленными цифрами. У PVS Studio не получилось, например.

> а вот на счет неиспользованного параметра ругнется
struct foo { int flag; int ∗someptr; };
void init_foo(struct foo ∗arg) {
arg->flag = 1;
}
Частый случай? Защитило? Ну да, я не забыл заполнить структуру. Но лучше бы забыл. Может, все же стоит головой думать?

> Но ты в курсе же что арч это бинарный дистрибутив и пакеты уже собраные устанавливаются
А ты слышал такое слово "DKMS"? grep Werror /usr/lib/modules/4./build/Makefile

> я лично сам собирал полностью ядро со всеми драйвера и т.п. интеловским компилятором
Это говорит о том, что Intel специально научили собирать ядро. Как tcc в свое время, например. Ок, я был не прав. Есть еще полтора компилятора, умеющие собирать линукс.

> Так при чем здесь алиасинг и ворнинги?
При том, что если ты просто попробуешь собрать ядро, оно не соберется. Ему нужны ключики, ему нужен отключенный strict aliasing, ему нужны расширения гцц. Если взять какой-нибудь другой компилятор, который просто поддерживает стандарт Си, хуй ты что соберешь, и хуй оно будет работать. А уж если ты Werror в нем включишь (или какой-то аналог), то ты узнаешь о коде ядра много нового, но при этом останешься с несобранным ядром.

> ядро требует особого подхода во многих вещах, которых нету в стандарте, но это проблемы стандарта
Что ни пост, то охуительное заявление. Windows нинужен, стандарт языка нинужен... огласишь остаток списка?

> даже майкрософт поняла что их компилятор говно и перешла на цланг
Я что-то пропустил? Я вот всегда думал, что кодогенератор у них свой, а шланг они притащили, просто потому что не успевают за охуительными фантазиями комитета по крестам.

> Вопрос в том, какие еще компиляторы тебе нужны и какие реально существуют
В моем мире существует много всяких железок и различных компиляторов. Коммерческие, опенсорсные, заброшенные и не обновлявшиеся с середины девяностых, но все они в той или иной мере нужны.

Впрочем, ладно. Нам всё равно друг друга не переубедить. Зато хоть тредик побампали.

20 окт, 22:07 #118 #1079013

>>1078858
> Там вроде всегда один и тот же набор аргументов
Например, я сделал SetTimer с колбеком. Аргументы колбека: hwnd, uMsg, idEvent, dwTime. Главное окно одно, сообщение всегда WM_TIMER, таймер один, время нужно редко. Итого, колбек может не прочитать ни одного аргумента. Или, например, во многих функциях Enum и им подобных может интересовать только какой-то один аргумент. Вообще, навскидку сложно вспомнить, но ублажать компилятор на эту тему требуется достаточно часто.

>>1078877
> Что-то я не пойму о чем ты. Никаких ворнингов нет.
Окей, видимо, мне не везло с CFLAGS. Сейчас посмотрел, и не нашел Wdate-time ни в Wall, ни в Wextra. Но оно, разумеется, есть в шланговском Weverything.

> Так конструктивно есть что сказать?
Так я ж уже сказал. Вариант с присваиванием в if для тебя кажется непривычным и диким, потому что наличие ворнинга тебя к этому приучило (а может, и не тебя, а тех, у кого ты учился языку). Но на самом деле он не сложнее тех конструкций, к которым ты привык. Если уж говорить о вещах, которые заставляют задуматься, то if (NULL != (fp = fopen(...))) гораздо сложнее воспринимается, но кто-то все равно считает это хорошим стилем. Когда разработчики компилятора относят один вариант синтаксиса к хорошему стилю, а на второй выдают ворнинг - это их личное мнение, а не какая-то объективная оценка. И вот ворнинги как раз и придуманы для того, чтобы дать тебе шанс согласиться и исправить или наоборот решить, что разработчики пидоры и послать компилятор нахуй. Werror у тебя этот выбор отнимает. Все может измениться, если ты придумаешь способ заткнуть ворнинг в конкретном месте на всех компиляторах сразу без уродования кода и комментариев с бессмысленными цифрами. У PVS Studio не получилось, например.

> а вот на счет неиспользованного параметра ругнется
struct foo { int flag; int ∗someptr; };
void init_foo(struct foo ∗arg) {
arg->flag = 1;
}
Частый случай? Защитило? Ну да, я не забыл заполнить структуру. Но лучше бы забыл. Может, все же стоит головой думать?

> Но ты в курсе же что арч это бинарный дистрибутив и пакеты уже собраные устанавливаются
А ты слышал такое слово "DKMS"? grep Werror /usr/lib/modules/4./build/Makefile

> я лично сам собирал полностью ядро со всеми драйвера и т.п. интеловским компилятором
Это говорит о том, что Intel специально научили собирать ядро. Как tcc в свое время, например. Ок, я был не прав. Есть еще полтора компилятора, умеющие собирать линукс.

> Так при чем здесь алиасинг и ворнинги?
При том, что если ты просто попробуешь собрать ядро, оно не соберется. Ему нужны ключики, ему нужен отключенный strict aliasing, ему нужны расширения гцц. Если взять какой-нибудь другой компилятор, который просто поддерживает стандарт Си, хуй ты что соберешь, и хуй оно будет работать. А уж если ты Werror в нем включишь (или какой-то аналог), то ты узнаешь о коде ядра много нового, но при этом останешься с несобранным ядром.

> ядро требует особого подхода во многих вещах, которых нету в стандарте, но это проблемы стандарта
Что ни пост, то охуительное заявление. Windows нинужен, стандарт языка нинужен... огласишь остаток списка?

> даже майкрософт поняла что их компилятор говно и перешла на цланг
Я что-то пропустил? Я вот всегда думал, что кодогенератор у них свой, а шланг они притащили, просто потому что не успевают за охуительными фантазиями комитета по крестам.

> Вопрос в том, какие еще компиляторы тебе нужны и какие реально существуют
В моем мире существует много всяких железок и различных компиляторов. Коммерческие, опенсорсные, заброшенные и не обновлявшиеся с середины девяностых, но все они в той или иной мере нужны.

Впрочем, ладно. Нам всё равно друг друга не переубедить. Зато хоть тредик побампали.

Показать весь текст
Ответы79040

20 окт, 22:34 #119 #1079030

>>1075465
да

20 окт, 22:40 #120 #1079033

>>1076584
> Вообще я считаю, хорошо спроектированное приложение, с хорошим дизайном, разделенное на модули, с обработкой ошибок и т.д. вообще не нуждается в тестах
такой-то манямирок

Ответы79035

20 окт, 22:44 #121 #1079035

>>1079033
> тесты
всю неделю хотел написать: не знаю что бы я делал без тестов в том плане, когда я придумываю систему-апи, и делая тесты, я в процессе нахожу кучу логических ошибок, архитектурных промашек - то есть, в таком ещё плане можно про них думать.

20 окт, 22:52 #122 #1079040

>>1079013
>if (NULL != (fp = fopen(...)))
Бля ну почему нельзя ну писать
fp = fopen(..);
if(fp == NULL)
ну или хотя бы просто if(!fp)
но нахуя это в одну строку то городить?

> Ну да, я не забыл заполнить структуру.
Так этот пример и не показывает случай с unused param у тебя там аргументом то и нету в функции.
flag = 1
Мммм меджик намберс збс.

>DKMS
Да у меня постоянно дрова от нвидии собираются через DKMS и еще пару других модулей. Никогда ошибок и ворнингов с этим не возникало.

А вот теперь остановимся на компиляторах и стандарте.
Ты прав, интел научили путем включения всех необходимых gnu extensions в языке, при чем эта возможно существует уже лет 7 если не больше.

>стандарт языка нинужен... огласишь остаток списка
Ты же понимаешь, что стандартных средств языка С недостаточно для написания полноценной, портабельной ОС, для всех архитектур? Поэтому существуют всякие gnu extensions и gcc builtins, которые нужны ребятам которые занимаются ядром ОС и эти ребята походу единственные кто двигает и улучшает язык С, и часть этих расширений в конце концов включается в новые стандарты. Но дело даже не в стандарте одобренным ISO/ANSI, дело в реальных потребностях на деле от языка С и если с этим соглашаются все остальные крупные разработчики компиляторов, типа gcc, clang intel то почему это не может считаться стандартом в неком роде, только из-за формальности ввиде отсутствия запатентованного драфта от ISO? А всем известно что такое стандартизация чего либо, и какая там бюрократия и еще что может быть.
Да и потом, кому как не разработчикам ядра придумывать новые возможности для языка? Ведь язык С был создан как раз для переписывания Unix с ассемблера на более высокоуровневый и портабельный язык.

Про майкрософт вообще говорить не стоит, их блядская студия, вообще никогда стандарту не следовала, и всегда была со своими расширениями, которые теперь нахуй никому не всрались и их говнокомпилятор даже С99 не поддерживает. Вон они сделали себе С# пусть на нем теперь и пишут свою ОС ( кстати сказать неплохой язык для макакинга в качестве альтернативы яве ), но по части ядра ОС и языка С майкорософт просто может идти нахуй. Все люди как люди, gnu, apple, intel, at&t, hp, amazon, google, а майкрософт у нас со своим говном, как говорится в семье не без урода.

20 окт, 22:52 #122 #1079040

>>1079013
>if (NULL != (fp = fopen(...)))
Бля ну почему нельзя ну писать
fp = fopen(..);
if(fp == NULL)
ну или хотя бы просто if(!fp)
но нахуя это в одну строку то городить?

> Ну да, я не забыл заполнить структуру.
Так этот пример и не показывает случай с unused param у тебя там аргументом то и нету в функции.
flag = 1
Мммм меджик намберс збс.

>DKMS
Да у меня постоянно дрова от нвидии собираются через DKMS и еще пару других модулей. Никогда ошибок и ворнингов с этим не возникало.

А вот теперь остановимся на компиляторах и стандарте.
Ты прав, интел научили путем включения всех необходимых gnu extensions в языке, при чем эта возможно существует уже лет 7 если не больше.

>стандарт языка нинужен... огласишь остаток списка
Ты же понимаешь, что стандартных средств языка С недостаточно для написания полноценной, портабельной ОС, для всех архитектур? Поэтому существуют всякие gnu extensions и gcc builtins, которые нужны ребятам которые занимаются ядром ОС и эти ребята походу единственные кто двигает и улучшает язык С, и часть этих расширений в конце концов включается в новые стандарты. Но дело даже не в стандарте одобренным ISO/ANSI, дело в реальных потребностях на деле от языка С и если с этим соглашаются все остальные крупные разработчики компиляторов, типа gcc, clang intel то почему это не может считаться стандартом в неком роде, только из-за формальности ввиде отсутствия запатентованного драфта от ISO? А всем известно что такое стандартизация чего либо, и какая там бюрократия и еще что может быть.
Да и потом, кому как не разработчикам ядра придумывать новые возможности для языка? Ведь язык С был создан как раз для переписывания Unix с ассемблера на более высокоуровневый и портабельный язык.

Про майкрософт вообще говорить не стоит, их блядская студия, вообще никогда стандарту не следовала, и всегда была со своими расширениями, которые теперь нахуй никому не всрались и их говнокомпилятор даже С99 не поддерживает. Вон они сделали себе С# пусть на нем теперь и пишут свою ОС ( кстати сказать неплохой язык для макакинга в качестве альтернативы яве ), но по части ядра ОС и языка С майкорософт просто может идти нахуй. Все люди как люди, gnu, apple, intel, at&t, hp, amazon, google, а майкрософт у нас со своим говном, как говорится в семье не без урода.

Показать весь текст
Ответы7904379070

20 окт, 22:56 #123 #1079043

>>1079040
>но нахуя это в одну строку то городить?
вот с таких оленей я всегда угораю: как хочу так и пишу, может вы язык перепутали?

Ответы79046

20 окт, 22:59 #124 #1079046

>>1079043
Так может ты перепутал чего, браток? Это тебе не щитпостинг на дваче.
В языках программирования нужно придерживаться правил и считаться с другими людьми, кто твой код читать будет.

Ответы79048

20 окт, 23:00 #125 #1079048

>>1079046
> слышь, пацанчик, а чё это ты так одет не по понятиям?
нахуй иди.

Ответы79051

20 окт, 23:05 #126 #1079051

>>1079048
Ты откуда прелетел такой фраерок? Из петушиного JS тредаугла что ли? Пади падмойса, маня.

Ответы79052

20 окт, 23:07 #127 #1079052

>>1079051
лел, я тут сижу лет 5.

Ответы79058

20 окт, 23:08 #128 #1079054

что кстати и отличает бабуинов от человека - они постоянно уничижительно высказываются о скриптовиках.

20 окт, 23:14 #129 #1079058

>>1079052
Ты за 5 лет так ничему и не научился? Мда..

20 окт, 23:32 #130 #1079070

>>1079040
> но нахуя это в одну строку то городить?
Это другой вопрос. Но в целом - это позволяет не забыть проверку при получении ресурса. Вон в крестах под такой случай недавно разрешили даже декларации (!) в if, чтобы можно было делать if (FILE ∗fp; fp = fopen(...)) { handle fp here; }.

> Так этот пример и не показывает случай с unused param у тебя там аргументом то и нету в функции.
Ну так тот факт, что я не забыл о параметре, не избавляет меня от необходимости вдумчиво следовать описанному в документации контракту (инициализировать все поля структуры, а не одно).

> Никогда ошибок и ворнингов с этим не возникало.
Ну а у меня возникало. Однажды даже с виртуалбоксовым модулем, который очень широко используется.

> Ты же понимаешь, что стандартных средств языка С недостаточно для написания полноценной, портабельной ОС, для всех архитектур
Не понимаю. Для создания полноценной ОС нужен стандартный Си и пара ассемблерных файликов для нужной архитектуры. Расширения нинужны. Единственное, что мешает, убивая язык - это все тот же strict aliasing в текущем виде. Было бы оно opt-in или хотя бы opt-out - цены бы ему не было.

> почему это не может считаться стандартом в неком роде
Потому что вынуждает разработчиков других компиляторов смотреть на какой-то там другой компилятор, а не на стандарт. А смотреть на него сложно, он жирный. И это очень плохой подход, подобный тому, что было в вебе с Internet Explorer (раньше) или Webkit/Blink (сейчас).

> их говнокомпилятор даже С99 не поддерживает
Да вы заебали. Пруф неподдерживаемой возможности C99?

Ответы79096

21 окт, 00:30 #131 #1079096

>>1079070
> в крестах под такой случай недавно разрешили даже декларации (!) в if
Ну еще не хватало разрешить декларации в if и заодно лямбды зауячить в С, ну а там и шаблоны можно хуле. Мало того, что они разрешили декларации посреди кода?
Кресты-то понятно, это Java #2, я уже давно крест на них поставил. Но в крестах такая конструкция выглядет более логичной, чем в С, ибо в крестах деклараии изначально разрешены где угодно и отличить сравнение в ифе от присвоения с такой конструкции наоборот легче. Но проблема в том, что такая конструкция не приемлема к С, я как и многие другие, считаю mixed-declarations самой ебанутой хуйней которую можно было ввести в стандарт, ибо это рушит просто весь подход к формированию программм на С.

>Не понимаю. Для создания полноценной ОС нужен стандартный Си и пара ассемблерных файликов для нужной архитектуры
Для создания, чего-то типа minix может и достаточно, а вот высокопроизводительную систему для серверов и чего угодно другово - нет. Ибо, код ядра состоит из огромного числа оптимизаций и подсказок компилятору как нужно генирировать код, чего нету в стандарте. Даже тот же __builtin_expect который используется в ядре чуть ли не в каждой функции в виде макросов likely/unlikely. А выравнивание памяти? Инлайн ассемблер? Тот же inline которого до С99 небыло в стандарте. Всякие трюки с кешем типа __builtin_prefetch? Тот же may_alias? Да еще сотня различных аттрибутов и билтинов, которые нужны в реальной разработке, но которых нету в стандарте и опять же которые со временем появляются в нем как раз из этих расширений.

>>1079070
>смотреть на какой-то там другой компилятор, а не на стандарт
А как ты представляешь себе формирование стандарта? Ты думаешь собираются такие люди, которые никак ни с кем не связанны, с разработкой тоже и их работа заключается только в формировании стандарта. Значит собираются они за круглым столом и начинают типа "А давайте добавим Х в язык?" и все начинают галдеть типа "Нет, это не нужно давайте лучше Y добавим!!1"?
Тут как в рыночной экономике - спрос рождает предложение, спрос формируют разработчики ядра и других систем, но т.к изменить стандарт и что-то туда добавить это очень очень сложный и геморный процесс, тут много чего от кого-то и чего-то зависит, поэтому разработчики сами договариваются о каких-то новых вещах и реализуют их в виде расширений, а потом уже это доходит спустя лет 20 до стандарта и то частично. Не могут же разработчики 20 лет ждать пока им там в стандарте дяди одобрят нужный функционал и потом только это разработчики компиляторов реализуют и потом только это дойдет до них. Так всегда все устроено в этом мире, кто у руля тот и диктует правила и остальные только вынуждены с этим соглашаться, чтоб не остаться у обочины прогресса.
Конечно такой подход не идеален и может вносить хаос и идиотию, как например с ситуацией в вебе, где теперь чуть ли не каждый день появляется новый модный фрейворк от фейсбука или кого-то подобного и все начинают это бездумно использовать, ибо у обычных резрабов выхода нету либо учить новое говно, либо сидеть голодным без работы.
Но к счатью, в сообществе разрабочиков ОС и компиляторов языка С, ситуация намного лучше и более менее стабильна, т.к. тут никто не гонится за модными технологиями и прочему позерству, тут людям нужена надежность и стабильность, поэтому новые изменения более менее органично вписываются и принимаются в сообществе. Да и предметная область куда более серьезная и зачастую связанна с производителями железа.

В общем, хочу сказать, что не стоит возводить то что написанно в стандарте ISO за святую и единственно возможную истину. Я вполне считаю GNU C, таким же стандартом как и ISO C с разницей лишь в том, что GNU мне может предложить куда больше возможностей чем ISO.

21 окт, 00:30 #131 #1079096

>>1079070
> в крестах под такой случай недавно разрешили даже декларации (!) в if
Ну еще не хватало разрешить декларации в if и заодно лямбды зауячить в С, ну а там и шаблоны можно хуле. Мало того, что они разрешили декларации посреди кода?
Кресты-то понятно, это Java #2, я уже давно крест на них поставил. Но в крестах такая конструкция выглядет более логичной, чем в С, ибо в крестах деклараии изначально разрешены где угодно и отличить сравнение в ифе от присвоения с такой конструкции наоборот легче. Но проблема в том, что такая конструкция не приемлема к С, я как и многие другие, считаю mixed-declarations самой ебанутой хуйней которую можно было ввести в стандарт, ибо это рушит просто весь подход к формированию программм на С.

>Не понимаю. Для создания полноценной ОС нужен стандартный Си и пара ассемблерных файликов для нужной архитектуры
Для создания, чего-то типа minix может и достаточно, а вот высокопроизводительную систему для серверов и чего угодно другово - нет. Ибо, код ядра состоит из огромного числа оптимизаций и подсказок компилятору как нужно генирировать код, чего нету в стандарте. Даже тот же __builtin_expect который используется в ядре чуть ли не в каждой функции в виде макросов likely/unlikely. А выравнивание памяти? Инлайн ассемблер? Тот же inline которого до С99 небыло в стандарте. Всякие трюки с кешем типа __builtin_prefetch? Тот же may_alias? Да еще сотня различных аттрибутов и билтинов, которые нужны в реальной разработке, но которых нету в стандарте и опять же которые со временем появляются в нем как раз из этих расширений.

>>1079070
>смотреть на какой-то там другой компилятор, а не на стандарт
А как ты представляешь себе формирование стандарта? Ты думаешь собираются такие люди, которые никак ни с кем не связанны, с разработкой тоже и их работа заключается только в формировании стандарта. Значит собираются они за круглым столом и начинают типа "А давайте добавим Х в язык?" и все начинают галдеть типа "Нет, это не нужно давайте лучше Y добавим!!1"?
Тут как в рыночной экономике - спрос рождает предложение, спрос формируют разработчики ядра и других систем, но т.к изменить стандарт и что-то туда добавить это очень очень сложный и геморный процесс, тут много чего от кого-то и чего-то зависит, поэтому разработчики сами договариваются о каких-то новых вещах и реализуют их в виде расширений, а потом уже это доходит спустя лет 20 до стандарта и то частично. Не могут же разработчики 20 лет ждать пока им там в стандарте дяди одобрят нужный функционал и потом только это разработчики компиляторов реализуют и потом только это дойдет до них. Так всегда все устроено в этом мире, кто у руля тот и диктует правила и остальные только вынуждены с этим соглашаться, чтоб не остаться у обочины прогресса.
Конечно такой подход не идеален и может вносить хаос и идиотию, как например с ситуацией в вебе, где теперь чуть ли не каждый день появляется новый модный фрейворк от фейсбука или кого-то подобного и все начинают это бездумно использовать, ибо у обычных резрабов выхода нету либо учить новое говно, либо сидеть голодным без работы.
Но к счатью, в сообществе разрабочиков ОС и компиляторов языка С, ситуация намного лучше и более менее стабильна, т.к. тут никто не гонится за модными технологиями и прочему позерству, тут людям нужена надежность и стабильность, поэтому новые изменения более менее органично вписываются и принимаются в сообществе. Да и предметная область куда более серьезная и зачастую связанна с производителями железа.

В общем, хочу сказать, что не стоит возводить то что написанно в стандарте ISO за святую и единственно возможную истину. Я вполне считаю GNU C, таким же стандартом как и ISO C с разницей лишь в том, что GNU мне может предложить куда больше возможностей чем ISO.

Показать весь текст
Ответы790987910079106

21 окт, 00:39 #132 #1079098

>>1079096
>Значит собираются они за круглым столом и начинают типа "А давайте добавим Х в язык?" и все начинают галдеть типа "Нет, это не нужно давайте лучше Y добавим!!1"?
вроде так в с++ делают - там целый комитет, собирают мнения по всему миру, потом добавляют - это у них на потоке. в с видимо тоже так будет.

21 окт, 00:41 #133 #1079100

>>1079096
>куда больше возможностей
прибить себя гвоздями к полу.

21 окт, 01:19 #134 #1079103

Давайте честно. Стоит ли в 2017 году вкатываться в С?

Ответы79233

21 окт, 01:30 #135 #1079106

>>1079096
> лямбды зауячить в С
Осталось каких-то два-три года. Ну, если примут, конечно.

> декларации посреди кода
Ничего, рано или поздно, но ты поймешь, насколько это удобно, когда при удалении куска кода не нужно компилировать, читать про неиспользуемые переменные, править и снова компилировать. Это нормально в каком-нибудь паскале, который создан, чтобы держать детей в строгости. Но Си - это язык для написания программ, а не для садомазохизма.

> __builtin_expect
Очень хорошо. Так же как in и out, которые очень любит Microsoft. Все это будет в виде атрибутов в следующих стандартах. И, к счастью, все это абсолютно не должно ломать код, потому что можно будет сделать:
#if __STDC_VERSION__ >= 202113L
#define likely [[likely]]
#else
#define likely
#endif

> сотня различных аттрибутов и билтинов
Атрибуты должны быть заифдефанными кейфордами, интринсики - штука очень полезная, но опасная, ибо не все и не везде есть.

> Тот же inline которого до С99 небыло в стандарте
Теперь он есть, а на него по-прежнему всем насрать. И под всеми я имею в виду в первую очередь компиляторы.

> Значит собираются они за круглым столом и начинают типа "А давайте добавим Х в язык?"
Примерно так все и происходит. Вот Microsoft громче всех галдела, и нам дали сраный memset_s с прочей честной компанией, а теперь их почти нет, и, надеюсь, их добьют в C2x. Алсо, можешь тоже предложить что-нибудь этакое (правда, уже слегка поздновато), чтобы все охуели, как ты можешь http://www.open-std.org/jtc1/sc22/wg14/

Ответы791127917679239

21 окт, 02:16 #136 #1079112

>>1079106
>Теперь он есть, а на него по-прежнему всем насрать. И под всеми я имею в виду в первую очередь компиляторы
так незачем, если есть static. да даже без него - компилятор может продублировать тело.

весь дрочь же только за системы где считают байты - там, наверно, компилятору не пофиг.

21 окт, 11:34 #137 #1079176

>>1079106
>лямбды зауячить в С
Никогда не понимал, зачем нужны лямбды если есть указатели на функциюделегаты

Ответы79183

21 окт, 11:55 #138 #1079183

>>1079176
че такое эти их лямблы на примери си?
мимокекер

Ответы79186

21 окт, 12:03 #139 #1079186

>>1079183
Как я понимаю они в основ нужны для того, чтобы создавать функциональные объекты по случаю. Ну то есть не определять к примеру функцию, которая будет у тебя вечно в памяти. А определить эту лямбду, которая очистится из памяти после её выполнения.
Но. Мне не нравится просто ебанутейший вырвиглазный синтаксис этих выражений.
ИМХО более читаемо будет определение функции, а потом, если нужно эту функцию куда передать, например как компоратор при сортировки, то просто передать указатель на эту функцию. А не городить в этой скобочки ещё миллионы скобочек, превращая вызов функции в что-то похожее на размазанное гавно в ASCII графике по твоему монитору.

Ответы79201

21 окт, 12:36 #140 #1079201

>>1079186
>которая очистится из памяти после её выполнения
охуеть, этож пиздос как ресурсоемко.

21 окт, 12:41 #141 #1079203

>>1075005
ПИТОН ЭТО СИ С САХАРОМ

21 окт, 13:42 #142 #1079233

>>1079103
Меня больше интересует, можно ли писать за деньги на C не для эмбедеда.

Ответы7924079245

21 окт, 13:51 #143 #1079239

>>1079106
>и нам дали сраный memset_s с прочей честной компанией, а теперь их почти нет, и, надеюсь, их добьют в C2x
вот это не понял, что честной компанией?

Ответы79275

21 окт, 13:54 #144 #1079240

>>1079233
На счёт не для эмбедеда не знаю. Но устроится всяким пругрумистом stm и вообще омк достаточно легко. У нас в Ростове к примеру точно легко.

Ответы7926786728

21 окт, 14:10 #145 #1079245

>>1079233
Я в обороночку вкатился. Моделирую всякое говно на сях + мкл.
Правда, основой все-таки является мкл. Си можно не знать и заменить его, например, фортраном или плюсами.

Ответы7925079258

21 окт, 14:27 #146 #1079250

>>1079245
>всякое говно на сях
а нахуй си, на скриптопараше же удобней?

Ответы7925379270

21 окт, 14:34 #147 #1079253

>>1079250
Для си/фортрана написаны тонны мат. либ. вылизанных до байтика.
Не знаю что он там моделирует, но я сталкивался с моделированием динамических системосцилляторов если быть точнее в реальном времени. Код был чуть больше чем полностью на С. В коде было fft и решение ОДУ достаточно большой жесткости. Про скриптопарашу ты это про пайтон?

Ответы79255

21 окт, 14:37 #148 #1079255

>>1079253
>про пайтон
ну или перл. любую си либу можно подключить да и пердолинга с конпеляцией нет. я вот перл всегда для прототипирования пользую.

21 окт, 14:47 #149 #1079258

>>1079245
сколько платят? только честно

Ответы79270

21 окт, 15:21 #150 #1079267

>>1079240
Паяльником орудовать нужно уметь?

Ответы79269

21 окт, 15:24 #151 #1079269

>>1079267
>Паяльником орудовать
в попе?

Ответы79283

21 окт, 15:25 #152 #1079270

>>1079258
На испытательном сроке 35, после 45. Дс2.

>>1079250
Полагаю, потому что сколь-нибудь относящиеся к реальному миру задачи будут решаться на петухоне пару недель. Даже со всеми математическими библиотеками этого мира.
На питоне я пишу прототипы. Более того, после первых месяцев анальных страданий я решил, что ни в коем случае нельзя прикасаться к си, покуда не готов питоновский вариант облегченной задачи потому что я криворукий даун и не способен осознать, где ошибка является следствием "неправильной" математики, а где - моего незнания языка. На питоне проблем от незнаний языка не возникает.

sage 21 окт, 15:28 #153 #1079275

>>1079239
Семейство _s функий, они же Annex K, они же TR 24731-1.

21 окт, 15:36 #154 #1079283

>>1079269
Я просто не шарю. Когда я что-то слышу про микроконтроллеры, я представляю мужика в свитере и с паяльником.

Ответы79285

21 окт, 15:38 #155 #1079285

>>1079283
Сейчас есть отладочные платы и макетки. А проектировать схему и паять ее за тебя будут другие. Твое дело говнокод писать.

21 окт, 21:17 #156 #1079523

Я с теоритическим, скорее, вопросом. Как запилить многопоточность на манер того же Go? Встречалась реализация на longjump-ах в которой один дьявол используется только единственный поток ОС, иначе стек превратился бы в решето. Ещё встерчалось более-менее платформонезависимое многопоточное решение, но там под стек выделялся конечный объём памяти, что для процедуры произвольной вложенности в лучшем случае окончится падением. Чем может быть чревато решение выделить при переключении контекста ломоть памяти, куда и сохранить целиком содержимое стека и регистры (увы, вряд ли это можно реализовать аппаратнонезависимо), и загрузить такой же, предварительно выделенный, и восстановив регистры передать управление? На мой взгляд кроме очевидной неторопливости особых проблем быть не должно, или я что-то упускаю?
Предвосхищая очевидное предложение: с исходниками Го я пытался ознакомится, но моих способностей не хватило.

Ответы79529

21 окт, 21:31 #157 #1079529

>>1079523
>Как запилить многопоточность на манер того же Go?
нахуя? юзай потоки, процессы и poll и select

Ответы7954679753

21 окт, 21:42 #158 #1079546

>>1079529
Я для себя интересуюсь, c целью повышения компьютерной грамотности. Ну и вдруг кому-то попиздеть захочется за разные аспекты, а я полсушаю.

Ответы79555

21 окт, 21:48 #159 #1079555

>>1079546
>c целью повышения компьютерной грамотности
а читать книги про многопоточное программирование тебе типа в западло?

Ответы79575

21 окт, 22:04 #160 #1079575

>>1079555
Ну нахуй ты начинаешь? Заняться нечем - починил бы шифты на клаве. А знаешь литературу, порекомендовал бы. Я, впрочем, уточню: меня не в принципе многопоточность интересует, а конкретно реализация пользовательских потоков, т.е. без совсем низкоуровневых возможностей, например, переназначить адрес странице.

Ответы795827959679618

21 окт, 22:09 #161 #1079582

>>1079575
А ты хули борзый такой? Тебе че-тут все должны по твоему хотению сразу броситься и начать разжовывать и в ротик класть? Пиздуй в свой пидорский go тред и выебовайся там. Совсем охуели.

мимо другой анон

Ответы79591

21 окт, 22:13 #162 #1079591

>>1079582
> Пиздуй в свой пидорский go тред
Ну и причем тут го тред?

>мимо другой анон
Лучше бы дальше бочку молча делал.

Ответы79883

21 окт, 22:16 #163 #1079596

>>1079575
Любая книга по основам ОС и вообще по ОС тебе даст понимание того, как работают процессы и потоки.
К примеру
Таненбаум Э., Бос Х. Т18 Современные операционные системы. 4-е изд.
Рихтер Дж., Назар К. - Windows via C C++

Ответы79630

21 окт, 22:23 #164 #1079618

>>1079575
> А знаешь литературу, порекомендовал бы
UNIX. Профессиональное программирование

рикамендую

Ответы79630

21 окт, 22:30 #165 #1079630

>>1079596
>>1079618
Благодарю.

21 окт, 22:39 #166 #1079644

>>1077645
Это ты спрашивал про распаковку игровых ресурсов? Ты распаковал свой файл?

Ответы79657

21 окт, 22:55 #167 #1079657

>>1079644
>Ты распаковал свой файл?
Да, но толку 0, т.к. когда перепаковываю ресурсы обратно игра вообще не запускается.

Ответы7966279663

21 окт, 22:57 #168 #1079662

>>1079657
Это ты в прикрепленном файлы батником перепаковываешь?

Ответы7968780091

21 окт, 22:58 #169 #1079663

>>1079657
Там кроме оффсетов и длин в каталоге ресурсов в начале файла еще длины распакованных данных и чексуммы.

Ответы79687

21 окт, 23:26 #170 #1079687

>>1079662
Прога offzip. Так-то всё распаковало, я данные которые мне надо изменил, но когда запаковал обратно игра не запускается. Попробовал не изменять ничего т.е. тупо распаковать и запаковать, тоже не запускается.
>>1079663
>Там кроме оффсетов и длин в каталоге ресурсов в начале файла еще длины распакованных данных и чексуммы.
Вот я и не пойму, их получается распаковывать не надо?

Ответы7969880089

21 окт, 23:47 #171 #1079698

>>1079687
Ты дебил? У тебя ресурсный файл с нестандартным форматом. Либо ты пишешь свой распаковщик/упаковщик, либо ты идешь нахуй. Никакие проги тебе не помогут (кроме сделанных под эту конкретную игру). Прога, скорее всего, просто тупо натравливает zlib на все офсеты в файле, и если что-то распакуется, сохраняет. Т.е., это подходит, чтобы посмотреть, что там внутри, но не подходит для моддинга никаким местом.

22 окт, 03:25 #172 #1079753

>>1079529
в го они такие. или , в смысле, почему не pthread?

22 окт, 12:43 #173 #1079883

>>1079591
Кури вот эту библиотеку, это точная копия Golang потоков

http://libmill.org/

22 окт, 18:09 #174 #1080089

>>1079687
Тебе не надо ничего запаковывать. Тебе надо подставить другие данные. Хули ты такой простой, ага распаковал/запаковал, и всё пиздец, должно заработать. Разрабы ну, специально игру делали чтобы ты смог распокавать, запаковать. Не будь наивным.

Ответы80582

22 окт, 18:13 #175 #1080091

>>1077645
Пиши на нормальном чел. языке что нужно, я тебе прогу сделаю.
>>1079662
Нет. Мой последователь, чему я рад.
Пилите ромхак-тред.

Ответы80583

22 окт, 22:15 #176 #1080226

Итак щеглы, у вас есть всего одна попытка пояснить, чем ваши pthreads лучше csp golang потоков?

Ответы80230

22 окт, 22:19 #177 #1080229

Проясните один момент, пожалуйста. Вот допустим я включаю в свой код #define <string.h>, откуда gcc знает, где лежат имплементации тех функций, которые определены в этом заголовочном файле? Или ему они не нужны, он просто видит, что такая функция есть в этом .h файле, и перекладывает заботу об их имплементации на клиента, которые клиент подтянет перед запуском? Если да, то откуда он знает, что в этом .h файле присутствует эта функция? Если говорить о стандартной библиотеке, то ладно, эти функции и так известны. Но а если это просто чужая либка? Ему надо будет указывать путь то .h файлов этой либки или как?
K&R читаю, пока на 50 странице, но уж очень этот вопрос мучает.

Ответы8023180233

22 окт, 22:21 #178 #1080230

>>1080226
А кто тут знает golang?
Вообще, у тебя здесь ни одной попытки пояснить, зачем нужен go.

22 окт, 22:26 #179 #1080231

>>1080229
> откуда gcc знает, где лежат имплементации тех функций
Во-первых, когда ты делаешь #include, ты не включаешь реализации, а только объявляешь, что есть такие функции. Реализации добавляет линкер из либ или объектных файлов уже сразу в бинарник. Во-вторых, как компилятор узнает пути до стандартных инклудов или либ, зависит от компилятора. Где-то жестко прошиты, где-то в переменных окружения лежат. В gcc нестандартные пути для поиска инклудов ты можешь указать с помощью -Idirectory_name, а для либ -Ldirectory_name.

Ответы80237

22 окт, 22:28 #180 #1080233

>>1080229
Подключаемые хедеры просто вставляются перед кодом программы уже при препроцессировании.
Ты ещё спроси, откуда он знает, что ты функции ему объявляешь.
Если <...>, то файл ищется по дефолтным путям компилятора, их может быть несколько, сначала одни проверяются, потом другие, если нет в первых.
Если "...", то по относительному пути "..."
gcc -E -W -v -

Ответы80237

22 окт, 22:43 #181 #1080237

>>1080231
>>1080233
Спасибо! Вроде более-менее понятно
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/7/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
буду читать про про линкер и препроцессор

23 окт, 16:50 #182 #1080582

>>1080089
Вот, нужно анпакер написать для файла (ссылка на файл: http://rgho.st/6mdpkV8YV ) со следующими данными: "Количество ресурсов в файле (0x47==71) лежит по смещению 8. Список описаний ресурсов начинается со смещения 0x0C. Описание каждого ресурса размером 0x34 байта, для приведения в читаемый вид надо 4-хбайтовые фрагменты поксорить на 0x25 0x24 0x74 0x05. После ксора будут видны имена ресурсов, смещения в файле, упакованный и оригинальный размер. Сами ресурсы упакованы zlib."
Буду очень благодарен.

Ответы805838076381062

23 окт, 16:51 #183 #1080583

>>1080091
>>1080582

23 окт, 18:21 #184 #1080662

Анон, какие были операторы из 3х символов? Они еще заменяли # в include вроде

Ответы80754

23 окт, 20:41 #185 #1080754

>>1080662
Гугли триграфы (trigraphs).

Ответы81120

23 окт, 20:52 #186 #1080763

>>1080582
>надо 4-хбайтовые фрагменты поксорить на 0x25 0x24 0x74 0x05
А ты пробовал ксорить hex-редактором?

Ответы80773

23 окт, 21:01 #187 #1080773

>>1080763
Я сам не пробовал, просто знаю что там есть что-то вроде обработать файл xor, да и операция простая же.

Ответы80775

sage 23 окт, 21:03 #188 #1080775

>>1080773
$99, и пакер твой. Заебал уже по всей доске срать.

Ответы80778

23 окт, 21:07 #189 #1080778

>>1080775
> 99$
Лучше сдохну, но сам сделаю

Ответы8078080781

sage 23 окт, 21:09 #190 #1080780

>>1080778
Так сделай, блять, там задача на 15 минут. Ты не написал ни строчки кода за несколько дней, только ходишь и клянчишь. Даже неполное описание формата, которое ты выше постишь, ты и то у кого-то выпросил.

23 окт, 21:10 #191 #1080781

>>1080778
В чём затык то у тебя? Что не получается поксорить?

23 окт, 22:37 #192 #1080856

Анончики, помогите ньюфагу.
Есть 2 массива s[num] и t[num]. Нужно скопировать содержимое первого во второй. Почему нужно инкрементировать счётчик именно в массиве s а не tt[i++] = s;:

while (i<num)
t = s[i++];

Ответы80860

23 окт, 22:41 #193 #1080860

>>1080856
> while (i<num)
> t[​i​] = s[i++];
Вот это будет работать неправильно. Прочитает значение по s[​i​], инкрементирует i, и потом уже запишем по t[​i​]. А вот:
> while (i<num)
> t[i++] = s[​i​];
Как раз прочитает, запишет, и потом уже инкрементирует.

Ответы8091980934

24 окт, 00:27 #194 #1080919

>>1080860
>Как раз прочитает, запишет, и потом уже инкрементирует.
Давно такое поведение гарантировано, лалка?

Ответы80939

24 окт, 01:01 #195 #1080934

>>1080860
Ты че ебанутый? Ты в курсе вообще как постинкремент работает? Он возвращает копию (в теории на самом деле давно уже копии не возвращаются ) текущего значения а потом инкрементирует. Так что выражение:
t[​i​] = s[i++];
равнозначно выражению
t = s; i = i + 1;

Ответы809368093780982

24 окт, 01:02 #196 #1080936

>>1080934
сука как меня заебала эта разметка ебаная.
t[ i ] = s[ i ]; i = i + 1;

24 окт, 01:03 #197 #1080937

>>1080934
>выражение:
>t[​i​] = s[i++];
>равнозначно выражению
>t = s; i = i + 1;
Не равнозначно.

Ответы80944

24 окт, 01:09 #198 #1080939

>>1080919
Да, ты прав, = не создает sequence point, и поэтому оба варианта неправильные.

Ответы80954

24 окт, 01:24 #199 #1080944

>>1080937
В общем, да ты прав.

Ответы80954

24 окт, 02:14 #200 #1080954

>>1080939
>>1080944
Спс.

24 окт, 06:47 #201 #1080982

>>1080934
i++ сначала эвалюэйтит выражение, а потом добавляет единицу
t[​i​] = s[i++]; равнозначно
n = i;
i = i + 1;
t = s[n];

Ответы81115

24 окт, 11:26 #202 #1081062

>>1080582
http://rgho.st/6GDN4cjcZ
1 читает байт
2 xor 0x25
3 читает следующий байт
4 xor 0x24
5 читает следующий байт
6 xor 0x74
7 читает следующий байт
8 xor 0x05
9 записывает в новый файл
10 -> 1
Это нужно?

Ответы8111681316

24 окт, 13:37 #203 #1081115

>>1080982
тебе же уже сказали что нет - неопределённое поведение.

24 окт, 13:38 #204 #1081116

>>1081062
на пист бин залей, впадлу качать.

Ответы8112381316

24 окт, 13:44 #205 #1081120

>>1080754
Пасиба, оно

24 окт, 13:54 #206 #1081123

>>1081116
Качай не ссы

24 окт, 14:33 #207 #1081133

>>1074988 (OP)
В треде есть аноны, способные переписать код с питона на Си с небольшими изменениями? (там парсер веб страницы, плюс консольная запускался бинарников в зависимости от результатов. Под никсы на ncurses.)

С чем придется возиться, смотреть тут.
https://gitlab.com/salfter/mph_switch

Оплата в криптовалюте, обращаться на почту foor@rfakeANUSy}fLandexPUNCTUMrNwlu

Ответы81184

24 окт, 15:59 #208 #1081184

>>1081133
>Оплата в криптовалюте
нахуй иди, в рублях на карту сбера.

Ответы81197

24 окт, 16:12 #209 #1081197

>>1081184
В рублях-то не проблема заплатить. Это было написано для тех, ебанашка, кто, возможно, не желает светить своими доходами перед сбером.

Ответы81201

24 окт, 16:20 #210 #1081201

>>1081197
смотри почту

24 окт, 19:21 #211 #1081316

>>1081062
Спасибо большое. Но уже свою прогу написал.
>>1081116
Что тебя так порвало, что ты от моего лицо пишешь?

24 окт, 19:57 #212 #1081349

Анон, нужно написать программу которая будет читать текст, помещять слова или фразы в красно-черное или зеленое древо а потом отображать древо и количество повторяющихся фраз. Программа состоит из 3 файлов, собственно bst.c, gt.c и rbt.c

(gt = green tree, rbt = red black tree).

.h файлы у меня есть, так что нужно написать только .с

Цена впроса = 3к рублей. Сроки = 10 дней, но лучше поскорее. Если можешь помочь и немного заработать - отпиши фейкомыльце

Ответы81368

24 окт, 20:22 #213 #1081368

>>1081349
А что такое зеленое дерево? Первый раз о таком слышу.

Ответы81376

24 окт, 20:32 #214 #1081376

>>1081368
Это обычное двоичное древо которое может хранить одинаковые значения

Ответы8137881383

24 окт, 20:36 #215 #1081378

>>1081376
А как это реализованно, есть ссылки на вайтпейперы или статьи? Гугл тоже ничего об этом не знает.

24 окт, 20:40 #216 #1081383

>>1081376
>может хранить одинаковые значения
а разница какая? это же вопрос использования - хочу записываю одинаковые, хочу нет.

Ответы8139081412

24 окт, 20:41 #217 #1081384

в смысле, ты же про ключи?

24 окт, 20:43 #218 #1081385

хотя, можно написать хреново, тогда с одинаковыми ключами работать не будут. наверно.

24 окт, 20:47 #219 #1081390

>>1081383
Ну в общем-то да, но чтоб это называли зеленым деревом ниразу не слышал. К тому же чтоб хранить одинаковые ключи в бинарном дереве тебе нужно хранить ноды в виде списка, а это уже практически не бинарное дерево а B tree.

Ответы8139282163

24 окт, 20:54 #220 #1081392

>>1081390
> К тому же чтоб хранить одинаковые
да ничего тебе не нужно, просто определяешь для себя в какую сторону класть одинаковые и всё.

Ответы81399

24 окт, 21:09 #221 #1081399

>>1081392
Так это уже черт чего, а не бинарное дерево. Тем более без балансировки это может превратиться в обычный лист со временем лукапа O( n ).

Ответы81401

24 окт, 21:11 #222 #1081401

>>1081399
> Так это уже черт чего, а не бинарное дерево
Вполне бинарное дерево, балансировку тебе никто не мешает делать, если тебе похуй на позицию элементов с одинаковым ключом.

Ответы81411

24 окт, 21:29 #223 #1081411

>>1081401
Проще тогда хеш таблицу сделать один хуй профит от использования в таких случаях деревьев абсолютно нулевой.

Ответы8141481415

24 окт, 21:30 #224 #1081412

>>1081383
Я тут перечитал еще раз задание, и мне кажется что нужно просто считать количество дубликатов, а не записывать их в древо. Тоесть создаем древо и записывает туда значения, как обычно, а при отображании пишем, что этих элементов двое

24 окт, 21:30 #225 #1081414

>>1081411
Ну если говорить о задаче, то там повторяющиеся ключи нахуй не вперлись, если можно просто увеличивать счетчик повторов в ноде.

24 окт, 21:31 #226 #1081415

>>1081411
чё ты хуйню какую-то несёшь. если в обычное дерево последовательно передавать ключи, то оно будет таким же списком. это уже вопрос вероятности или типа того.

Ответы81421

24 окт, 21:40 #227 #1081421

>>1081415
Помоему это ты хуйню несешь. Что ты подразумеваешь под "обычным деревом"? Бинарное? Без балансировки? Если ты передашь в такое дерево ключи в виде последовательно возрастающего/убывающего списка, то это не вопрос вероятности, это блять 100% лист. Т.к. без балансировки все ноды будут вставляться либо в лево либо вправо. Типа того у него пиздец.

Ответы81433

24 окт, 21:56 #228 #1081433

>>1081421
вопрос вероятности это его использование, дунич. решил он тут
> Проще тогда хеш таблицу сделать один хуй профит от использования в таких случаях деревьев абсолютно нулевой

Ответы81452

24 окт, 22:39 #229 #1081452

>>1081433
Нихуя не понял о чем ты, но соглашусь, похуй, делай как знаешь.

Ответы81500

25 окт, 00:10 #230 #1081500

>>1081452
да я сам не знаю о чём мы тут все.

26 окт, 00:00 #231 #1082094

Аноны, помогите дауну найти оишбку. Задание: написать функцию, которая возвращает наибольшее значение массива. Есть вот такой код, он по непонятным мне причинам не хочет работать с отрицательными числами.

#include <stdio.h>
#define NUM 10

int bigofarray ( int mas[], int i);

int main (void)
{
signed int ar[NUM] = {-123,-221,-3,-4124,-123,-312};

printf ("%d\n",bigofarray(ar, NUM));
return 0;
}

int bigofarray (int mas[], int i)
{
int big,j;

for (j=0,big = mas[0]; j<i; j++)
big = (big < mas[j])? mas[j]: big;
return big;
}

Результат выполнения: 0
На всякий случай https://pastebin.com/raw/9ADash3e

26 окт, 00:00 #231 #1082094

Аноны, помогите дауну найти оишбку. Задание: написать функцию, которая возвращает наибольшее значение массива. Есть вот такой код, он по непонятным мне причинам не хочет работать с отрицательными числами.

#include <stdio.h>
#define NUM 10

int bigofarray ( int mas[], int i);

int main (void)
{
signed int ar[NUM] = {-123,-221,-3,-4124,-123,-312};

printf ("%d\n",bigofarray(ar, NUM));
return 0;
}

int bigofarray (int mas[], int i)
{
int big,j;

for (j=0,big = mas[0]; j<i; j++)
big = (big < mas[j])? mas[j]: big;
return big;
}

Результат выполнения: 0
На всякий случай https://pastebin.com/raw/9ADash3e

Показать весь текст
Ответы8209682097

26 окт, 00:08 #232 #1082096

>>1082094
>Результат выполнения: 0
А должно быть?

26 окт, 00:08 #233 #1082097

>>1082094
Размер массива у тебя десять, а числов всего шесть. Недостающие элементы забиваются нулями. Ноль больше всех твоих чисел. Запили себе countof: #define countof(array) (sizeof(array) / sizeof((array)[0])) Выпили NUM (int ar[] = { ... }), а вместо NUM в вызове bigofarray используй countof(ar).

Ответы82328

26 окт, 03:38 #234 #1082163

>>1081390
> К тому же чтоб хранить одинаковые ключи в бинарном дереве тебе нужно хранить ноды в виде списка
Вовсе не обязательно. Можно выделить массив структур и написать функции left, right, parent, а новые данные записывать в пустую ячейку с наименьшим индексом. Так гораздо быстрее будет.

26 окт, 15:36 #235 #1082328

>>1082097
Спасибо, анон.

Ответы8312483125

28 окт, 09:15 #236 #1083124

>>1082328
Сигфолтит. При вызове "abort();" в начале main'а всё равно сигфолтит, abort не отрабатывает. GDB говорит "Program received signal SIGSEGV, Segmentation fault." "0x0000000000403495 in main ()" и всё.

Как это дебажить?

Ответы83127

28 окт, 09:15 #237 #1083125

>>1082328
Не тебе верхний пост, не тебе.

28 окт, 09:29 #238 #1083127

>>1083124
Хотя нет, если убрать abort(), то в gdb подробный лог появляется. Дальше сам справлюсь.
Но почему вместо "Aborted", или вообще любой информации(принты по началу ставил), в сонсольку выводится только сигфолт? При аборте он не должен и выполняться, т.к. явно находится дальше него в коде. При принте этот самый принт в любом случае должен выводиться раньше оповещения о сигфолте. Но я получаю только сраный сигфолт.

Ответы83128

28 окт, 09:33 #239 #1083128

>>1083127
Понятно. Сигфолт происходит на первом любом вызове. Будь то abort, printf, вообще что угодно. Снова прощу помощи, почему так может происходить?

Ответы83141

28 окт, 10:49 #240 #1083141

>>1083128
Проблема найдена. Это происходит при попытке создать слишком большой массив. Но почему gcc не говорит мне об этом?

Ответы83593

sage 29 окт, 06:32 #241 #1083593

>>1083141
прост)

29 окт, 18:55 #242 #1083865

Ребята, помогите, как построить треугольник Максвелла, нигде не могу найти алгоритм. Спасибо.

Ответы83877

29 окт, 19:07 #243 #1083877

>>1083865
помог, смотри в личку

Ответы83878

29 окт, 19:09 #244 #1083878

>>1083877
Спасибо!

30 окт, 15:58 #245 #1084302

Пацаны, перешел в другой проект связанный тесно с embedded, там короче есть свои asic, dsp и arm cores. Есть у кого годнота по DSP C?

30 окт, 20:14 #246 #1084491

Вопрос к опытным сишникам: стандарты С99 и С11 принесли благо или зло?
И, если не затруднит, объясните, почему так считаете.

Ответы84635

30 окт, 22:47 #247 #1084635

>>1084491
С99 принес некоторые хорошие фитчи некоторые плохие типа как mixed declarations.
С11 Вроде бы ничего так, но я им особо не пользуюсь, половина компиляторов его не поддерживают а в другой половине половины нету. Но кроспатформенные треды, выглядят ничего для простеньких приложух, ну еще атомимики наконец-то завезли.

31 окт, 12:54 #248 #1084891

C - язык богов, ничего лучше него нет и не будет. Единственный способ языку стать живым, это быть дополнением к C как Lua.

Ответы84909

31 окт, 13:21 #249 #1084909

>>1084891
>C - язык богов
if(c == god_programming_language) then {all_mistakes_of_god(made_with_it)}

31 окт, 15:24 #250 #1084974

Пацаны, дайте плиз список тулзов для qa и тестов
Юниттесты : Cmocka?
Static code analysis : есть что-то вроде lint или чего другого?
Code coverage : Cobertura?
Mem leaks : Есть по типу valgrind?
Что еще в помощь используете в проектах?

Ответы85017

31 окт, 16:35 #251 #1085017

>>1084974
quickcheck

31 окт, 21:41 #252 #1085171

на какой ОС лучше будет начать изучать Си?

Ответы851748517785222

31 окт, 21:48 #253 #1085174

>>1085171
Install Gentoo

31 окт, 21:59 #254 #1085177

>>1085171
Любой линукс. Для начинающих обычно советуют минт или убунту, еще опенсуся хороша.

31 окт, 22:53 #255 #1085222

>>1085171
Традиционно отвечаю итт, что похуй и на ос, и на компилятор, и на IDE/редактор. Плюсы линуксов - скорее всего, компилятор и все необходимое будет установлено вместе с системой. Плюсы винды - интуитивно понятные отладчики с графическим интерфейсом (при этом возможность ебли с gdb никуда не девается), и не менее понятные инструменты для мониторинга от System Internals.

31 окт, 22:54 #256 #1085223

Есть охренительно большое кол-во файлов, которое не хочет собираться.
Ошибка типа:
Нет подходящей функции, чтобы вызвать в конструкции:
if (pDialog->getChangedFontFamily(&pszFont))
Как я могу быстро найти описание структуры pDialog?

Ответы85240

31 окт, 23:12 #257 #1085240

>>1085223
> pDialog
Ну это либо локальная переменная, либо параметр функции (глобальные переменные так не именуют). Ищешь определение перменной, ищешь ее тип в хедерах grep-ом или еще как. Но так как ты ошибся тредом, то это может быть еще и член класса - смотри определение класса.

Ответы85245

31 окт, 23:29 #258 #1085245

>>1085240
> Но так как ты ошибся тредом
Как ты понял?

Ответы85250

31 окт, 23:36 #259 #1085250

>>1085245
Вызов метода же. Если бы был указатель на функцию, то ей бы скорее всего передали что-то кроме параметра, в который пишется результат.

1 ноя, 00:24 #260 #1085271

Подскажите пожалуйста книгу для совсем нулячих в Си?

Ответы8527385532

1 ноя, 00:31 #261 #1085273

>>1085271
В шапке. K&R или Prata.

1 ноя, 13:44 #262 #1085421

2ch, почему во многих других языках можно иметь переменные почти безграничного размера, а в C\C++ максимальным размером является только 8 байтовый long long. Как жить без больших переменных?

Ответы855688568185683

1 ноя, 16:59 #263 #1085532

>>1085271
Prata

1 ноя, 17:04 #264 #1085539

Аноны, почему в мейне i находится без проблем, а в функции нет? Вот код:
#include <stdio.h>
#define CAL 4

void printm (int c, int target[][c]);

int main (void){
int i;
int array[][CAL] = {1,2,3,4,5,6,7,8,9,10,11,12};

i = sizeof array / sizeof array;
printf ("%d\n", i);
printm(CAL, array);

return 0;
}

void printm (int c, int target[][c]){
int i;

i = sizeof target / sizeof target;
printf ("%d\n", i);
}

Выводит:
3
0
Почему не 3 3 ? Заранее спасибо.
Вот на всякий:https://pastebin.com/L9Ab8STH

1 ноя, 17:04 #264 #1085539

Аноны, почему в мейне i находится без проблем, а в функции нет? Вот код:
#include <stdio.h>
#define CAL 4

void printm (int c, int target[][c]);

int main (void){
int i;
int array[][CAL] = {1,2,3,4,5,6,7,8,9,10,11,12};

i = sizeof array / sizeof array;
printf ("%d\n", i);
printm(CAL, array);

return 0;
}

void printm (int c, int target[][c]){
int i;

i = sizeof target / sizeof target;
printf ("%d\n", i);
}

Выводит:
3
0
Почему не 3 3 ? Заранее спасибо.
Вот на всякий:https://pastebin.com/L9Ab8STH

Показать весь текст
Ответы8562288225

1 ноя, 17:28 #265 #1085568

>>1085421
почитай, что такое стек и что такое куча

Ответы85590

1 ноя, 18:05 #266 #1085590

>>1085568
и ещё погугли арифметику с переполнением

1 ноя, 18:57 #267 #1085622

>>1085539
https://pastebin.com/6g3QdPqn

1 ноя, 20:19 #268 #1085681

>>1085421
А в каких языках длинная арифметика по умолчанию? Я только про питон знаю. В си так не делают, потому что потери производительности противоречат принципам языка.

Ответы85701

1 ноя, 20:22 #269 #1085683

>>1085421
переменные безграничного размера в регистр не засунешь

1 ноя, 21:12 #270 #1085701

>>1085681
В верилоге.

2 ноя, 23:34 #271 #1086518

>>1074988 (OP)
в кернигане и ричи есть про стеки, память и всю ету не понятную ебалду? вот например дано 2 массива
[5][6][3][4]
[20][0][4]
как найти чо там между ними или скока памяти занимает есть гайд? где крч инфу всю по стекам макс понятно найти можно

Ответы86527

2 ноя, 23:42 #272 #1086527

>>1086518
1) Это вопрос про ОС, а не про стек. В Си стека нет - есть автоматические переменные, и компилятор волен их хоть маллоком выделять. Все, что ты должен знать - это то, что переменная - это некий объект, у объекта есть адрес (исключение - storage class register) и размер, из объектов могут быть составлены другие объекты (массивы и структуры, например), у них тоже есть адрес и размер.
2) Для вычисления длины в байтах есть оператор sizeof. Адрес тебе выдаст printf("%p\n", &something).
3) Странная у тебя нотация массивов, никогда такой не видел.

Про стеки и память читай Петцольда, Таненбаума, Ultimate Memory Guide и документацию на ОС.

Ответы86530

2 ноя, 23:46 #273 #1086530

>>1086527
от души

3 ноя, 15:22 #274 #1086727

>>1078707
>-Werror
что это такое и куда его добовлять

Ответы86829

3 ноя, 15:24 #275 #1086728

>>1079240
О расскажи как Ростове с вакансиями на С-программиста

3 ноя, 19:51 #276 #1086829

>>1086727
Ключ для gcc или clang, превращающий все предупреждения в ошибки (пока не исправишь, программу оно тебе не соберет). Добавлять, очевидно, в командную строку, которой ты вызываешь компилятор.

Ответы86837

3 ноя, 20:06 #277 #1086837

>>1086829
спасибо

3 ноя, 23:06 #278 #1086905

Плез, поясните за числа с плавающей точкой
Читаю даблы scanf-ом, а на выводе оно их округляет, причем если последний знак числа был 2, вообще ету 2ку скипает

Ответы86906

3 ноя, 23:08 #279 #1086906

>>1086905
А число точно можно представить в формате с плавающей точкой без округления? Показывай код и числа.

Ответы86910

3 ноя, 23:16 #280 #1086910

>>1086906
кароч на вводе 3 координаты точек
я их этим сканирую
double koord ( double x1, double x2 )
{
char hran;
if(((scanf(" [ %lf , %lf %c", x1, x2, &hran_prava)) != 3) || hran != ']' )
{
printf("Invalid input.\n");
exit (0);
}
return 0;
}

потом мне нужно провести над ними несколько операций, но даже эти точки на выводе округлены к примеру для [1495.952,934.023]
будет [1495.95,934.023]

Ответы86925

3 ноя, 23:52 #281 #1086925

>>1086910
Может быть, ты что-то делаешь не так при выводе? Потому что https://ideone.com/Y9Reqz у меня ничего не округляется.

Ответы8693186932

4 ноя, 00:18 #282 #1086931

>>1086925
а попробуй вывод через g, а не через f

4 ноя, 00:20 #283 #1086932

>>1086925
https://ideone.com/4MJCt8

Ответы86937

4 ноя, 00:41 #284 #1086937

>>1086932
А ты точность не пробовал указывать? Точность по умолчанию - 6, %g показывает (6 - (e + 1)) цифр, то есть (6 - (3 + 1) = 2 цифры для первого числа и (6 - (2 + 1) = 3 цифры для второго. Именно это и происходит: https://ideone.com/EjLA9B

Ответы8694286945

4 ноя, 00:56 #285 #1086942

>>1086937
Спасибо, 2ка теперь пишется, но вот, например, идет округление
https://ideone.com/uIAhac

Ответы86945

4 ноя, 01:01 #286 #1086945

>>1086942
Я там обновил код >>1086937. У тебя порядок числа больше, поэтому точности .7 тоже не хватает. Сделай побольше, вплоть до (вроде бы) 30 (посчитай сам), если не хочешь, чтобы что-то обрезалось.

Ответы86947

4 ноя, 01:03 #287 #1086947

>>1086945
но там ведь оно по-прежнему округляет .129 к .13
у меня там дальше в программе умножение и деление этих чисел и в итоге выходе совсем не то

Ответы86949

4 ноя, 01:10 #288 #1086949

>>1086947
Ты ведь осознаешь, что числа округляются при выводе, и это никак не влияет на твои умножения и деления? Ты ведь осознаешь, что точно представить все множество чисел всего лишь 32 или 64 битами нельзя, и поэтому в числах с плавающей точкой может храниться достаточно близкое (относительно порядка числа), но все же отличающееся значение? Тебе все равно придется округлять результаты, это нормально. Алсо,
> совсем не то
выходить не может, если ты не делаешь глупых вещей (типа катастрофической потери точности при применении последовательных преобразований числа в цикле).
Алсо, код снова обновил.

Ответы8695586958

4 ноя, 01:48 #289 #1086955

>>1086949
может быть это нормально, соре, если не понимаю правильно, но лучше я тебе объясню,
Мне нужно узнать лежат ли точки на одной прямой и если идет округление выходит так, что даже маленькая неточность как .13 вместо .129 играет роль (там в формуле есть деление, может быть(скорее всего) ето и сливает весь результат)
я в целом почитал про арифметические операции над числами с плавающей точкой, но кроме как >такое случается
я ничего не нашел скорее не понял

Ответы86962

4 ноя, 01:53 #290 #1086958

>>1086949
да, и точнее сформулирую вопрос, как можно избавиться от етого хвоста?

4 ноя, 02:03 #291 #1086962

>>1086955
> Мне нужно узнать лежат ли точки на одной прямой
Выбери абсолютную или относительную погрешность (относительно порядка сравниваемых чисел), которая достаточно маленькая, чтобы с ней мириться, но при этом больше, чем погрешность, которую привносят вычисления. Сравнивай точки с учетом этой погрешности. Это нормально, когда ты работаешь с плавающей точкой. Более того - по-другому никак. Рекомендую вот этот цикл статей: https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ (покрути ниже, там будет содержание). Там дохуя, зато найдешь ответы на все свои вопросы.

> да, и точнее сформулирую вопрос, как можно избавиться от етого хвоста?
Округлять.

Ответы86963

4 ноя, 02:09 #292 #1086963

>>1086962
Спасибо большое, сча прочекаю статью

12 Кб, 526x243

4 ноя, 09:41 #293 #1087013

здарова. подскажиет почему на данной строке при первом же проходе цикла появляется сигментейшен фоулт

Ответы87026

4 ноя, 10:20 #294 #1087026

5 Кб, 393x141

5 Кб, 465x62

>>1087013
а вот так все ок, даже рофл нашелся

Ответы87028

4 ноя, 10:44 #295 #1087028

>>1087026
Ты там, ёпта, трип-коды дешифруешь?

4 ноя, 18:24 #296 #1087186

Студент первого курса в треде. Изучаем си на первом семестре, до этого изучал его по книге Кошанаa и еще КиР самостоятельно. Разумеется программа в университете унылая, тем более, там простая основа, но язык мне нравится. Так как, я пользуюсь линуксом, то логично появился интерес в написании драйверов и хоть маленьком участии в развитии ядра (крестики нолиики и гуи программы уже заебался писать, да и скучно мне все это). Какие подводные камни я могу встретить на ентри-левеле в данной области? Сразу скажу, нет планов искать заработок в данной сфере. Или есть советы какие-нибудь. Думаю начать с Линукс Девайс драйверс

Ответы87445

5 ноя, 12:32 #297 #1087445

>>1087186
Лучше пиши дрова для *bsd. Там они реально нужны.

Ответы87467

5 ноя, 13:30 #298 #1087467

>>1087445
Дрова к чему? Я так понимаю, нужно ведь ещё нужное желез приобрести, чтобы было на чём тестировать.

Ответы87474

5 ноя, 14:02 #299 #1087474

>>1087467
Если в *bsd для твоего железа все дрова уже написаны, то в линуксе и подавно.

5 ноя, 22:38 #300 #1087698

Подскажите примеры сишных проектов с наилучшим качеством кода, и где возможности языка задействованы широко.

Ответы8770787747882408829588323

5 ноя, 22:47 #301 #1087707

>>1087698
https://github.com/torvalds/linux

Ответы8772787733

5 ноя, 23:10 #302 #1087727

>>1087707
Там разве задействованы C99 и C11?

Ответы87832

5 ноя, 23:17 #303 #1087733

>>1087707
>torvalds/linux
лол чому не гит? худшего говна чем поделия торвальдса не сыскать

5 ноя, 23:51 #304 #1087747

>>1087698
https://github.com/id-Software/Quake-III-Arena

Ответы88248

6 ноя, 12:10 #305 #1087832

>>1087727
Не шарю в стандартах, но часто видел в коде ядра объявления переменных в середине функций. Есть также мнение, что такие проекты как раз стандарты и двигают.

Ответы88000

6 ноя, 21:11 #306 #1088000

>>1087832
https://stackoverflow.com/questions/20600497/which-c-version-is-used-in-the-linux-kernel/20664429#20664429

Ответы88293

6 ноя, 23:13 #307 #1088047

В чём пишите код? Так ли нужен IDE в Си? Имею в виду серьёзные проекты, а не учебные. Слышал, что многие обходятся emacs/vim.
Алсо, как гуглить вопросы по Си? Вечно вылазит С++.

Ответы880568807988562

6 ноя, 23:29 #308 #1088056

>>1088047
> В чём пишите код
Пишете Саблайм 3 для себя и для всякой мелочи, Visual Studio для рабочих проектов.

> многие обходятся
Ты тоже можешь обходиться, а можешь кодить, рефакторить и отлаживаться с удобствами - выбор за тобой.

> как гуглить вопросы по Си
"c language", "plain c", "ansi c"

Ответы88076

7 ноя, 00:14 #309 #1088076

>>1088056
>Visual Studio для рабочих проектов
Я надеюсь ты про VS Code.

Ответы88077

7 ноя, 00:16 #310 #1088077

>>1088076
> VS Code.
Софт для программистов, сделанный на HTML? Блять, тебе самому-то не противно упоминать такое в этом треде?

Ответы8824288247

7 ноя, 00:19 #311 #1088079

>>1088047
>>1088047
>обходятся emacs
>обходятся
>emacs
Оценил твою иронию, бро.

7 ноя, 12:25 #312 #1088225

>>1085539
https://www.reddit.com/r/programming/comments/3m3uk8/c_never_use_an_array_notation_as_a_function/

7 ноя, 13:10 #313 #1088240

>>1087698
>Подскажите примеры сишных проектов с наилучшим качеством кода, и где возможности языка задействованы широко.
Кстати, скажите, какие из этих проектов возникли в последние 10 лет?

Ответы88252

7 ноя, 13:15 #314 #1088242

>>1088077
>Софт для программистов, сделанный на HTML? Блять, тебе самому-то не противно упоминать такое в этом треде?
JS же, нет? Что поделать, такова судьба десктопа сегодня. Зато кроссплатформенность - удобно, когда постоянно переключаешься между виндой и линупсами.

Алсо Visual Studio которая обычная вообще слабо предназначена для написания кода на Си. Плюсы и то с натяжкой. А вот как IDE для сисярпа очень даже ничего.

Хотя я понимаю, что всё это вкусовщина и дело привычки. Но надо же о чём-то в треде общаться, чтобы он не тонул.

Ответы88483

7 ноя, 13:20 #315 #1088247

>>1088077
что плохого в html? можно рассматривать его как такой ui-фреймворк.
кстати, как обычно майкрософт сделала такие html-приложения в виндовс черт знает еще когда, а идея взлетела только сейчас

Ответы88483

7 ноя, 13:22 #316 #1088248

>>1087747
>Quake III Arena is a multiplayer-focused first-person shooter video game released in December 1999.
Стало быть написана без использования С99 и С11.

7 ноя, 13:34 #317 #1088252

>>1088240
>сишных проектов с наилучшим качеством кода
Что в твоём понимании наилучшее качество кода? Техническая простота или наоборот, обилие синтаксического сахара? Множество хитровыебанных костылей ака СМЕКАЛОЧКА разрабов или паттерн на паттерне?
То, что одни называют "code smell" для других является руководством для программирования. Например встречал кукареки, что "обилие комментариев - признак дурного кода и низкой культуры программирования". Хотя если глянуть Nasa C styleguide или любой другой промышленный сишный стандарт по оформлению кода, увидишь, что в файлах зелёного текста больше, чем непосредственно кода.

Ответы8826788295

7 ноя, 14:23 #318 #1088267

>>1088252
>Что в твоём понимании наилучшее качество кода?
Вот я и спрашиваю об этом здесь опытных сишников, которые могут отличить говнокод от высококачественного кода. Как-то же надо начинающим учиться на хороших примерах.

7 ноя, 15:43 #319 #1088293

>>1088000
Ну и что ты хотел сказать своим постом?

Ответы88300

7 ноя, 15:45 #320 #1088295

>>1087698
таких нет. большие проекты на си - это нечитаемый пиздец. современные высокоуровневые языки не просто так придумали.

>>1088252
где это комментарии называют code smell?

Ответы8829988304

7 ноя, 15:53 #321 #1088299

>>1088295
>где это комментарии называют code smell?
http://lmgtfy.com/?q=comments+is+a+code+smell

Ответы88316

7 ноя, 15:53 #322 #1088300

>>1088293
То, что ты не шаришь не только в стандартах, но и в коде ядра.

Ответы88311

7 ноя, 15:56 #323 #1088304

>>1088295
>таких нет. большие проекты на си - это нечитаемый пиздец. современные высокоуровневые языки не просто так придумали.
А из годных небольших что порекомендуете глянуть?

Ответы8832088387

7 ноя, 16:16 #324 #1088311

>>1088300
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/page_alloc.c#n603
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/page_alloc.c#n883
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/page_alloc.c#n1023
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/page_alloc.c#n1111
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/page_alloc.c#n6143

Ответы88314

7 ноя, 16:21 #325 #1088314

>>1088311
они все в начале блока, это не противоречит C89

7 ноя, 16:27 #326 #1088316

>>1088299
Я начал писать комментарии после того, как к вернувшись к проекту через какое-то время я не понимал что этот код делает.

Ответы88321

7 ноя, 16:34 #327 #1088320

>>1088304
perf tool неплох, как по мне (это часть linux репы, но может рассматриваться отдельно от самого ядра):
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf

7 ноя, 16:35 #328 #1088321

>>1088316
значит твой код говно

Ответы88324

7 ноя, 16:42 #329 #1088323

>>1087698
SQLite.

Ответы88325

7 ноя, 16:43 #330 #1088324

>>1088321
Ну ты то конечно пишешь волшебный код, который понятно только взглянув.
Такие высказывания говорят только о твоей неопытности, как программиста.

Ответы8833088377

7 ноя, 16:44 #331 #1088325

>>1088323
Алсо, OpenBSD.

7 ноя, 16:56 #332 #1088330

>>1088324
мне не интересно мнение говнокодера

Ответы88375

7 ноя, 18:22 #333 #1088375

>>1088330
простой эксперимент. скочай код какого-нибудь проекта и попробуй разобраться в его архитектуре

7 ноя, 18:30 #334 #1088377

>>1088324
Двачую этого. Но тут еще важно, чтобы код-стайл был на уровне, понятные имена функций и т.п.
Комментарии нужны, для описания общих принципов работы твоего кода, описание полей структур и т.п Но хороший код стайл должен работать заместо комментарий в самом коде. В идеале в коде не должно быть вообще комментов посреди функций.

Ответы88409

7 ноя, 18:45 #335 #1088387

>>1088304
>большие проекты на си - это нечитаемый пиздец.современные высокоуровневые языки не просто так придумали.
Неужели обязательно придётся обмазываться крестами/жабой/шарпом/питоном? В современном программировании без этого bloated никак не обойтись?

Ответы88390

7 ноя, 18:52 #336 #1088390

>>1088387
Не слушай этого долбоеба.
Нормальные проекты на С намного чище, понятнее и яснее чем на всяких крестах и жабах.

7 ноя, 19:12 #337 #1088409

>>1088377
>В идеале в коде не должно быть вообще комментов посреди функций
Чушь. Комментарии внутри функции логически делят ее на части, у функции появляется логическая структура более простая для понимания. Ты можешь просто визуально скипнуть не нужные тебе части и начать разбираться в нужной тебе части.

Ответы884158843188462

7 ноя, 19:14 #338 #1088415

>>1088409
т.е. комментарии вида
// ищем залупу
// применяем залупу на хуй
описывает что делает нижеследующий код. без таких комментариев нужно будет сидеть и самому разбираться в коде

1 Кб, 352x167

7 ноя, 19:23 #339 #1088431

>>1088409
>Комментарии внутри функции логически делят ее на части
NYET

Ответы88459

7 ноя, 19:37 #340 #1088440

>>1074988 (OP)
> Комментарии внутри функции логически делят ее на части
Братан, тебе сержант запрещает разбить лапшефункцию на несколько хороших, малых функций?

Ответы88459

7 ноя, 19:54 #341 #1088459

>>1088431
>>1088440
Манямирок. Не все так просто и можно разбить на функции. Да и в чем смысл писать функцию только для одной функции. Это и есть самый настоящий code smell

Ответы8846288494

7 ноя, 20:09 #342 #1088462

>>1088409
>>1088459
Господи, какой же ты нуб. Не позорился бы.

>Functions should be short and sweet, and do just one thing. They should fit on one or two screenfuls of text (the ISO/ANSI screen size is 80x24, as we all know), and do one thing and do that well.

На вот почитай, как пишут действительно умные дяди. А свой манямирок можешь засунуть себе в жопу и не кукарекать тут в чем не шаришь.

https://www.kernel.org/doc/html/v4.10/process/coding-style.html#functions

Ответы88465

7 ноя, 20:11 #343 #1088465

>>1088462
>ко-ко-ко
Простите, но я пишу реальный код для реальных программ, в которых не все так идеально, как в вашем манямирке

Ответы88467

7 ноя, 20:12 #344 #1088467

>>1088465
> я пишу говенный код для говенных программ
Пофиксил, не благодари.

Ответы88471

17 Кб, 554x179

7 ноя, 20:19 #345 #1088471

>>1088467
Смотри, в коде линукса КОММЕНТАРИЙ внутри функции.
Что этот Линус себе позволяет?

Ответы8847588480

69 Кб, 623x667

7 ноя, 20:21 #346 #1088475

>>1088471
Ну это вообще говеный вонючий код

Ответы88480

7 ноя, 20:29 #347 #1088480

>>1088471
>>1088475
Лишний раз доказывает мое предположение, что ты долбоеб.
Во-первых, то что написано в коде стайле не mandatory требование, на то это и код стайл.
Во-вторых, линукс пилят тысячи разработчиков и ежедневно коммитятся тысячи строк кода которые невозможно контролировать и чистить, все лежит на плечах самих разрабов.
В-четвертых, в линуксе есть и примеры уебищного кода похуже твоих высеров, их там оставляют по двум причинам: 1. никто это не собирается переделывать ибо это какие-то легаси драйвера. 2. Для примера как не нужно делать.
В-четвертых, то что ты высрал выглядит легитимно и не засирает читабельность кода.

Ответы88484

7 ноя, 20:32 #348 #1088483

>>1088242
> Зато кроссплатформенность
Саблайм написан на крестах использует Skia для рендера. И кроссплатформенность.

> Visual Studio которая обычная вообще слабо предназначена для написания кода на Си
Ну давай, обоснуй.

>>1088247
> кстати, как обычно майкрософт сделала такие html-приложения в виндовс
Они еще тогда были говном, виджеты ActiveDesktop роняли рабочий стол вместе с explorer-ом, таскбаром и систреем, а .hta работали через раз и годились только для пасхальных яиц и туториалов по обращению с мышью.

Ответы8848888528

7 ноя, 20:35 #349 #1088484

>>1088480
Как можеть читабельность кода то, что призвано улучшить эту самую читабельность?
Сдается, что из нас двоих действительно кто-то долбоеб, и это не я.

Ответы884858848688495

7 ноя, 20:36 #350 #1088485

>>1088484
>Как можеть ухудшить читабельность кода то

7 ноя, 20:39 #351 #1088486

>>1088484
>Как можеть читабельность кода то, что призвано улучшить эту самую читабельность?
Ты по русски умеешь писать, долбоеб, я нихуя не понял, что ты высрал там.

7 ноя, 20:42 #352 #1088488

>>1088483
>Они еще тогда были говном
Ну я где-то читал что у них была какая-то эспериментальная версия ОС с хтмл-интерфейсом давно. Может напиздели.
Ну еще были виджеты в windows 7 и полноценные metro-приложения.
И сейчас UWP можно делать с html и javascript

7 ноя, 20:57 #353 #1088494

>>1088459
> Не все так просто и можно разбить на функции.
Братан, так тебе сержант запрещает? Или марсиане, может, запрещают? Или бесы запрещают? Некоторым кгбшники вон запрещают - а тебе кто запрещает, братан?

7 ноя, 21:00 #354 #1088495

>>1088484
Давай ты сам подумаешь и нам расскажешь, как могут ухудшить читабельность хуевые, out-of-date комментарии. Вообще-то такие вещи люди обычно на первом курсе\проекте узнают, но ты же у нас ПРОМЫШЛЕННЫЙ ПРОГРАММИСТ, первый курс не для тебя, да?

Ответы88496

7 ноя, 21:06 #355 #1088496

>>1088495
>out-of-date комментарии
Зачем ты пишешь out-of-date комментарии. Ты что, ебанутый?
Пишет хуйню и ругает само средство.

Ответы88517

7 ноя, 21:40 #356 #1088517

>>1088496
Иди свою laba1 дальше пиши, нуб. Даже комментировать не буду, постарайся сам догадаться.

Ответы88524

7 ноя, 21:52 #357 #1088524

>>1088517
виртуоза бескоментариевого кода с идеально именованными функциями строго выверенной длины разорвало. найс.

7 ноя, 21:59 #358 #1088528

>>1088483
>Ну давай, обоснуй.
Может потому, что это изначально среда для разработки на языках .Net?
Там даже создать Си проект нельзя, а проект под С++ называется "Visual C++", что намекает.

Ответы8853688623

7 ноя, 22:10 #359 #1088536

>>1088528
> Может потому, что это изначально среда для разработки на языках .Net?
Лолшто? А винду по-твоему в виндовом блокнотике писали? А ты когда-нибудь слышал о знаменитой Visual Studio 6.0 (она же 98)?

> а проект под С++ называется "Visual C++"
Намекает, что студия называется Visual, потому что умела в RAD посредством таскания контролов и заклинания (крестового) MFC. Компилятор под Си в ней всегда был, и никуда не денется - сохраняешь файл с расширением .c, и компилятор соберет его, как написанный на C.

Ответы88706

7 ноя, 23:01 #360 #1088562

>>1088047
>Так ли нужен IDE в Си?
Для начала хватит emacs/vim/geany. А когда поднаберётся опыт, то сам поймёшь, что лично тебе нужно от IDE.

8 ноя, 02:23 #361 #1088623

>>1088528
Сохрани с файл мэйн.с и запусти:

#include <stdio.h>
int main()
{
#ifndef __cplusplus
printf("Nahuuy poshel");
#else
printf("Soryan, antosha");
#endif
}

Ответы8863888706

8 ноя, 04:14 #362 #1088638

>>1088623
ну все правильно, это кресты, а не Си :3
https://ideone.com/y3KfPT

8 ноя, 10:35 #363 #1088706

>>1088536
>>1088623
Что пишется на Си под винду, кроме школьных laba1.с?

Для разработки под микроконтроллеры есть Keil4, IAR и всякие специализированные IDE вроде Visual DSP++. Там поддержка JTAG и ассемблера практически из коробки. Системная хуита пишется для линукса на линуксе. Не знаю ни одного долбоёба, который бы пытался запустить Visual Studio на юниксах или сконфигурировать MSBuild для работы с кросс-компилятором.

Я конечно понимаю, что всё - дело привычки. Но нехуй свою привычку выдавать за истину в последней инстанции. Я сам пользуюсь Visual Studio, когда пишу десктопную хуиту на C# или драйверы на С++. Но использовать студию для Си?

Ответы88722

8 ноя, 11:43 #364 #1088722

>>1088706

mpv медиаплеер написан на си, там и goto в коде есть

Ответы88723

8 ноя, 11:47 #365 #1088723

>>1088722
Лишь бы комментариев в функциях не было

8 ноя, 19:49 #366 #1088887

чуваки, а может такое быть, чтобы система при возврате из функции зануляла весь нижележащий стек?

Ответы8890189119

8 ноя, 20:05 #367 #1088901

>>1088887
Возьми да проверь.

9 ноя, 10:43 #368 #1089119

>>1088887
Занулять не должна. При возврате из фукнции, просто смещается текущий указатель на стек, данные никто не затирает по крайней мере так делает гцц.
Другое дело, если ты работаешь с потоками. Если ты функцию инициализируешь как независимый процесс/поток, то в принципе стэк для этого процесса может быть определён где угодно самой осью, и будет ассоциирован только с этим потоком. Внутри же потока работа со стэком будет идти стандатно "сверху-вниз".

В любом случае, нахуя тебе нижележащий стэк?

Ответы89226

9 ноя, 14:17 #369 #1089226

>>1089119
да походу я просто затупил - забыл что принты дохуя стека отжирают.

Ответы89229

9 ноя, 14:18 #370 #1089229

>>1089226
Словил стэковерфлоу или что?

Ответы89231

9 ноя, 14:19 #371 #1089231

>>1089229
не, я лонгджампами балуюсь. стексмешинг или сегементацию ловлю.

9 ноя, 14:25 #372 #1089238

Господа, поясните как выделяется память под элементы связанного списка.
Допустим у нас есть потрёпанный жизнью список, из которого уже удалили дохуя элементов в разных местах. Добавление новых элементов будет увеличивать общее пространство, которое занимает этот список, или они будут записываться в те места, где располагались удалённые?

Я понимаю, что здесь больше решает то, как реализована рантайм либа, а точнее malloc в ней. Но просто интересно стало, можно ли вызвать переполнение кучи, если долго насиловать простенький связанный список.

Ответы8927189284

9 ноя, 14:49 #373 #1089271

>>1089238
никогда об этом не задумывался, я всегда заранее выделял буфер под узлы. и через обёртку над инструкциями bsf bsr их выделял - массивом битов.

9 ноя, 15:10 #374 #1089284

>>1089238
Список тут ничем не отличается вообще от выделения памяти. Если у тебя malloc при выделении и удалении одинаковых блоков памяти ведет к переполнению, то это хуевый malloc

9 ноя, 15:10 #375 #1089286

вот это возвращает 0:

size_t fu(void) {
int v;
return (size_t)&v;
}

это типа специально так, чтобы быстрей ошибка выловилась?

Ответы89293892958941490085

9 ноя, 15:22 #376 #1089293

>>1089286
>return (size_t)&v;
Ты пытаешься разыменовывать переменную или у тебя просто звёздочка проебалась в int v;?

9 ноя, 15:22 #377 #1089295

>>1089286
А какая разница, что возвращает эта функция? Ты никак корректно не можешь использовать аддресс.

Ответы89298

9 ноя, 15:24 #378 #1089298

>>1089295
могу, например, посчитать оверхед в стеке на каждую функцию.

Ответы89300

9 ноя, 15:26 #379 #1089300

>>1089298
Это что такое?

9 ноя, 17:30 #380 #1089414

>>1089286
Переменную не используешь, компилятор ее оптимизирует нахуй. Наверное. Подробнее в дизасме. Лучше передавай аргумент, удостоверься, что передается в стеке (можешь variadic-функцию сделать) и возвращай его адрес. Будет надежнее.

Ответы89416

9 ноя, 17:31 #381 #1089416

>>1089414
да я пока забил. к тому же, оптимизатор сходу заинлайнит функцию.

Ответы89418

9 ноя, 17:34 #382 #1089418

>>1089416
Ну сделай ее extern, скажи __attribute__((noinline))__, че ты как маленький-то. Ну и variadic-функции хуево инлайнятся, если что.

10 ноя, 22:32 #383 #1090085

>>1089286
uintptr_t zalupa(void) {
int v;
v=v;
return (uintptr_t)&v;
}

Ответы90091

10 ноя, 22:48 #384 #1090091

>>1090085
Умный самый? На, насладись: https://godbolt.org/g/2gY1XJ

Ответы90117

11 ноя, 00:29 #385 #1090117

>>1090091
тогда так:
void zalupa(uintptr_t huibes)
{
int v;
v=v;
huibes =(uintptr_t)&v;
}

int
main(void)
{
uintptr_t huibes;
zalupa(&huibes);
printf("zalupa govorit huibes = %p", huibes);
}

https://m.youtube.com/watch?feature=youtu.be&v=iHzqPHVRLX0

11 ноя, 00:33 #386 #1090118

void zalupa(uintptr_t huibes)
Тут звёздочку перед хуибесом двач не распечатал - должна была стоять (там хуибес курсивным стал почему-то).

Ответы90119

11 ноя, 00:34 #387 #1090119

>>1090118
Ну я там выше примерно это и предлагал. Да, тут компилятор не осилил... пока.

11 ноя, 00:35 #388 #1090120

+ * huibes =(uintptr_t)&v

11 ноя, 00:41 #389 #1090122

Можно считать себя знающим Си (как неосновной язык), если ни разу не байтоёбил, и не собираешься? Вот откроешь сорцы драйверов - хуй чё поймёшь, и не интересно вообще. А вот более высокоуровневые вещи уже интересны.

Ответы90131

11 ноя, 01:01 #390 #1090129

я фокусник:
uintptr_t zalupa(void)
{
int volatile v;
register uintptr_t r1 = (uintptr_t)&v;
return r1;
}

Ответы90133

11 ноя, 01:15 #391 #1090131

>>1090122
Нельзя, т.к. ты до сих пор не понял, что драйверы — и есть основное назначение языка (хотя бы уже из-за того, что во многих ОС на низком уровне отсутствуют возможности более крутых языков).

И у тебя, скорее всего, неправильный стиль кодирования на нём включая скобочки

Ответы90134

29 Кб, 600x289

11 ноя, 01:26 #392 #1090133

>>1090129

11 ноя, 01:30 #393 #1090134

>>1090131
Ну ладно, освою гтк и забью тогда.
со своим уставом в чужой монастырь не ходят, поэтому стиль соблюдаю

Кстати, почему названия функций стандартной библиотеки так сокращены сильно? Почему не string_length вместо strlen и т.д.? Иногда бывает совсем неочевидно из-за этого. Это связано с давними временами и ограничениями какими-то?

Ответы9013590138901399022490226

11 ноя, 01:33 #394 #1090135

>>1090134
ограничением мозга. советую более крутые языки.

11 ноя, 01:46 #395 #1090138

196 Кб, 1280x953

24 Кб, 310x400

>>1090134
>Это связано с давними временами и ограничениями какими-то?
Ага, и ещё какими...

11 ноя, 01:47 #396 #1090139

>>1090134
В те времена, когда си был популярен, было модно писать так, чтобы никто не понял. Чем меньше людей понимают твой код - тем ты круче как разработчик. Сейчас все наоборот.

Ответы90167

11 ноя, 05:56 #397 #1090167

>>1090139
>Сейчас все наоборот.
Чем меньше людей понимают твой код - тем твои подвороты круче среди смузихлебов

11 ноя, 11:27 #398 #1090224

>>1090134
> Кстати, почему названия функций стандартной библиотеки так сокращены сильно? Почему не string_length вместо strlen и т.д.?
Ну и чё? В питухоне тоже есть всякие len, chr, repr. Стандартная либа на то и стандартная, что её заучиваешь наравне с языком. Для меня лично профит в том, что более сокращённые именования функций не загромождают код лишний раз. Но когда свои функции пишешь, наверно, такое именование плохая практика.

11 ноя, 11:36 #399 #1090226

>>1090134
было ограничение на длину идентификатора, в C89 было 6 символов sic.

Ответы9022990729

11 ноя, 11:41 #400 #1090229

>>1090226
> 6 символов
p.s. первые 6 символов были значимы

11 ноя, 13:23 #401 #1090256

Суп посоны. Подскажите пожалуйста, на работе программист на С пишет простенькую программу, а мне дали задание сделать под ней графическую оболочку с собственным дизайном. Я то дизайнер, не программист, кнопочки нарисую, но вот в какой программе-конструкторе мне эту оболочку собрать? То есть мне нужно сделать оболочку с двумя кнопками и окном сообщений под ними, неактивный, программист уже потом сам привяжет функционал. Кнопки Закрыть/свернуть.расширить тоже свои должны быть. Где мне это сотворить побыстрее, чтобы потом код на С можно было привязать?

Ответы9034490446

11 ноя, 17:23 #402 #1090344

>>1090256
gtk

Ответы90446

22 Кб, 352x364

11 ноя, 20:59 #403 #1090445

как сделать вот это говно автоматом?

я уже блядь заебался геттеры писать, если ещё один геттер увижу- переебу кому-то. пикрелейтед работает, но такая декларация засирает класс ещё мощнее.

макросами как-то можно получить имя класса? может дружбу по другому можно организовать?

Ответы90448

11 ноя, 21:00 #404 #1090446

>>1090256
если надо красива - qt
если на отъебись - >>1090344

11 ноя, 21:05 #405 #1090448

>>1090445
>заебался геттеры писать
и какого хуя ты нам мозг ебешь, а не плюсанам?

Ответы90488

81 Кб, 388x475

11 ноя, 22:03 #406 #1090488

>>1090448
а где собственно плюсогоспода, если этот тред только для сидетей?

Ответы90646

11 ноя, 22:53 #407 #1090531

не понимаю вот какой фигни, почему на входе в main стек указывает на адрес возврата? хотя вроде должен на пустое место, и в других функциях так и есть - там сходу пуши идут.

Ответы90532

11 ноя, 22:55 #408 #1090532

>>1090531
На x86 при входе в функцию указатель стека всегда на адрес возврата указывает. Просто call так работает. На каких-нибудь ARM с ихними link register-ами не так.

Ответы90561

11 ноя, 23:55 #409 #1090561

>>1090532
ясно. а тут можешь объяснить что происходит после вызова? я часа 2 уже просто нихуя не понимаю. https://pastebin.com/uXHsnuSg

или в мейне и возврат какой-то хитрый?

12 ноя, 00:04 #410 #1090569

просто программа под оптимизацией, и она падает в глуби - не знаю как заставить её выйти - проверить. может как-то в gdb можно заставить прыгнуть на ret - переписать регистр?

Ответы9057290656

12 ноя, 00:06 #411 #1090572

>>1090569
https://sourceware.org/gdb/onlinedocs/gdb/Jumping.html

Ответы90585

12 ноя, 00:42 #412 #1090585

>>1090572
ну вроде срастается картина. я чё-то сразу не всосал, что там сначала декремент.

12 ноя, 02:40 #413 #1090603

2ch, чем отличается обычный строковый литерал от u8 строкового литерала? На Windows u8 отображает кракозябры, на линухе он работает точно так-же как и обычный строковый литерал.

Ответы9063190633

12 ноя, 04:23 #414 #1090631

>>1090603
Ну короч у тебя есть source encoding (кодировка исходника) и execution encoding (кодировка, с которой работает программа), и при компиляции строковые литералы преобразуются из первой во вторую. u8 - это специальный тип строковых литералов, хранящит только UTF-8, при компиляции их содержимое преобразуется из кодировки исходника в UTF-8. Это все не имеет особого смысла под Linux (там по умолчанию source charset = execution charset = UTF-8), а вот в винде у тебя может быть исходник в UTF-16 и execution-кодировка Windows-1251 (например, в студии UTF-8 в качестве execution-кодировки нихуя не поддерживается). И если ты хочешь, например, генерить какой-нибудь HTML в коде, то u8 для тебя.

> На Windows u8 отображает кракозябры
Потому что интерфейс и консоль в UTF-16 (-W функции) или в Windows-1251 (-A функции).

12 ноя, 04:27 #415 #1090633

>>1090603

в джаве нет таких проблем

Ответы9063590637

12 ноя, 04:29 #416 #1090635

>>1090633
Да в джаве вообще нихуя нет.

12 ноя, 04:33 #417 #1090637

>>1090633
Джаву просто делали слегка позже, учитывая ошибки предшественников. В том числе и эту.

12 ноя, 04:57 #418 #1090646

>>1090488
>а где собственно плюсогоспода
вотъ
https://2ch.hk/pr/res/1085579.html (М)

4,9 Мб, mp4,
480x636, 0:09

12 ноя, 05:59 #419 #1090656

>>1090569
все байтоебствуете, ироды?

12 ноя, 12:03 #420 #1090729

>>1090226
Спасибо!

13 ноя, 05:00 #421 #1091075

Когда складывается float с маленьким значением и float с большим, то это работает дольше, чем 2 float с маленьким значением. Реквестирую статью подробно объясняющую этот эффект и очень желательно график, где по горизонтальной оси идёт n от 0 до какого-нибудь натурального числа, который означает какое количество раз прибавить маленькое float к другому float, а по вертикальной среднее время операции прибавления. Хочу проверить как меняется этот график с ростом float, к которому прибавляем маленькое float.

Ответы9108391365

13 ноя, 06:36 #422 #1091083

>>1091075
> Когда складывается float с маленьким значением и float с большим, то это работает дольше
С чего бы вдруг?

75 Кб, 1292x824

13 ноя, 19:24 #423 #1091352

Возможно пишу не в тот тред, но с этим скорее помогут тут.
Решил написать скрипты CMake для микроконтроллера по образцу https://github.com/ObKo/stm32-cmake Проблема в том, что я не до конца понимаю как и когда выполняется код из тулчейн файлов. Например, когда я вставил в https://github.com/ObKo/stm32-cmake/blob/master/cmake/gcc_stm32.cmake#L15 строку:
>message("TOOLCHAIN_PREFIX = ${TOOLCHAIN_PREFIX}")
Получилась ерунда (на картинке). Почему этот код выполнился несколько раз? Почему в эту переменную переданный параметр попадал не всегда? Когда выводилось "/usr", этот скрипт очевидно давал неправильный результат, но в итоге в кэше cmake оказались правильные значения. Если при отсутствии этой переменной не выставлять значение по умолчанию, а выдавать ошибку и останавливать выполнение, то оно в таком виде работать не будет. Так как правильно делать?

Ответы9141494270

13 ноя, 19:44 #424 #1091365

>>1091075
Субнормальные числа че-то такое.

Ответы9136691404

13 ноя, 19:45 #425 #1091366

>>1091365
https://ru.wikipedia.org/wiki/Денормализованные_числа

Ответы91404

13 ноя, 20:27 #426 #1091404

>>1091365
>>1091366
Не разобрался. Что делать если я много раз маленькие числа складываю в одно большое?

Ответы91410

13 ноя, 20:32 #427 #1091410

>>1091404
> Что делать
Ничего. Если у тебя возникают денормализованные флоаты, то они либо тебе нужны, либо у тебя баг в вычислениях.

13 ноя, 20:37 #428 #1091414

>>1091352
в мэйк есть флаг вывода отладочной инфы, где можно понять почему сработало правило, в симэйк думаю тоже такое есть.

14 ноя, 23:01 #429 #1092128

gcc version 6.3.0

char 卐names[] = {"LANG", "DISPLAY", "USER", "PWD", "HOME", "TERM", "SHELL", "LOGNAME"};
All rigth.

char 卐卐names=...
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
note: (near initialization for ‘names’)
warning: excess elements in scalar initializer
Сегфолт при старте.

char names[][]
error: array type has incomplete element type ‘char[]’

Заодно оставил себе заметку https://a.pomf.cat/esrkyu.c

Ответы92134

14 ноя, 23:21 #430 #1092134

>>1092128
char *namers[] = {...};
или
#define MAX_LENGTH 32
char names[][MAXLENGTH] = { ... }

Ответы92136

14 ноя, 23:25 #431 #1092136

>>1092134
А, ну, почему [][] не работает, ясно - там со второго должны быть указаны размеры, да?
А что не так с names?

Ответы9213892144

14 ноя, 23:25 #432 #1092138

>>1092136
> Что не так с 卐卐names

Ответы92144

14 ноя, 23:34 #433 #1092144

>>1092136
>>1092138
Разобрался.
[][] - компилятору придётся учитывать смещения из следующих после первого [] скобках.
- просто указатель (чаще всего long int)

16 ноя, 12:47 #434 #1092821

Помогите понять в чем проблема при использовании профайлера Jemalloc.

Есть один весьма объемный кусок кода на Ruby который течет, и течет, видимо, из частей писаных на C, т.к. при растущем как на дрожжах RSS рубишная куча в объеме не меняется. Задумал я слазить в кучу сишную, и столкнулся с проблемой.

Допустим выставляю я MALLOC_CONF='prof_leak:true,lg_prof_sample:0,prof_final:true,stats_print:true', запускаю свой код. В самом стартовом состоянии это все вместе с фреймворком для обработки фоновых задач весит 200+Мб. Жму Ctrl+C, получаю статы и нихуя не понимаю:
https://pastebin.com/RiMLtqA6
Это значительно меньше чем я ожидал, и эти цифры не меняются несмотря на реальный вес процесса. Очевидно где-то я наебался когда jemalloc заводил. В чем дело может быть?

16 ноя, 17:23 #435 #1092949

>>1074988 (OP)
Господа, иногда пишу под микроконтроллеры на си, но основной язык для меня - кресты. Как повысить свою грамотность в си? Что читать в качестве справки, чтобы стать профессионалом?

Ответы92951

16 ноя, 17:27 #436 #1092951

>>1092949
Прату, стандарт.

17 ноя, 08:42 #437 #1093296

не очень понял, longjmp - понятно, он сохраняет регистры, но что есть в процедуре дальше изменятся значения стека?

или это конструкция на уровне компилятора - он определяет и препятствует этому всему?

тогда что, написать самому лонгджамп - нереально?

Ответы9331693522

17 ноя, 08:44 #438 #1093297

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

Ответы93316

17 ноя, 10:50 #439 #1093316

>>1093296
>>1093297
Блядь, мелкобуквенная ты пидарасина, как так можно формулировать вопросы? Я десять раз прочитал твои посты и нихуя не понял. Пиздец, аж пригорело.

17 ноя, 17:25 #440 #1093522

>>1093296
setjmp сохраняет позицию стека, но не его содержимое. Если ты после setjmp изменил значение локальной переменной и сделал longjmp, значение переменной может остаться измененным (чтобы изменения гарантированно произошли, перенменная должна быть volatile).

> написать самому лонгджамп - нереально?
Реально, берешь ассемблер под целевую архитектуру и пишешь.

Ответы93656

17 ноя, 18:15 #441 #1093546

__asm__ __volatile__("movb $'H' , %al\n");
Как мне подставить переменную на место "$'H'"? Подскажет кто?

Ответы9364093664

17 ноя, 20:23 #442 #1093631

13 Кб, 322x157

10 Кб, 298x125

3 Кб, 389x35

помогите, пожалуйста, функция print_str не срабатывает, скорее всего проблема либо в пике 2, либо в компиляции.
>3 makefile

Ответы936339364093644

19 Кб, 410x221

17 ноя, 20:25 #443 #1093633

>>1093631
вместо пика 1 - main.c
фикс

17 ноя, 20:33 #444 #1093640

>>1093546
Не используй инлайн-ассемблер! Не используй его, сука. Если не можешь обойтись без ассемблера, сделай отдельный .S файл рядом и ассемблируй его отдельно. Тогда тебе не будет мучительно больно пару лет спустя этот асм из кода вычищать. Но в целом, в GCC на всю голову ебнутый инлайн асм, требующий указывать входные и выходные переменные примерно так: https://ideone.com/8da7N

>>1093631
> первый скрин
Ты объявил функцию puts внутри функции print_str. Но не вызвал. Объявления от вызовов отличаются наличием типа возвращаемого значения (видишь int слева?) и типов формальных аргументов (видишь const char ∗ в скобочках?). Скажи так: puts(str). А объявлять ее вообще не нужно, она уже объявлена в stdio.h, и stdio.h у тебя заинклужен.

19 Кб, 410x221

17 ноя, 20:43 #445 #1093644

>>1093631
Спасибо!

Ответы93645

17 ноя, 20:43 #446 #1093645

>>1093644
сук случ приклеилось

17 ноя, 21:06 #447 #1093656

>>1093522
но а как же невидимые временные переменные, типа расчёта смещений? например до сет джампа пушется указатель на массив, а после в него производится add до конкретного - и всё, посос.

Ответы93659

17 ноя, 21:16 #448 #1093659

>>1093656
> невидимые временные переменные
Такие вещи обычно не перемежаются вызовами функций. До вызова у тебя либо уже посчитан ебаный указатель, либо еще не посчитан и будет посчитан в ветке if. Или я хуй знаю, что ты там имеешь в виду, показывай код - обсудим.

Ответы93663

17 ноя, 21:21 #449 #1093663

>>1093659
Хотя вообще-то ты прав, компилятор может, например, реюзать переменные, и если он вообще не знает, что такое setjmp, какие-нибудь оптимизации могут все испортить.

Ответы93666

17 ноя, 21:24 #450 #1093664

>>1093546
смотри, есть 3 поля, первое говорит о выходящих, второе о входящих, третье говорит что внутри кода изменятся используются конкретные регистры - они изменятся.

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

короче как-то так:

__asm__ ("addl $12 , %0\n"::"a"(va):);

в %0 уже будет нужное тебе значение, это будет регистр eax.

ах да, если используешь входящие значения, тогда регистры придётся указывать через 2 %.

17 ноя, 21:26 #451 #1093666

>>1093663
херово, не хочется всю функцию в асемблере писать. может как-то порезать код на функции...

Ответы93673

17 ноя, 21:29 #452 #1093671

просто для моих задач стандартный лонгджам не прокатит, там защита стека - проверяется прыжок в переписанный стек, даже если это прост изменение его высоты. хрен знает как сказать.

причём странно, эти функции с проверкой стека, подставляются только после -O (приписка _chk). я говорю про gcc и linux.

Ответы93673

17 ноя, 21:31 #453 #1093673

>>1093666
Чего ты добиться-то пытаешься? Ты ведь можешь стейт setjmp в глобальной переменной хранить или вообще в контексте, вызывать дочерние функции, передавать туда свой стейт и выпрыгивать из них наружу при необходимости. Алсо, про временные переменные и реюз переменных я говорил в контексте абстрактного не соответствующего стандарту компилятора,-который не знает про существование setjmp, но на практике он знает и обязан сделать так, чтобы поведение соответствовало предписанному сепецификации.

>>1093671
Ты там сплоит пишешь или что? setjmp должен работать независимо от -O и проверок. Если не работает - это баг компилятора.

Ответы93677

17 ноя, 21:35 #454 #1093677

>>1093673
просто стандартный лонгджамп не предполагает такие прыжки. прыжки в какбы мёртвую функцию, но на деле она специально огорожена куском своего стекпространства.

Ответы93680

17 ноя, 21:37 #455 #1093680

>>1093677
Ну отключай тогда оптимизации для функции, в которую впрыгиваешь. #pragma GCC optimize, вся хуйня.

Ответы93831

18 ноя, 05:40 #456 #1093831

>>1093680
ну ты же понимаешь, это путь слабых.

Ответы93833

18 ноя, 06:58 #457 #1093833

>>1093831
Ну ты же понимаешь, что с оптимизирующими компиляторами нельзя делать никакой магии, выходящей за пределы стандарта, если только ты сам не пишешь этот компилятор?

18 ноя, 10:59 #458 #1093849

Не знаю, где про OpenCL спросить. Пусть будет здесь.
Как выбрать количество global work, которое указывается в clEnqueueNDRangeKernel? Делаю простой тест, чтобы опытным путём выяснить оптимальное значение для алгоритма и, чем больше его выставляю, тем больше получается скорость. Например, при 1024 скорость около 9000 в секунду, если поставить 4096, то уже возрастает больше, чем в 2 раза и составляет около 22000, если 16k, то прирост уже не так значителен, примерно до 24000. Как высчитать его, да и ещё не только для моей видеокарты? Пробовал через clGetKernelWorkGroupInfo с параметрами CL_KERNEL_WORK_GROUP_SIZE и CL_KERNEL_COMPILE_WORK_GROUP_SIZE (подсмотрел в hashcat), но он выдаёт очень маленькое значение 256.

Ответы93870

18 ноя, 12:18 #459 #1093870

>>1093849
спрашивай в /gd. здесь только школьники сидят,а там может и есть шанс

18 ноя, 21:28 #460 #1094068

Есть указатель на инт с именем i. А потом следующая конструкция.
*i = 0;
Что это значит?

Ответы9406994070

18 ноя, 21:29 #461 #1094069

>>1094068
И почему внутри sizeof можно нулевой указатель разыменовывать?

Ответы94070

18 ноя, 21:32 #462 #1094070

>>1094068
* разыменовывает указатель, т.е., работает с тем объектом, на который указывает указатель. Т.е., пиште 0 по адресу, который хранится в i.

>>1094069
> И почему внутри sizeof можно нулевой указатель разыменовывать?
Потому что sizeof не выполняет фактического доступа, вся необходимая информация существует уже на этапе компиляции. Исключение: для VLA sizeof обращается к счетчику элементов в массиве в рантайме.

Ответы94072

10 Кб, 328x260

18 ноя, 21:41 #463 #1094072

>>1094070
>* разыменовывает указатель, т.е., работает с тем объектом, на который указывает указатель. Т.е., пиште 0 по адресу, который хранится в i.
Блять. Тупонул. Конечно так можно. Вот на пике проблема в чём? Указатели разыменовываются при передачи в функцию, а она ожидает указатель, а не значение, а поскольку значение нули, то в функцию передались нулевые указатели?

>Потому что sizeof не выполняет фактического доступа, вся необходимая информация существует уже на этапе компиляции. Исключение: для VLA sizeof обращается к счетчику элементов в массиве в рантайме.
А результат почему возвращает такой, который возвращает?

Ответы94073

18 ноя, 21:49 #464 #1094073

>>1094072
У тебя на пике s и c указывают на мусор, т.к., ты их не инициализировал. Затем ты записал два числа с плавающей точкой (нули) по рандомным адресам в памяти. Или оно свалилось при попытке это сделать. Алсо, printf не печатает указатели на float, тебе во-первых их нужно дереференсить, а во-вторых, указать форматную строку первым аргументом (printf("%f %f\n", ∗s, ∗c);

Алсо, ты скорее всего имел в виду float s = 0.0f, c = 0.0f; frenel(1337.0f, &s, &c); printf("%f %f\n", s, c);

> А результат почему возвращает такой, который возвращает?
Какой-то непонятный вопрос.

Ответы94076

18 ноя, 22:04 #465 #1094076

>>1094073
Ты мог подумать, что я новичок. Но я не новичок! Просто давно си не пользовался. И вообще код не мой. Если забыть про printf и то, что присвоение мусорным указателям может выбросить segmentation fault, то в функцию попадут нулевые указатели?

>Какой-то непонятный вопрос.
Если внутри sizeof разыменовывать нулевой указатель, то он вернут какой-то результат. Этот результат где-нибудь определен?

Ответы94112

19 ноя, 00:30 #466 #1094112

>>1094076
> Если внутри sizeof разыменовывать нулевой указатель
Ты чего-то явно не понимаешь. sizeof() насрать на значения, он работает с типами. Если ты передаешь внутрь sizeof значение, сначала вычисляется его тип (и кроме случая с VLA это отлично делается во время компиляции). Например, у тебя int ∗foo = NULL; sizeof(int ∗) вернет размер указателя на int;
sizeof(int) вернет размер инта;
sizeof(foo) посмотрит, что у foo тип - int ∗, далее см. выше;
sizeof(∗foo) посмотрит, что при дереференсе int ∗ получается int, далее см. выше;
sizeof(1) значет, что тип численного литерала int, далее см. выше;
sizeof(1.0) знает, что тип численного литерала double, ну ты пони;
sizeof("foo") вычисляет размер типа char[4];
int ∗bar = malloc(100500); sizeof(bar) вернет размер указателя на int, sizeof(∗bar) вернет размер инта, ему абсолютно фиолетово, сколько ты там выделил и выделял ли вообще;
и т. д. Не нужно ничего дереференсить, чтобы посчитать размер!

Вопросы для самоконтроля:
void ∗ptr = NULL;
printf("%zu\n", sizeof(ptr));
printf("%zu\n", sizeof(∗ptr));
printf("%zu\n", sizeof('x'));

19 ноя, 01:23 #467 #1094124

2ch, а зачем в начале функции main делается push rbp? Это потому-что компилятор делает это для всех функций и по идее в main можно обойтись без этой инструкции?

Ответы94131

19 ноя, 01:35 #468 #1094131

>>1094124
Это стандартный пролог - создать кадр стека, и адресоваться внутри него относительно rbp/ebp, вне зависимости, сколько там локальных переменных выделено и сколько пушей с аргументами для дочерних функций.

Ответы94134

19 ноя, 01:38 #469 #1094134

>>1094131
Но в main ведь можно и не делать push rbp.

Ответы941649418394270

19 ноя, 04:44 #470 #1094164

>>1094134
С чего ты так решил? Чем main() особенная? У тебя там нет автоматических переменных и аргументов?

19 ноя, 07:58 #471 #1094183

>>1094134
main это зачастую не первая выполняемая функция.

19 ноя, 12:48 #472 #1094270

>>1094134
Entry point задается в линкере, по крайней мере для gcc.

Так никто не знает >>1091352 ? Мне хотя бы понять почему оно в таком порядке выполняется.

Ответы94275

19 ноя, 12:53 #473 #1094275

>>1094270
а в чём смысл CMake ?

Ответы94596

19 ноя, 20:33 #474 #1094596

>>1094275
То, что обычно компилируется cc *.c теперь требует многочасовой ебли с макросами в попытках заставить эту ебанину компилироваться - программист занят, программист получает зарплату, все счастливы.

Ответы94618

19 ноя, 21:09 #475 #1094618

>>1094596
Не, ну если laba1.c в одном файле, то он прав.

Ответы94630

19 ноя, 21:17 #476 #1094630

>>1094618
Еще не видел ни одного проекта, который стало бы проще собирать после перехода на CMake. Вот проекты, которые внезапно стало невозможно собрать на какой-нибудь винде - видел в ассортименте.

Ответы95170

20 ноя, 03:02 #477 #1094776

Я правильно понимаю что возможности открыть файл без неявного обращения к maloc у нас нет? То есть без обращения к ядру или win api напрямую. Вообще досадно, казалось бы выделяй буфер на стеке и пиши, читай, открывай. Интересно чем руководствовались разработчики стандартной библиотеки?

Ответы94777

20 ноя, 03:05 #478 #1094777

>>1094776
бери и выделяй на стеке, в чём проблема. что за неявный malloc?

Ответы94795

20 ноя, 04:39 #479 #1094795

>>1094777
Вот же её прототип, не:
FILE fopen(const char fname, const char *mode)
Возвращается же указатель. Вот я и погорячился подумав было что память для таблицы потока должна выделяться динамически, пардон.

Ответы9479694812

6 Кб, 820x38

20 ноя, 04:40 #480 #1094796

>>1094795
Вакаба звёздочки поела.

20 ноя, 06:13 #481 #1094812

>>1094795
Никто не запрещает стандартной библиотеке выделять память динамически, но обычно там табличка (не)достаточного размера: https://ideone.com/V5fQJo

Ответы94815

20 ноя, 06:23 #482 #1094815

>>1094812
>Никто не запрещает
А вот сейчас обидно было. Это уже наверняка, где погуглить-то?

Ответы94818

20 ноя, 06:30 #483 #1094818

>>1094815
> где погуглить-то?
https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/libio/iofopen.c#L72
Такие дела.

Ответы94819

20 ноя, 06:39 #484 #1094819

>>1094818
Спасибо. Грустно это всё. В обработчике сигнала теперь файлы не пооткрывать.

Ответы94827

20 ноя, 07:11 #485 #1094827

>>1094819
> В обработчике сигнала теперь файлы не пооткрывать.
А то иначе бы ты пооткрывал. Если сигнал вызван не raise(), то ты вообще не имеешь права вызывать из стандартной библиотеки что-либо, кроме signal(), exit() и товарищей. Даже за использование какого-нибудь сраного memcpy() тебе обещают UB. Именно из-за подобных обещаний Си - говно, как и его стандартная библиотека, а кроссплатформенность этого языка - миф.

Ответы94835

20 ноя, 07:54 #486 #1094835

>>1094827
>Именно из-за подобных обещаний Си - говно, как и его стандартная библиотека, а кроссплатформенность этого языка - миф.
каков накал, какая экспрессия.

20 ноя, 19:50 #487 #1095104

>>1074988 (OP)
Анон, перевел одну большую машину состояний из стандартной таблицы указателей на функции в кучу switch-case. Получилось что-то такое https://ideone.com/vGnMEu . Размер таблицы стал намного меньше (в предыдущей реализации она вобще хранилась в ОЗУ вместо кода), компилятор прекрасно соптимизировал, это добро работает быстрее, чем таблица указателей. Единственный минус - слишком много кода, 2000 строчек вместо сотни, аж kdiff3 подвисает когда грузит файл. Вопрос: можно ли препроцессором задефайнить хороший макрос, который сократил бы эти switch-caseы для каждого события в одну строку? Или не стоит ебаться со всем этим?

Ответы95159

20 ноя, 21:37 #488 #1095159

>>1095104
2000 строк для стейтмашины норм. Я бы не ебался.

Ответы95447

20 ноя, 21:52 #489 #1095167

Упражнений на pthreads, плиз.
Не могу найти.

Ответы95335

20 ноя, 21:53 #490 #1095170

>>1094630
Что мешает тоже самое написать в CMake? И чем мне собирать проекты чуть выше уровня laba1.c для микроконтроллеров?

Ответы9517395330

20 ноя, 22:04 #491 #1095173

>>1095170
> Что мешает тоже самое написать в CMake?
Адская магия при выборе тулсета? Адская магия при попытке воткнуть нужные ключи тулсету? Адская магия при попытке отучить его тестировать тулсет? Адская магия и невероятное количество захардкоженных путей внутри тысячи файлов, которые обеспечивают его работу? Уж лучше SCons взять.

21 ноя, 04:17 #492 #1095330

>>1095170
QBS или тот же CMake. Какая нахуй разница для какого железа твой компилятор.

21 ноя, 04:31 #493 #1095335

>>1095167
Создать два потока и в каждом pipe или сокет.
Отправить из первого потока сообщение во второй.
Выполнить задание и отправить из второго сообщение в первый.
.
.
.
PROFIT!!!

Ответы95373

21 ноя, 07:52 #494 #1095373

>>1095335
Ну писец теперь.
Давай что пооригинальнее. Тем более, твоё скорее даже не на треды

Ответы95375

21 ноя, 07:56 #495 #1095375

>>1095373
придумай многопоточную сортировку.

21 ноя, 12:56 #496 #1095447

>>1095159
В общем-то да, макросами препроцессора таки хуй что получится сделать без перепиливания кода, так что можно потерпеть.

21 ноя, 14:18 #497 #1095510

>>1077501

> без пространств имён

В хедерочках интерфейсы, в с - внутренняя кухня. кухня с кухней общаются только через интерфейсы в хедерочках. Если в коде не будет никаких extern - вот тебе и инкапсуляция.
> перегрузок

см. OpenGL

>куда девать глобальные переменные?

В с-файлы, очевидно жеж. Всю внутреннюю кухню как-нибудь ___huitka обзывай.

Заодно си избавят тебя от головного мозга и научат cache-friendliness и data-oriented design. И ты больше не будешь конструировать невлезающих в кеш монстров а будешь их по разным мемори пулам раскладывать.

Вот так не делай:

https://github.com/orangeduck/Corange

Ответы9551895672

21 ноя, 14:33 #498 #1095518

>>1095510

Ну и да:

http://giant.pourri.ch/Graphics Programming Black Book/Graphics Programming Black Book.pdf

21 ноя, 17:45 #499 #1095593

Как проще всего сконвертить int в строку? Допустим в инте число "13".

Ответы95635

21 ноя, 18:57 #500 #1095635

>>1095593
Очень нужен ответ.

Ответы9563695640

21 ноя, 18:58 #501 #1095636

>>1095635
sprintf тебе в помощь

21 ноя, 19:08 #502 #1095640

>>1095635
Или itoa

Ответы95642

21 ноя, 19:17 #503 #1095642

>>1095640
Спасибо. Скажите мне напоследок, почему тот же sprintf нормально записывает 4-значное число в массив состоящий из двух элементов(array[2])? С маллоком та же история.
Хули ошибки нет?

Ответы956449564895672

21 ноя, 19:18 #504 #1095644

>>1095642
находите ошибке сами.

21 ноя, 19:25 #505 #1095648

>>1095642
А почему нет?
Писать можно - он и пишет, разве что сегфолт можно иногда словить.

Ответы95661

21 ноя, 19:40 #506 #1095661

>>1095648
Иногда - это когда неаллоцированная память будет занята кем-то другим?
Мне казалось, что такие выходки на уровне компиляции должны отлавливаться.

Ответы95676

21 ноя, 19:53 #507 #1095672

>>1095510
> Всю внутреннюю кухню как-нибудь ___huitka обзывай.
Очень плохой совет. Идентификаторы, начинающиеся с подчеркивания, поголовно зарезервированы (с двух подчеркиваний - стандартом, с одного - компилятором). Лучше выдумать короткий префикс (2-4 символа).

>>1095642
> почему тот же sprintf нормально записывает 4-значное число в массив состоящий из двух элементов
Потому что тебе везет, вот почему. Компилятор, скорее всего, выравнивает размер массива на 4. Или не выравнивает, но ты перезаписываешь что-то не очень важное. То же и с маллоком. Никогда так не делай, не полагайся на особенности компилятора и вообще не стесняйся просить -fsanitize=address объяснять тебе, что ты криворукий уебан.

21 ноя, 20:00 #508 #1095676

>>1095661
пользуйся статическими анализаторами, валгриндом. компилятор не должен знать что там произойдёт с указателем который ты передал.

ПЕРЕКАТ # OP 21 ноя, 20:03 #509 #1095679

ПЕРЕКАТ: >>1095677 (OP)
ПЕРЕКАТ: >>1095677 (OP)
ПЕРЕКАТ: >>1095677 (OP)
ПЕРЕКАТ: >>1095677 (OP)
ПЕРЕКАТ: >>1095677 (OP)

Тред утонул или удален.
Это копия, сохраненная 12 декабря 2017 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion