Сохранен 515
https://2ch.hk/pr/res/2165466.html
Прошлые домены не функционирует! Используйте адрес ARHIVACH.VC.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

C Programming Language #71 /clang/

 Аноним OP 24/09/21 Птн 06:27:59 #1 №2165466 
C Propaganda.jpg
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

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

Что читать:

- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf (декабрь 2020)

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

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

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

http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.

Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.

Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).

Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.

Ben Klemens "21st Century C: C Tips from the New School" (2012)

Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)

Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)

MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf

Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C

https://github.com/kozross/awesome-c

Онлайн-утилиты:

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

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

- №68: http://arhivach.net/thread/667171/
- №69: http://arhivach.net/thread/688454/
- №70: http://arhivach.net/thread/713839/ >>2119301 (OP)
Аноним 24/09/21 Птн 08:30:13 #2 №2165497 DELETED
>>2165466 (OP)
Первыйнах
Аноним 24/09/21 Птн 08:43:07 #3 №2165501 
>>2165497
FIFO?
Аноним 24/09/21 Птн 11:16:23 #4 №2165553 
Си говно говна, хуже чем си вряд ли что-то есть.
С++ уже почти нормальный язык, за некоторыми исключениями оставшимися от наследия си.
Rust нормальный язык, вполне годный для замены первого говна.

Единственный вопрос треда - Нахуя вы продолжаете жрать говно?
Аноним 24/09/21 Птн 11:48:40 #5 №2165581 
>>2165553
А почему ты считаешь что всем одинаково не нравится жрать дерьмо? На вкус и цвет как бы.
Аноним 24/09/21 Птн 15:30:10 #6 №2165786 
>>2165553
Си лучший из лучших, прошло 40 лет, но лучше си врядли что-то появится.
С++ уже почти нормальный язык, за некоторыми исключениеми добавлеными поверх си
Rust самый конченый язык, создан СЖВ скамом, чтобы выебать программиста в жопу своим борроу чекером и конченым синтаксисом, чтобы пополнить ряды пидорасов.

Единственный вопрос треда - почему мы тут все такие пиздатые?
Аноним 24/09/21 Птн 15:42:36 #7 №2165792 
>>2165786
Глянь проекты трансух и фурриебов, обнаружишь, что почти все они железнячники и пишут на си. Про трансух на cppcon все знают. На расте же пишут белые цисгендерные мужчины. Даже на rust survey были диаграммы, в которых 90% растоманов не относили себя к меньшинствам.
Аноним 24/09/21 Птн 15:43:13 #8 №2165793 DELETED
>>2165786
>Rust самый конченый язык, создан СЖВ
Джвачую, как узнал какие педики его делали, так все желание ознакомится пропало.
Аноним 24/09/21 Птн 16:32:10 #9 №2165835 
>>2165792
> Глянь проекты трансух и фурриебов, обнаружишь, что почти все они железнячники и пишут на си
так раньше было, да пидоры писали на С, как и все, ничего плохого в этом не вижу. Но вскоре времена поменялись, пидоры фемки и вские другие залупские меньшинства начали вещать свои извращеные идеи громче всех, эмулируя своим ором массовую поддержку (на самом деле их как было 1% так и осталось). Это сказалось на многие вещи, БЛМ, поблажки неграм и пидорам почти во всех сферах, также и в программистской среде это тоже случилось (пример - замены master slave). Из-за общего тренда (а не из-за своих личностных качеств) эти никчемные фемки и пидоры дорвались до власти, и смогли навязать что надо написать свой раст. Т. к. идея его создания высосана из пальца, а истинная причина - (они даже это во всех статьях так и пишут) убить детище белых гетеросексуальных мужчин (с с++), то новый язык получился как и собственно идея его создания - КУСКОМ ГОВНА.
> Даже на rust survey были диаграммы, в которых 90% растоманов не относили себя к меньшинствам.
ага, спасибо что посчитал по головам тупых ебланов. Будет новый тренд ебать своих мамок - увидишь теже лица
Аноним 24/09/21 Птн 16:38:56 #10 №2165841 
>>2165553
>Си говно говна, хуже чем си вряд ли что-то есть.
Си это такой высокоуровневый ассемблер. Например, когда я пишу на Си, я знаю какой машинный код сгенерит компилятор.
Си++ это (Си + синтаксический сахар). Почти всегда я тоже знаю что сгенерирует компилятор. Но только почти.

Аноним 24/09/21 Птн 17:18:32 #11 №2165865 
>>2165841
Во-первых, это слова Линуса Торвальдса. Во-вторых, давай будем честны друг с другом, ты ничего такого низкоуровневого не пишешь, чтобы знать какой там ассемблер будет сгенерирован.

Смысл высокоуровневых языков, в том, чтобы во-первых, разработка конечного продукта происходила быстрее, и во-вторых, чтобы в этом конечном продукте было меньше багов. Говносишка как ты и сказал это реально высокоуровневый ассемблер, где среднестатистическая макака наделает сотни багов с доступом к памяти, мемори ликов и если дело происходит в многопоточной среде кучу data race'ов. Я конечно понимаю что среднестатистическая макака считает себя ассом и думает что она не наделает ошибок, но как показывает статистика это далеко не так.

К тому же нормальный человек видит задачу и решает ее высокоуровневым методом, а говнари на си, будут 90% времени ублажать компилятор и процессор. А на выходе получат только баганное говно которое будет постоянно падать и жрать память из-за мемориликов.
Аноним 24/09/21 Птн 17:49:53 #12 №2165905 
Ребята подскажите что делать, если при компиляции такая ошибка возникает?

libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'

В интернете пишут, что типа делается не в консольном приложении и нет функции main. Проект не мой, но нужно скомпилировать. Если тупо засунуть в рандомный файл эту функцию - то, конечно, компилируется и получается экзешник но программа там не работает.
Аноним 24/09/21 Птн 19:04:02 #13 №2165986 
>>2165905
Обычно линкер отлично сам детектит, какая функция есть (main или WinMain), подсовывает соответствующий стартап, и все работает. Без исходников сложно понять, что ты делаешь не так, и что именно ты сломал. Попробуй -mconsole сказать.

>>2165865
> нормальный человек видит задачу и решает ее высокоуровневым методом
Он на 100% не знает, что там внутри высокоуровневого метода, документация почти никогда четко не описывает контракт, и мы получаем что? Правильно, вот это твое
> сотни багов с доступом к памяти, мемори ликов и если дело происходит в многопоточной среде кучу data race'ов
Особенно последнее. И как он будет это решать? Отладить все эти мегатонны говна невозможно, поэтому он бездумно натыкает мьютексов, но ничего не изменится, все станет только хуже.

Плохой код на крестах писать гораздо проще, чем на сишке. А если заодно вспомнить, что кресты - это не один, а четыре разных языка (C с классамии и три основных стандарта), становится ясно, что лучше на крестах не писать вообще.
Аноним 24/09/21 Птн 20:01:32 #14 №2166051 
Есть некая функция (обработчик прерываний), которая в цикле обходит некий массив. Функция обобщённая и использоваться будет на нескольких устройствах с несколько разным набором элементов в этом массиве. В данным момент там просто static массив в том же файле, но хочется вынести оттуда.

Как лучше это сделать:
1. extern my_data_array
и инициализировать этот массив в файле, включённом только в нужном таргете
2. void register_data_array(_type d, size_t s) { my_data_array = d; my_data_size = s;}
и вызвать её во время старта, передав туда нужные данные (выбранные по какому-то принципу
3. Пойти вопреки гайдлайнам и вынести объявление и инициализацию этого static массива в другой .c файл (где уже и будет ветвление в зависимости от таргета) и просто сделать "#include my_data_array.c"?

(Код для мк stm32, но их тред умер.)
Аноним 24/09/21 Птн 20:10:13 #15 №2166056 
>>2166051
Минусы первых двух вариантов в том, что размер массива уже не известен на стадии компиляции и становится проблематичным создание второго массива того же размера, разве что опять же делать его extern или передавать в register_data_array. Уж не знаю, как этого можно избежать.
Аноним 24/09/21 Птн 20:14:40 #16 №2166063 
>>2165986
При чем тут С++. Я согласен, что на С++ нахуевертить по незнанию можно так же как и на Си а то еще хуже. Я говорю о высокоуровневых языках типа хаскеля, где проблемы решаются высокими абстракциями, без всяких там мутексов и прочей низкоуровневой хуйни. Где априори не может быть дата рейсов, сегфолтов и мемориликов.
Но даже если брать с++, то во-первых, мы не берем в расчет всяких джунов, а берем в расчет среднего мидла, которы уже умеет программировать на своем языке и знает где вставить мутекс и т.д. и если взять такого же среднего разработчика на си и дать им одну и ту же задачу, шанс того что на си будет больше багов намного больше и время которое он затратить реализуя какую-то сложную вещь на си написывая все с нуля начиная от примитивных дата стракчерс будет вообще не сопоставимо со временем которое потратит С++-Чэд, просто заинклюдя в свой проект буст и реша проблему в пару сотен строк.
Аноним 24/09/21 Птн 21:56:44 #17 №2166121 
>>2165553
>Си говно говна, хуже чем си вряд ли что-то есть.
>С++ уже почти нормальный язык, за некоторыми исключениями оставшимися от наследия си.
>Rust нормальный язык, вполне годный для замены первого говна.
На новой архитектуре/платформе компилятор и окружение раста не собирается без компилятора си и плюсов, вот и думай теперь.
Аноним 24/09/21 Птн 22:31:22 #18 №2166172 
>>2166121
И нахуя ты это высрал?
На новой архитектуре без реализации компилятора хоть какого-то языка нихуя не соберется. При чем тут си?
Аноним 24/09/21 Птн 22:39:42 #19 №2166180 
>>2166172
При том, что без него не работает раст, следовательно раст вторичен?
Аноним 25/09/21 Суб 01:16:56 #20 №2166354 
>>2166180
Хуйню не неси
Аноним 25/09/21 Суб 02:15:04 #21 №2166378 
>>2166056
> размер массива уже не известен на стадии компиляции
Есть еще четыре возможных решения:
- вместо register сделать функцию-геттер, которой будет видно определение, и она сможет возвращать и указатель, и массив (плюсы - не нужно заботиться о том, не забыли ли вызвать register при инициализации);
- создавать переменную с размером с помощью макроса и магии (вполне нлом, если стайлгайд осуждает макросы);
- положить массив в отдельную секцию и считать размер секции
(типичное решение в embedded, когда и компилятор тебе известен, и линкер ты контролируешь)
- ну и возможно стоит подумать о том, нужен ли тебе вообще размер - возможно, нуль-терминатор в конце тоже подойдет.
Я бы сделал register, раз уже известно, что код будет переиспользоваться. Тем более на STM32 писать подобное в традиции.

Примеры первых трех вариантов https://wandbox.org/permlink/qTi8ZGJFSNXYQkY4 (вкладка array.c в редакторе).
sageАноним 25/09/21 Суб 02:15:57 #22 №2166379 
>>2166378
>и указатель, и массив
и указатель, и размер
Аноним 25/09/21 Суб 05:02:33 #23 №2166412 
>>2166172
>И нахуя ты это высрал?
>При чем тут си?
При том, что где будет раст, там всегда будет Си и плюсы. А вот в обратную сторону это не работает. Тогда встает вопрос, нахрена он нужен и как он может заменить си, если сам без него не собирается?
Аноним 25/09/21 Суб 12:19:25 #24 №2166633 
>>2166412
Ты несёшь абсолютную хуйню. Ты походу вообще не врубаешься как работают бинарники в ос
Аноним 25/09/21 Суб 12:58:41 #25 №2166698 
image.png
>>2165865
>Во-первых, это слова Линуса Торвальдса.
Может быть. Но это, пожалуй, единственное в чём я разднлю его взгляды.

>Во-вторых, давай будем честны друг с другом, ты ничего такого низкоуровневого не пишешь, чтобы знать какой там ассемблер будет сгенерирован.
Если ты давно тут тусуешься, то наверно видишь вот такие скриншоты. 75% из них мои. С учётом того, что обычно я не использую плавающую запятую, а только целочисленную арифметику (данный скриншот исключение и проект не мой) то вполне хорошо представляю что сгенирует компилятор.


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

Аноним 25/09/21 Суб 13:22:21 #26 №2166723 
>>2166698
>Эти FPU инструкциии
Лол, а че sse не завезли?

>Если ты давно тут тусуешься,
Нет, я тут особо не тусуюсь и не знаю кто ты и что ты делаешь, я иногда забегаю засрать макак от нефиг делать.

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

>Если ты больше 20 лет пишешь на Си, то твои программы не будут падать и течь, потому что это всё пройденный этап.
Если ты больше 20 лет пишешь на си, то с тобой явно что-то не так, при чем сильно.
Аноним 25/09/21 Суб 13:35:57 #27 №2166736 
>>2166723
>Если ты больше 20 лет пишешь на си, то с тобой явно что-то не так, при чем сильно.
А кто тебе сказал что я пишу ТОЛЬКО на Си? Зарплату мне платят за C#. На сях и плюсах я пишу для души.
Аноним 25/09/21 Суб 14:02:35 #28 №2166763 
>>2166723
>Лол, а че sse не завезли?
Нахуя sse для последовательных вычислений?
Мимо
Аноним 25/09/21 Суб 15:12:53 #29 №2166797 
>>2166633
На давай, расскажи мне как ты будешь компилятор раста и прочее окружение портировать на новую архитектуру.
Аноним 25/09/21 Суб 16:03:25 #30 №2166817 
>>2166736
>C#
>На сях и плюсах я пишу для души.
Ясно, с этого и надо было начинать.

>>2166763
х87 сопроцессор уже лет как хуй знает сколько не используется даже для одинарных вычислений.
Попробуй дизасемблируй любую арифметическую функцию и увидишь там simd инструкции для одиночных скаляров.
Аноним 25/09/21 Суб 16:07:07 #31 №2166823 
>>2166797
Ты еблан. Даже объяснять тебе что-то лень. Иди учи матчасть. При чем здесь новая архитектура и си? Твой компилятор ( любого языка ) должен преобразовывать высокоуровневый код в машинные инструкции этой архитектуры и взаимодействовать с операционной системой через syscalls, в стандартных люнуксах за это отвечает glibc или аналоги, но никто не мешает тебе сделать тоже самое на другом языке. При чем здесь си еще раз?
Аноним 25/09/21 Суб 16:23:27 #32 №2166845 
изображение.png
Аноним 25/09/21 Суб 16:37:12 #33 №2166855 
>>2165466 (OP)
>Brian Kernighan, Dennis Ritchie "The C Programming Language":
Хотел бы совета насчёт перевода данной книги, какой самый лучший из всех ? В ориге не осилю, ибо слабо знаю английский.
sageАноним 25/09/21 Суб 18:47:26 #34 №2166978 
>>2166855
Есть переиздание 2017 года. Насколько я знаю, там все более-менее норм (кроме цены). Ну и в целом все переводы говно по определению.
Аноним 25/09/21 Суб 22:10:09 #35 №2167121 
>>2165865
>Во-первых, это слова Линуса Торвальдса
А можно пруф? Желательно ссылкой на английскую версию, на lkml.
Аноним 26/09/21 Вск 14:27:16 #36 №2167454 
Здравствуйте, я немного запутался в указателях, вот, к примеру у меня есть указатель ptr, для которого я выделяю 5 ячеек памяти: int ptr = calloc(5, sizeof(int)), можно и с malloc(5 sizeof (int)).
Правильно ли я понял, что если создать другой указатель pptr и присвоить ему ptr: int pptr = ptr, то я смогу делать все с указателем ptr через pptr, в том числе и free(pptr)=>очищу так же и ptr, т.к. все это ссылается на один адрес в памяти, это справедливо будет?
Аноним 26/09/21 Вск 18:09:17 #37 №2167696 
как же вы заебали со своим керниганом. самый наихуевейший учебник который я только видел
Аноним 26/09/21 Вск 18:28:53 #38 №2167712 
>>2167696
прочитал как Керриган.

Тут проблема есть.

printf("10.12 = %.15lf\n", 10.12);
printf("10.14 = %.15lf\n", 10.14);

Выдает ненужные числа после запятой. Это связано с байтами но я не вдупляю.
sageАноним 26/09/21 Вск 19:55:56 #39 №2167802 
>>2167712
Эти числа нельзя представить точно в виде суммы положительных и отрицательных двойки. Округляй или ограничивай количество цифр после запятой более вменяемым числом. Алсо, lf тебе не нужно, ты печатаешь дабл, это просто f, а long double это уже Lf.
sageАноним 26/09/21 Вск 19:56:38 #40 №2167804 
>>2167802
*степеней двойки
sageАноним 26/09/21 Вск 20:00:54 #41 №2167811 
>>2167454
На ptr твои манипуляции не повлияют, они влияют на объект, на который ссылается ptr. Просто после free объект удалится, но ptr не "очистится", оба указателя будут продолжать одинаково указывать на невалидный объект. Захочешь очистить - пиши NULL в каждый по отдельности.
Аноним 26/09/21 Вск 21:50:16 #42 №2167902 
>>2167811
Спасибо
Аноним 26/09/21 Вск 23:24:24 #43 №2167993 
Как компактно объявить массив, у которого первые n байт одинаковые, а оставшиеся k имеют свои значения?
Аноним 27/09/21 Пнд 00:06:18 #44 №2168023 
нахуй указатели нужны? я что не могу без них обойтись чтоли?
sageАноним 27/09/21 Пнд 04:06:52 #45 №2168133 
>>2168023
Нахуй нужны индексы в массиве? Я что, не могу без них обойтись чтоли? Указатели на обычных машинах - это индексы в массиве байтов под названием память.
Аноним 27/09/21 Пнд 13:10:14 #46 №2168319 
>>2168023
Подучи сосамблер, ты потом эти указатели в K&R даже не заметишь
Аноним 27/09/21 Пнд 23:26:23 #47 №2168732 
>>2168319
Проблема в том, что после ассемблера сложно понять, почему нельзя float x = 3.14f; printf("%08lx", ∗(uint32_t ∗)&x).
Аноним 28/09/21 Втр 10:38:26 #48 №2168901 
>>2168732
А кто сказал что нельзя? Может быть тебе надо на экран вывести адрес стека, на котором лежит переменная x.
Аноним 28/09/21 Втр 14:01:32 #49 №2169025 
>>2168732
А в чем тут собственно проблема?
Да, неизвестно какие байты ты получишь, на бульбуляторе с не IEEE-шным флоатом и/или little endian. Правда при условии что размер и выравнивание у типов одинаковое.
мимо из крестотреда
Аноним 28/09/21 Втр 15:09:28 #50 №2169103 
>>2168901
Ах блядь, там звёздочка. Пора очки менять.
sageАноним 28/09/21 Втр 18:51:15 #51 №2169332 
>>2169025
> А в чем тут собственно проблема?
strict aliasing. Стандарт не гарантирует возможность доступа по несовместимому указателю, а компиляторы этим пользуются. В таком простом коде, конечно, не сломается, но в каком-то другом - обязательно.

>>2168901
>>2169103
Тогда нужен каст не в uint32_t, а хотя бы в uintptr_t (а то сломается на 64 битах) или поменять формат на %p. И с этим после ассемблера тоже сложно смириться. Ты знаешь, что там лежит, а компилятор Си выделывается и не хочет.
Аноним 28/09/21 Втр 19:27:24 #52 №2169412 
>>2169332
> И с этим после ассемблера тоже сложно смириться.
Ой, да ладно. Я сначала Бейсик выучил, потом ассемблер, затем ассемблер другой архитектуры, затем паскаль, затем Си. На Си сложно было переходить, но ассемблер тут не при чём.
Аноним 29/09/21 Срд 21:42:06 #53 №2170308 
Сяп. Нужно убрать элайны в некоторых структурках. Есть возможность сделать такое без прагмы пак?
Аноним 29/09/21 Срд 22:54:49 #54 №2170364 
>>2169332
> И с этим после ассемблера тоже сложно смириться. Ты знаешь, что там лежит, а компилятор Си выделывается и не хочет.
Вот поэтому я и не осилил си. Слишком много букв а толку ноль.
Один хуй никакой совместимости в реальных проектах между архитектурами не существует, все равно нужно править и переписывать код при любой смене окружения. Что именно даёт си, что все так любят его,мне не ясно. А вот отнимает он очень порядошно.
Аноним 30/09/21 Чтв 03:47:23 #55 №2170445 
>>2169332
>strict aliasing.
Отключается параметром компилятора. В майкрософтовских компиляторах его нет вообще.
Аноним 30/09/21 Чтв 05:54:54 #56 №2170449 
>>2170364
>Что именно даёт си, что все так любят его,мне не ясно.
Замена?
Аноним 30/09/21 Чтв 09:33:25 #57 №2170501 
>>2170449
RUST!!!!!
Аноним 30/09/21 Чтв 10:29:29 #58 №2170543 
>>2170364
>Один хуй никакой совместимости в реальных проектах между архитектурами не существует
Сморя чего пишешь, если GUI, то не существует. в остальном хватает #ifdef

Ну и как бы выносишь интерфейсные части в отдельную сущность, а логика платформонезависима. Для многопоточности пишешь свой враппер. И проблема совместимости исчезает.

По сути есть лишь две платформы Windows и Posix-like.

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

sageАноним 30/09/21 Чтв 21:30:09 #59 №2171063 
>>2170543
> По сути есть лишь две платформы
"Две" платформы - только для хелловорлдов (даже для хелловорлдов уже две).

На самом деле есть x86/ARM (там уже куча вариантов, у кого какие интринсики есть, какие требования к выравниванию и прочая подобная хуйня). Кроме того, даже процессорных архитектур у тебя все равно сильно больше: как минимум, рано или поздно придется MIPS, RISC-V вон наступает. Плюс у всего этого есть разные разрядности. И ОС. И версии ОС. И разные версии либ.

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

> логика платформонезависима
Да, пока ты пишешь тормозное говно на жс.
Аноним 30/09/21 Чтв 21:53:29 #60 №2171080 
В плюсотреде рекомендовали юзать возможности системы сборки вместо препроцессора для сборки под разные платформы.
Аноним 30/09/21 Чтв 21:54:18 #61 №2171081 
Даже в расте, вроде, так же, но конфиги для карго.
Аноним 30/09/21 Чтв 22:28:03 #62 №2171117 
>>2171080
cmake -DCMAKE_YOBA_ABC=1 -DCMAKE_HELL_KNOWS_WHAT=zzz -G "ХуйПоймиЧто". Ошибка! CMAKE_YOBA_ABC теперь надо писать как CMAKE_YOBA_DEF, и похуй, что во всех гайдах утверждается обратное. CMAKE_HELL_KNOWS_WHAT не поддерживается престарелой версией CMake. CMAKE_C_STANDARD=17, я такого не знаю, идите нахуй. И вообще компилятор не найден, зато вот у вас sh.exe есть, поэтому я собирать не буду.

Нет ни одной вменяемой системы сборки. Это как с лефтпадами в жс. Тебе их рекомендуют для не того, чтобы решать проблемы, а для того, чтобы у тех, кто рекомендует, была работа.
Аноним 01/10/21 Птн 14:16:08 #63 №2171507 
>>2171063
>(даже для хелловорлдов уже две
Пиздёжь.
printf есть везде. За редчайшим исключением, типа прошивой для какой-то экзотической ёбы. Да то не факт, что его там нет, скорее всего будет через JTAG писать в терминал.

Аноним 01/10/21 Птн 14:45:16 #64 №2171531 
>>2171507
>через JTAG писать в терминал.
Было такое в MicroBlaze, надеюсь больше не будет.
Аноним 01/10/21 Птн 17:29:59 #65 №2171695 
Цишники блять, а ну быстро пояснили Питоногосподину почему чар залупа = "А" это H через %с в принтф, че это за хуйня? инбифор: Я знаю что А выводится через одинарные кавычки нормально, я спрашиваю какого хуя Н через двойные выводится
Аноним 01/10/21 Птн 17:56:12 #66 №2171698 
>>2171695
Потому что ты петухонер.
char zalupa = "A";
printf("%c\n",
zalupa);
Аноним 01/10/21 Птн 17:56:58 #67 №2171699 
>>2171698
блять, там ещё указатель стоит перед zalupa, на дваче не отображается, и в принтф перед zalupa разыменователь стоит
Аноним 01/10/21 Птн 18:03:42 #68 №2171700 
image.png
image.png
>>2171698
Ну и че ты скинул, оно тоже Н выдает. Для справки цлев, компилю через мсвц.
Аноним 01/10/21 Птн 18:07:12 #69 №2171701 
image.png
>>2171700
Я же тебе выше отписал, что там звёздочка должна быть, на дваче она не отображается
Аноним 01/10/21 Птн 18:07:24 #70 №2171702 
>>2171699
А лол, ну так на вопрос то ответь, какого хуя с двойными кавычками такие фокусы нужны, схуя они не эквивалентны одинарным для ситуации одного чара.
Аноним 01/10/21 Птн 18:08:19 #71 №2171703 
>>2171701
Я сначала скинул, потом обновил тредю
Аноним 01/10/21 Птн 18:09:40 #72 №2171704 
image.png
image.png
>>2171702
Потому что 2 кавычки это строка, а когда ты бля выводишь через %c ты выводишь СИМВОЛ, %c - char/charachter/символ
Вот тебе пример с %c и двойными кавычками и %s.
Аноним 01/10/21 Птн 18:14:46 #73 №2171707 
>>2171704
Это я понимаю, я не понимаю почему Н выводится без фокусов с указателями. Что вообще такое Н? Ну ок я дебс в чар строку запихнул и решил ее через %с вывести лулзов ради. Почему оно не кидает ошибку или первый символ строки, а кидает какой-то Н. В чем смысл?
Аноним 01/10/21 Птн 18:18:23 #74 №2171710 
>>2171707
Просто потому. я сделал такой же пример как и у тебя, у меня вывело j, не придавай этому большого значения
Аноним 01/10/21 Птн 18:28:29 #75 №2171716 
>>2171707
> Ну ок я дебс в чар строку запихнул
Это как?
В твоём примере zalupa это указатель на строку. Когда ты перед ним пишешь звёздочку, это разименовывание указателя называется, на выходе будет первый символ.

А у тебя 'A' кириллическая или латинская? Вероятно кириллическая, потому что другой ошибки быть там не может.
Аноним 01/10/21 Птн 19:47:25 #76 №2171772 
>>2171695
> быстро пояснили
> Питоногосподину
'a' - это ord(a), а "a" - это id("a").
Аноним 01/10/21 Птн 23:54:51 #77 №2171895 
>>2171772
Понял, пасиб
Аноним 02/10/21 Суб 15:16:34 #78 №2172203 
>>2165466 (OP)
> 2021
> GCC всё ещё не умеет в C11
Аноним 02/10/21 Суб 21:05:14 #79 №2172462 
>>2172203
Лолшто? Обновляться пробовал? он с2x умеет даже, хотя стандарт еще не вышел
Аноним 02/10/21 Суб 22:00:03 #80 №2172490 DELETED
>>2172203
>C11
нинужна
Аноним 03/10/21 Вск 01:22:47 #81 №2172551 
>>2166723
>Но я пришел к тому что си - это говно которое несет вред и по-хорошему его надо запретить вообще.
Можешь подробнее разложить, почему говно?
Аноним 03/10/21 Вск 02:53:45 #82 №2172572 
>>2172551
да он шизик, сбежал с соседнего треда по расту самоутвердиться
Аноним 03/10/21 Вск 12:16:31 #83 №2172676 
>>2165466 (OP)
Сап, нюфажеский вопрос. Есть алгебраическая функция, непрерывная, ф1. Есть функция, которая считает производную от этой функции, назовем ее ф2. Но вот есть функция, которой нужна и функция ф1 и функция взятия производной ф2, пусть будет ф3, например разложение в ряд или что-то еще. Как добавить ф2 в ф3 в качестве аргумента чтобы ничего не сломалось?
Аноним 03/10/21 Вск 23:07:05 #84 №2173151 
delo-raskryto.jpg
Кароче, посоны, передавать структуры напрямую без указателя - зашквар, в то время как на стэке выделять можно, всё пральна?
Аноним 03/10/21 Вск 23:51:08 #85 №2173166 
Как в определении переменной строго указать компилятору порядок байт?
Аноним 04/10/21 Пнд 00:07:24 #86 №2173175 
socyrno.png
>>2173166
Сам нашёл - https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html.
Заодно и ответ на >>2170308-вопрос тоже здесь
оказывается в дваче есть не все ответы
Аноним 04/10/21 Пнд 02:36:25 #87 №2173219 
>>2173151
Выделять на стеке можно (не забывая, что стек не резиновый), передавать мелкие тоже можно (например, чтобы наколхозить именованные аргументы), крупные/разнородные лучше передавать указателем.
Аноним 05/10/21 Втр 01:53:04 #88 №2174199 
>>2172676
Ты не в том треде интересуешься.
Тут нужен код.
А вообще гугли "указатель на функцию".
Его можно передавать как аргумент функции.
И чтобы не ебацца понапрасну, объяви его как typedef, инвче хуй голову сломает - получится нечитаемая конструкция, которую даже автор кода не поймёт.
А через typedef указателя на функцию получится вполне читаемое.
Аноним 06/10/21 Срд 00:25:50 #89 №2175027 
А в Си можно както тайпдефить 24-битный тип?
Аноним 06/10/21 Срд 03:58:15 #90 №2175113 
>>2175027
Нет. Можешь сделать typedef структуре из трех байтов, но арифметики к ней конечно не будет. Нативно 24 бита будет только там, где 24-битные инты. Старые dsp например.
Аноним 06/10/21 Срд 09:16:17 #91 №2175215 
>>2175027
Да, структура из трёх char'ов без packing'а.
Аноним 09/10/21 Суб 13:09:56 #92 №2178222 
Какие есть нетривиальные но хорошие способы изучения Си? Курсы может какие нибудь, бут кемпы там? Книги мне тяжко осиливать, а вот, например, туториалы хорошо заходят
Аноним 09/10/21 Суб 16:23:43 #93 №2178415 
>>2178222
> нетривиальные но хорошие способы изучения Си?
Напиши компилятор Си.
Аноним 09/10/21 Суб 20:55:53 #94 №2178730 
Что читать, чтобы научиться писать такой код, за который меня не будет чмырить линтер и фильтровать гитхаб?
Аноним 10/10/21 Вск 20:32:26 #95 №2179685 
>>2178730
man style
https://github.com/varnishcache/varnish-cache/blob/master/lib/libvarnish/vsa.c
Аноним 10/10/21 Вск 20:37:27 #96 №2179696 
>>2175027
typedef struct {
unsigned i:24;
} int24_s;
main(){
int24_s s;
s.i = 1u<<24;
printf("%x\n",s.i);
printf("%x\n",--s.i);
printf("%x\n",++s.i);
}
Аноним 10/10/21 Вск 20:48:23 #97 №2179705 
Тред, прошу о помощи.
Учусь в шараге, учат сям (точнее, гибриду сей и с++, так как препу не хочется учить нас сишному вводу-выводу).
Задание: решить методом хорд уравнение arctg(x)-0.5=0.
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
double f(double x) {
double y = atan(x) - 0.5;
return y;
}
double h(double a, double b, double d, double e) {
double c, dprog, eprog;
int i = 0;
while ((abs(f(b)-f(a))>e)&&(abs(b-a)>d)) {
c = a + fabs(f(a) / (f(b) - f(a))) (b - a);
if (f(a)
f(c)<0) a = c;
else b = c;
i++;
eprog = abs(f(b) - f(a));
dprog = abs(b - a);
}
cout << dprog << endl << flush;
cout << eprog << endl << flush;
cout << i << endl << flush;
return(c);
}
int main() {
double a1, b1, c1, d1, e1;
cin>>a1; cin>>b1; cin>>d1; cin>>e1;
if (f(b1) * f(a1) >= 0) {
cout << "ERROR";
return 1;
}
else {
c1 = h(a1, b1, d1, e1);
cout << c1 << endl << flush;
return 0;
};
}
При a1=-1, b1=1, d1=0.1, e1=0.1 работает нормально, но если задать иные значения - виснет. Если компилировать пошагово непонятно, что с ней - тоже виснет, как только переходит на вычисления.
Это у меня глюки на ноуте или у программы проблемы? Прошу о помощи.
Да, я знаю, что хуй и быдлокодер, но я только учусь
Аноним 10/10/21 Вск 20:49:52 #98 №2179709 
>>2179705
А ещё не могу в разметку двача.
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
double f(double x) {
double y = atan(x) - 0.5;
return y;
}
double h(double a, double b, double d, double e) {
double c, dprog, eprog;
int i = 0;
while ((abs(f(b)-f(a))>e)&&(abs(b-a)>d)) {
c = a + fabs(f(a) / (f(b) - f(a))) (b - a);
if (f(a)
f(c)<0) a = c;
else b = c;
i++;
eprog = abs(f(b) - f(a));
dprog = abs(b - a);
}
cout << dprog << endl << flush;
cout << eprog << endl << flush;
cout << i << endl << flush;
return(c);
}
int main() {
double a1, b1, c1, d1, e1;
cin>>a1; cin>>b1; cin>>d1; cin>>e1;
if (f(b1) * f(a1) >= 0) {
cout << "ERROR";
return 1;
}
else {
c1 = h(a1, b1, d1, e1);
cout << c1 << endl << flush;
return 0;
};
}
Аноним 11/10/21 Пнд 00:36:35 #99 №2179879 
>>2179705
> учат сям (точнее, гибриду сей и с++, так как препу не хочется учить нас сишному вводу-выводу).
вся суть снгшного образования
плюнь в лицо этому преподу от меня
Аноним 11/10/21 Пнд 01:44:50 #100 №2179908 
>>2179705
>виснет
Очевидно, что у тебя никогда не заканчивается цикл
>while ((abs(f(b)-f(a))>e)&&(abs(b-a)>d))

Так что напихай туда принтов да посмотри, чему равны твои f(b), f(a), abs(b-a).
Аноним 11/10/21 Пнд 02:47:05 #101 №2179916 
.png
Аноны, лень изучать новый язык, поэтому опишите вкратце, почему раст говно?
Аноним 11/10/21 Пнд 14:48:44 #102 №2180261 
Скажите, плез, как хранить аргументы при формировании строки.

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

Думаю, с с можеством аргументов поможет vsnprintf... Но как их накопить?
Аноним 11/10/21 Пнд 17:22:51 #103 №2180385 
>>2179916
Потому что не Си.
гыгы 11/10/21 Пнд 20:03:44 #104 №2180558 
>>2180261
Не надо мудрить. Деды просто используют динамическую типизацию:
if i_flag printf %d i;
if s_flag printf %s s;
Аноним 11/10/21 Пнд 20:06:56 #105 №2180560 
Снимок экрана от 2021-10-11 20-00-32.png
почему pb больше pa ? Почему не равны? Что я сравниваю?
Пробовал увеличить размер массива а[] тогда "pa" становится больше.... но не равны.
Аноним 11/10/21 Пнд 20:14:11 #106 №2180562 
>>2180560
Чел, ты сравниваешь адреса.
Это сравнение равносильно сравнению a и b (e.g. pa > pb <=> a > b)
Аноним 11/10/21 Пнд 20:21:40 #107 №2180566 
>>2180562
тогда посмотри пож-та на 24-ю строчку.
там вроде тоже адреса сравнивают? Эта строчка должна определить какая строка больше и укоротить её до размера destination.
Аноним 11/10/21 Пнд 20:22:20 #108 №2180567 
Снимок экрана от 2021-10-11 20-17-29.png
>>2180566
пикча тут
Аноним 11/10/21 Пнд 20:37:22 #109 №2180579 
>>2180567
Такие махинации возможны в пределах одного массива. Точно не помню, но стандартом гарантировано, элементы массива распололжены в памяти последовательно, поэтому адрес n-1 элемента меньше/больше это зависит от системы адреса n-го элемента на определённое число байт.
Аноним 11/10/21 Пнд 20:39:31 #110 №2180582 
>>2180560
Скомпиль с оптимизациями.
Аноним 11/10/21 Пнд 20:48:59 #111 №2180594 
>>2180579
>меньше/больше это зависит от системы
бля, обосрался. Стандарт гарантирует, что адрес меньше.
Аноним 11/10/21 Пнд 20:49:35 #112 №2180596 
>>2180579
>адрес n-1 элемента меньше/больше
меньше
>на определённое число байт
на sizeof элемента, если приводить к char #
Аноним 11/10/21 Пнд 21:04:17 #113 №2180621 
>>2180566
там же memmove написано. если адрес dst больше src, значения пишутся типа от конца, если нет, то к концу.
len может быть любым неотрицательным, но есть риск записать больше и что-нибудь испортить.
Алсо, не ясно, что происходит при перекрытии адресов в ходе записи.
Аноним 11/10/21 Пнд 21:06:38 #114 №2180624 
>>2180621
>значения пишутся типа от конца, если нет, то к концу.
конца же два поэтому
В сторону уменьшения адресов, иначе в сторону возрастания.
Аноним 11/10/21 Пнд 21:20:38 #115 №2180639 
Чел с программой по хордам.
Оказывается, что в методичке неправильно указан метод хорд, потому программа и улетает в цикл. Заебись/10.
Аноним 11/10/21 Пнд 22:55:45 #116 №2180732 
как разбить массив uint8_t на массив по 6 бит? т.е. как из 8-битного массива брать по 6 бит по очереди?
Аноним 12/10/21 Втр 01:26:39 #117 №2180829 DELETED
>>2180732
Битовой маской
Аноним 12/10/21 Втр 04:44:58 #118 №2180871 
>>2180261
Bump.
Аноним 12/10/21 Втр 05:37:12 #119 №2180874 
>>2180871
stdarg
Аноним 12/10/21 Втр 08:53:26 #120 №2180897 
Аноны, привет.
В си есть какой-то быстрый метод перевода числа из любой системы (условно n), в десятичную? Интересно как это тут работает
Аноним 12/10/21 Втр 08:58:40 #121 №2180899 
>>2180897
long n;
scanf("%ld",&n);
printf("%ld", strtol(n, NULL, 16));
Аноним 12/10/21 Втр 09:06:19 #122 №2180903 
>>2180899
Как это скомпилировать? Ошибку выдает
Аноним 12/10/21 Втр 09:27:06 #123 №2180925 
>>2180899
Спасибо, отличная идея. Написал прогу по твоей наводке, но немного изменил.

n - так получал:
fgets(n, 30, stdin);
Аноним 14/10/21 Чтв 13:08:43 #124 №2183331 
53421225.jpg
>>2165466 (OP)
Я из C# треда, но лучше спрошу тут, т.к. вопрос для байтолюбителей.
Есть два массива: int[] src и int[] dst (вместо int можете подставить что вы там любите, типа uint32_t).
Как мне скопировать произвольное количество битов, заданных позицией первого бита start_bit_index_in_src, количеством битов bit_count и позицией в которую начинаем копировать в получателе: start_bit_index_in_dst.
При этом, все прочие биты в массиве-получателе, должны остаться неизменными.
Я начал писать код, и он оказывается очень сложным. Приходится писать отдельную логику для первого элемента массива, для последнего и для внутренних. Приходится писать отдельную логику для случаев, когда смещение первого бита в первом элементе в src больше, чем в dst, для случае - когда меньше, и когда равно.
Вроде бы задача тривиальная казалась на первый взгляд, но что-то я закопался.

Есть одно очевидное решение в лоб, сделать метод для чтения и присваивания отдельного бита, типа bool get_bit(int[] arr, int offset) и void set_bit(int[] arr, int offset, bool value). Оно простое в реализации, но вероятно будет намного медленнее, чем если копировать целыми кусками int.
Аноним 14/10/21 Чтв 13:13:22 #125 №2183340 DELETED
>>2183331
>Как мне скопировать произвольное количество битов
Маской блять111
switch(bit_count)
...
case 3:
dst[5] = src[5] & 00000111
...

Ну ты понял
Аноним 14/10/21 Чтв 18:09:50 #126 №2183601 
>>2183331
В составе стандартной библиотеки armcc есть _membitcpybb() и сопутствующие, но это не является частью стандарта. Погугли, может кто-то запилил кастомную реализацию.
Аноним 14/10/21 Чтв 18:22:46 #127 №2183611 
>>2183331
Я делал на питоне частный случай, когда битовое поле помещается в целое. И то получилось громоздко.
Аноним 15/10/21 Птн 12:50:14 #128 №2184277 
>>2183331
> Приходится писать отдельную логику
Страшно-то как. Так же как и в реализациях memcpy: если хочешь быстрое блочное копирование, ты пишешь отдельную логику (читай: побитовое копирование или ебля со сдвигами и переменными-аккумуляторами) для невыровненной части данных в начале и в конце. Другого не дано.
Аноним 15/10/21 Птн 16:55:34 #129 №2184529 
>>2183601
>>2183611
>>2184277
Если кому интересно, вот такое решение получилось:
https://pastebin.com/Wh1KM5dN
Аноним 15/10/21 Птн 19:04:42 #130 №2184677 DELETED
>>2184529
Чет пизлец, похоже на код математика из Индии
Аноним 16/10/21 Суб 13:11:21 #131 №2185200 
>>2184677
Что бы ты сделал по-другому?
Аноним 16/10/21 Суб 13:36:01 #132 №2185218 DELETED
>>2185200
Все
Аноним 17/10/21 Вск 08:56:36 #133 №2185736 
14492277033450.png
Подскажите, плез, что получается при обработке server_cert_pem_end - server_cert_pem_start?

Объявление байто-хранилища:
extern const uint8_t server_cert_pem_start[] asm("_binary_mosq_serv_crt_start");
extern const uint8_t server_cert_pem_end[] asm("_binary_mosq_serv_crt_end");

Функция:
esp_tls_set_global_ca_store(server_cert_pem_start, server_cert_pem_end - server_cert_pem_start);

Что она принимает: https://github.com/espressif/esp-idf/blob/master/components/esp-tls/esp_tls.h#L578

Это тоже самое, что подсчитать кол-во символов в массиве?
Аноним 17/10/21 Вск 11:29:47 #134 №2185771 
>>2185736
Да, но в идеале надо ещё делить на размер элемента массива, если размер каждого элемента массива больше минимально адресуемой единицы памяти.
Аноним 17/10/21 Вск 12:32:12 #135 №2185799 
>>2185771
Ок, спасибо.
Аноним 19/10/21 Втр 11:28:00 #136 №2187417 
>>2184529
>int Δ =
Это же шутка?
Аноним 19/10/21 Втр 20:47:22 #137 №2187992 
7cNZbGzASyY.jpg
>>2187417
Нет, вот это - шутка
Аноним 20/10/21 Срд 10:44:47 #138 №2188348 
Ребяты, я пишу на многих языках, а с этим наверное надо в С++ тред, но тем не менее - молчать не могу.

Намедни приятель попросил меня поставить ребёнку Minecraft. Ох, какое же говно эта Java - на его ноуте один кадр в секунду. Вообще играть невозможно. Тогда я почти случайно нашёл Minetest - тот же Minecraft, переписанный на С++. И о чудо - графика работает плавно и ничего не тормозиит. Это я ещё не говорю о потреблении памяти, которую Java тупо жрёт как не в себя.

Более того, волею судьбы пришлось знакомиться со всемы модными кластерными технологиями. Заставили на работе. Это, простите, пиздец. Сотни мегабайт ОЗУ и терабайты бесполезных логов. Тысячи TCP соединений между модулями. Накладные расходы на поддержание инфраструктуры могут доходить до 30% а иногда даже и больше. Тот, кто пишет на Си (даже на С++), может понять мою боль.

Думаю, нам нужен мировой кризис, большой кризис, чтобы цены на память, оперативную и дисковую, подскочила до небес. Чтобы смыло всё говно, включая неразработчиков, пиздоменеджеров и ебаные "технологии". Чтобы остались лишь гуру, которые пишут маленькие быстрые надёжные программы.

Кажись выговорился. "Энерпрайз" - говно.
Аноним 20/10/21 Срд 10:57:41 #139 №2188360 
1399552739288o0sm1.png
>>2188348
>Minecraft
Ты просто дебил и нихуя не пони маешь.
Именно говноджава дала возможность
1) делать моды
2) несмотря на истеричную РРРРЯЯЯЯЯЯ сначала жирного пидора а потом и мелкомягких они все, конечно, утверждали что моды норм и совсем не бомбит - очень смешно выглядит это всё
То есть манякампф состоялся исключительно благодаря говняве.
Вот такой вот дерьмовый мир.
Убей себя.
Аноним 20/10/21 Срд 11:13:14 #140 №2188378 
>>2188360
>Убей себя.
Сначала тебя.
Аноним 20/10/21 Срд 11:16:16 #141 №2188382 
b5b32c8fab1f2a6df76b19b603984fc4.png
>>2188378
Благодарю.
Аноним 20/10/21 Срд 12:19:23 #142 №2188412 DELETED
>>2188348
>молчать не могу
Молчание - золото, Ява топчик, сам потихоньку в нее вкатываюсь.
Аноним 20/10/21 Срд 12:20:50 #143 №2188414 
изображение.png
>>2188412
Аноним 20/10/21 Срд 12:23:11 #144 №2188417 
>>2188412
Мертвый язык, а работа на ней то еще болото
да я пишу это в С треде
Аноним 20/10/21 Срд 12:26:48 #145 №2188419 
>>2188412
лучше сишарп
Аноним 20/10/21 Срд 13:33:05 #146 №2188491 DELETED
>>2188417
>>2188414
Если выбирать пердолинг с конпеляцией плюснявого кода и отлов эксепшенов в рантайме, то Ява это дар богов.
>>2188419
Не блох, но анально окуклен Микрософт, по этому не нужен.
Аноним 20/10/21 Срд 14:55:33 #147 №2188539 
>>2175027
Пока нет. Надо ждать С23.
>>2188348
Поставил бы просто оптифайн или аналог и не парился бы
Аноним 21/10/21 Чтв 02:44:58 #148 №2189177 
а че там в С23 пиздатое что-нибудь завезут? если кто знает, плиз краткий пересказ в студию. То лень искать читать эти спеки, я просто любитель хелоуворлды на си пописать не более.
Аноним 21/10/21 Чтв 10:11:59 #149 №2189245 
>>2189177
Transactional memory (n1961), асинхронщина на уровне языка (n2017). По мелочи - атрибуты функций теперь будут в стандарте, а не расширением GCC, неименованные параметры функций, decimal типы.
Аноним 21/10/21 Чтв 21:07:22 #150 №2189826 
Почему в КиР ничегошеньки о функциональных поинтерах?
Аноним 21/10/21 Чтв 22:36:27 #151 №2189873 
>>2189826
Потому что k&r вышла за двадцать лет до первого стандарта, в котором были функциональные поинтеры.
Аноним 22/10/21 Птн 09:26:53 #152 №2190109 
Тред по крестам тонет в бамплимите, поэтому спрошу тут.
Я правильно понимаю, что если начну учить кресты, то фактически смогу кодить и на обычной сишке и учебники непосредственно по Pure C НИНУЖНЫ, или это осталось давно в прошлом и после плюсов, если захочу пощупать просто Си, придется листать учебники по нему?
Аноним 22/10/21 Птн 12:30:22 #153 №2190212 
>>2190109
Это разные языки с разными паттернами, все

Учебники наверное не так важны как просто код на гитхабе читать, чтобы видеть как идиоматичный код на обоих языках пишется
Аноним 22/10/21 Птн 13:51:54 #154 №2190267 
image.png
>>2190109
С++ слишком высокоуровневый. Вопреки сложившемуся мнению, что Си мешает учить С++ (а он действительно мешает), ты не сможешь оптимально писать на С++, не зная Си.

Смотри на приложенную картинку. Если извратиться, то на С++ можно писать без указателей. И новички неосознанно это делают. Много костылей налепишь, прежде чем поймёшь как это работает.

Короче, если хочешь стать крутым системным программистом, то учи в следующем порядке:

1. Ассемблер(ы)
2. Современный Си.
3. Классы С++
4. Использование шаблонов С++

И если очень хочется, но не обязательно, то

5. Написание шаблонов С++.

Или иди традиационным сценарием вкатывальщика - учи использование шаблонов и класссы. Но тогда С++ нахуй не нужен, если не понимаешь чего тебе генерирует компилятор. Тогда это ничем не будет отличаться от знания других языков. Будешь, условно, говнокодить и формашлёпствовать.

p.s. Переход с Си на С++ тяжёл, но зато в результате ты сможешь оптимально писать на С++.


Аноним 22/10/21 Птн 22:18:35 #155 №2190811 
>>2190267
>1. Ассемблер(ы)
Двачую. А то вырастают люди, не знающие нюансов сдвига отрицательных чисел.
>2. Современный Си.
А с какого года начинается современный и чем плох C89?
Аноним 22/10/21 Птн 23:02:01 #156 №2190883 
>>2190811
С 99, как минимум. C89 - архаика, деревянные игрушки к полу прибитые.
Аноним 23/10/21 Суб 08:54:13 #157 №2191188 
>>2190267
Спасибо.
И еще вопрос: нахуя так много учебников? Касается как просто C, так и C++.
Видел, как люди успешно вкатывались в язык после одной-двух книг, но также видел мнение, что без чтения минимум 10 штук ты хеллоуворлдщик.
Например, если у C я решу пройти K & R и, возможно, Прату после него, то что я потеряю если не буду читать остальные книги из шапки?
То же самое с крестами - неужели Липпмана, Праты и Шилдта будет недостаточно? Опять мнения разделились и кто-то говорит, что после одного только Страуструпа для ньюфагов успешно работали над сложными проектами и вообще стали профессионалами в языке, а кто-то говорит, что это только примитивная база, которой недостаточно, и нужно еще штук 20 книжек прорешать.
Аноним 23/10/21 Суб 11:07:51 #158 №2191241 
>>2187992
Почему в конце нет endl? Я что, как долбоеб, должен смотреть на
апельсинарбузвишняклубникаананаспомидорanon@pc123:~/codefrom2ch$ _
?
Алсо, нахуя false через функцию возвращать, и вообще нахуя вот это вот с ифом? enum, кстати, вообще не используется.
Аноним 23/10/21 Суб 11:13:37 #159 №2191246 
>>2191188
И ещё вопрос: нахуя так много лекарств?
Видел, как люди успешно вылечивались после одного-двух, но также видел мнение, что без долгой терапии минимум 10 таблетками ты помрёшь.
Например, если я решу выпить кетопрофен и, возможно, азитромицин, то что я потеряю если не буду пить остальные таблетки из ЖНВЛП?
Аноним 23/10/21 Суб 11:25:39 #160 №2191260 
>>2191188
Идеальных книг не существует, анон, потому что у каждого свой бэкграунд, и могут быть как пробелы в знаниях, необходимых для усвоения нового материала, так и "лишние" знания из других источников, из-за которых некоторые главы книги будут скучными. А пишется книга не для тебя, не для меня, и даже не для ОПа, а для десятков тысяч студентов. У тебя никогда не было чувства, когда тебе кто-то что-то неравнодушно объясняет, что этот чел умнее любого хорошо продаваемого автора? А он всего-навсего лучше попадает в твои слабые места. С книгами же придется выбирать. Либо берешь хардкорное чтиво и активно гуглишь непонятное, либо берешь исчерпывающий томик на 1000 страниц и пропускаешь хорошо знакомое, бегло ознакамливаешься с частично знакомым и вдумчиво останавливаешься на качественно новом материале. А такое избыточное разнообразие естественно при свободном (да-да, "свободном") рынке. ИМХО, прям от корки до корки, как первоклассник, читать надо ровно до тех пор, пока не начнешь комфортно плавать в области, а там уже сам разберешься, где хороших практик подсмотреть, где про матчасть какой-то штуки полистать и т.д. и т.п.
Аноним 23/10/21 Суб 11:30:31 #161 №2191264 
>>2191188
Я >>2191260 другой анон, если что
Аноним 23/10/21 Суб 12:21:27 #162 №2191301 
image.png
>>2180732
Берешь и делоешь. Не тестировал.
Аноним 23/10/21 Суб 19:13:27 #163 №2191681 
>>2191241
Там еще и опечатка в 31 строчке.
Аноним 23/10/21 Суб 22:38:58 #164 №2191801 
Аноны, а что думаете о книгах/учебных пособиях издательства O'Reilly? Конкретно: Head First C: A Brain-Friendly Guide. Реддиторы её регулярно рекомендуют новичкам. Как для совсем ретарда, который ничего сложнее примитивных баш и питон-скриптов не писал - не лучше вариант, чем то, что в шапке?
Аноним 23/10/21 Суб 23:23:05 #165 №2191839 
>>2191801
> что думаете о книгах/учебных пособиях издательства O'Reilly
Хорошие.
> Конкретно: Head First
Хуйня.
Аноним 24/10/21 Вск 02:17:35 #166 №2191921 
>>2188491
>отлов эксепшенов
МК, нет эксепшенов - нечего отлавливать
Аноним 24/10/21 Вск 19:58:52 #167 №2192494 
>>2189177
Обещают завести лямбды и typeof. Может хоть теперь можно будет воспользоватся макросами нормально.
>>2190811
Тем что там по крайней мере завезли нормальные типы целочислиных с нормальным размером, restrict, анонимные структуры и юнионы, static assert. Есть ещё потоки, но они нигде из коробки не работают.
Аноним 24/10/21 Вск 20:17:23 #168 №2192500 
>>2191801
Можно с таким же успехом на сололерн курс по Си посмотреть.
Аноним 24/10/21 Вск 20:18:56 #169 №2192503 
>>2192494
>>2189245
>асинхронщина на уровне языка
>Обещают завести лямбды
наконец-то можно будет как на жаваскрипте писать, каааеф
Аноним 24/10/21 Вск 20:20:29 #170 №2192504 
>>2192494
>>2189245
неймспейсы лучше бы подвезли и интерфейсы
Аноним 25/10/21 Пнд 02:49:56 #171 №2192784 
>>2192494
>Лямбды и typeof
В принципе смотрю добавляют все то, что в gcc было сделано расширениями. И эти штуки не исключения. Можно сделать лямбды на базе gcc nested functions и typeof в си через расширение там тоже есть.
Аноним 25/10/21 Пнд 06:56:38 #172 №2192815 
>>2192784
Проблема в том что в gcc вложеные функции запилены через костыль который даёт немножко ебёт безопасность.
Аноним 25/10/21 Пнд 08:56:42 #173 №2192834 
>>2192815
Стандарт тоже можно реализовать как угодно криво.
Аноним 25/10/21 Пнд 11:08:20 #174 №2192903 DELETED
Господа, мир вашему дому, есть желающие попрактиковаться в сишке путём выпиливания донатов из этой говнины https://github.com/WyvernTKC/cpuminer-gr-avx2 ?
Я высрал было патчик: https://dpaste.com/G4XYWMVXV
но не учёл всяких хитрых проверок, в итоге хешрейт занижен.
Если что, я из раптореум-треда в цц.
https://2ch.hk/cc/res/744320.html.
Аноним 25/10/21 Пнд 14:46:21 #175 №2193134 
>>2166845
стивен прата норм учебник
Аноним 25/10/21 Пнд 17:43:41 #176 №2193282 
>>2192834
Дело в том что обычные вложеные функции требуют либо костыль, который отключает no execute бит, либо менять ABI. Ну или можно
а) никогда не брать адресс функции
б) не использовать в фунции адреса внешних функций
Лямбды какбы обходят это. Плюс анонимность лямбд полезна при написании макросов или когда надо отправить одну фунуцию в qsort. Вообще об этом можно почитать здесь https://medium.com/program-practical/blocks-procs-lambdas-oh-my-8c636a54757c
Аноним 25/10/21 Пнд 21:58:16 #177 №2193496 
image.png
image.png
image.png
братишки, почему при первом curl_easy_init все норм, но когда присваиваю к полю структуры получаю сегфолт?
Аноним 25/10/21 Пнд 22:05:00 #178 №2193503 
>>2193496
аа забейте, я супер еблан, я же к какой-то рандомной не инициализированной памяти что-то присваиваю
Аноним 25/10/21 Пнд 22:22:19 #179 №2193516 
Ребзя, посоветуйте студентоте учебник по си на русском. Желательно, чтобф подробно было
Аноним 26/10/21 Втр 00:00:12 #180 №2193587 
>>2193503
Быстро ты разобрался. Одобряю.
Аноним 26/10/21 Втр 07:26:45 #181 №2193657 
>>2193516
шапку глянь
Аноним 02/11/21 Втр 18:10:29 #182 №2200838 
Аноны, привет
Хочу подключиться к порту динамика и работь с ним как с потоком, то есть я посылаю какую-то частоту и она воспроизводится через динамик. Все это я бы хотел сделать используя язык Си на Windows, не подскажите как это сделать или можете скинуть литературу, статьи или другие формы источников, а то я пытался найти решение как на русском, так и на английском, но ничего не нашел, буду очень Вам благодарен.
Аноним 02/11/21 Втр 18:22:46 #183 №2200847 
>>2200838
winapi, документацию найти несложно.
Аноним 02/11/21 Втр 18:24:50 #184 №2200851 
>>2200847
Можешь, пожалуйста, точно сказать как именно это искать, чтобы именно хуйню не найти?
Аноним 02/11/21 Втр 19:36:48 #185 №2200933 
>>2200851
может за тебя ещё и код написать
Аноним 02/11/21 Втр 19:46:43 #186 №2200953 
>>2200838
Можно использовать http://sox.sourceforge.net/ И никакого winapi не потребуется, тупо в stdout писать отсчеты и всех делов то, проще некуда. Но это конечно смотря для чего тебе все это нужно.
Аноним 02/11/21 Втр 20:11:30 #187 №2201004 
>>2200851
Не ебу, что ты хочешь. Для винды есть wasapi, directsound, winapi, плюс сторонние либы.
Ты хочешь типа вывод на аудио перенаправить? Чтобы писать write(fd,buf,c)?
Аноним 02/11/21 Втр 23:53:55 #188 №2201241 
>>2201004
Да-да-да, анончик, именно это
Аноним 03/11/21 Срд 05:08:22 #189 №2201353 
>>2193496
Обращение к несуществуему участку пвмяти
Аноним 03/11/21 Срд 07:22:50 #190 №2201365 
>>2201241
Если так, то я тебе уже писал >>2200953 прямо так и работает.
Вот пример того как оно работает подобным образом https://www.reddit.com/r/RTLSDR/comments/4jt4uk/transfer_sdrsettings_to_rtl_fm_sox/
Аноним 03/11/21 Срд 08:04:21 #191 №2201372 
>>2201241
https://www.youtube.com/watch?v=uiW1D1Vc7IQ
Аноним 03/11/21 Срд 11:37:43 #192 №2201514 
Может кто сталкивался с vulkan.
Он я так понял написан на C99 и если его используешь, то уже, как я понял, нет смысла брать C89?
Аноним 03/11/21 Срд 12:04:31 #193 №2201554 
>>2201514
Лучше взять плюсы.
Аноним 03/11/21 Срд 12:28:34 #194 №2201587 
>>2201554
на плюсы проект переводить никто не будет, а вот повысить стандарт с 89, который сейчас используется, до 99 - это возможно. Поэтому и спрашиваю
Аноним 03/11/21 Срд 22:26:33 #195 №2202402 
>>2201554
Учусь в ВУЗ'е и я дегенерат, почти не шарю за языки, почему все так хвалят ООП и С++, если это говно лютое, говорят, что код легче писать, чем в структурном программировании, но типо все равно же если какую-то деталь меняешь/добавляет код переписывать нужно?
Аноним 03/11/21 Срд 22:27:55 #196 №2202404 
>>2202402
Сам очень люблю Си, как и многие, но, конечно, знаю где-то на 3%, все его охуенные фичи не знаю
Аноним 03/11/21 Срд 23:44:43 #197 №2202449 
>>2201514
В msvc поддержки c99 почти что нет, поэтому вулкан должен работать и с c89
>>2202402
Абстракции легче строить. Попробуй фп, там похожие ощущения, и не потому что не надо думать о модели памяти, а потому что абстракции строить и поддерживать проще и удобнее.
В низкоуровневых апи, как вулкан, много бойлерплейта, от которого можно частично избавиться с помощью абстракций.
>>2202404
Какие охуенные фичи? ub?
Аноним 04/11/21 Чтв 00:08:22 #198 №2202457 
>>2202449
> В msvc поддержки c99 почти что нет, поэтому вулкан должен работать и с c89
да в msvc уже давно C11 завезли
сейчас проверил покомпилить с vulkan, там все комменты в стиле C99 написаны, поэтому как минимум их придется тогда менять во всей либе, глубже пока не раскапывал
Аноним 04/11/21 Чтв 00:18:28 #199 №2202464 
>>2202449
Всех особенностей языка, ну, могу немного работать с паматью, но вот на потоках(если не считать работу с бинарками и текстовыми файлами) остановился.
Как кстати узнать свой уровень владения языка?
Аноним 04/11/21 Чтв 11:04:02 #200 №2202649 
>>2202457
Ну как давно, год назад, в самой последней версии студии. Это ж майкросовт, ёбаный рот.
Аноним 05/11/21 Птн 06:56:11 #201 №2203577 
15740954723560.jpg
Есть какой-нибудь калькулятор паттернов regxep в Сишечке?

После пистона, BRE - лютая агония.
Начинаю думать, что городить велосипед на основе функций из string.h - не такая уж и плохая идея.
Аноним 05/11/21 Птн 07:17:38 #202 №2203579 
>>2203577
pcre
Аноним 05/11/21 Птн 09:01:33 #203 №2203596 
>>2203577
Что ещё смешнее, в питоне весьма каличные регулярки.
Аноним 05/11/21 Птн 09:33:19 #204 №2203599 
>>2203596
По сравнению с чем, блядь?
Если с джаббой, то может быть.
Аноним 05/11/21 Птн 12:10:21 #205 №2203633 
>>2203599
с тем же растом, например
Аноним 05/11/21 Птн 12:50:11 #206 №2203653 
http://cmustdie.com/
Дано подробное объяснение, почему Си нужно закопать.
Аноним 05/11/21 Птн 12:52:59 #207 №2203654 
>>2203653
https://youtu.be/3pKL4YEa4_Y
Подробное объяснение от Александра Викторовича Григорина, почему Си будет актуален ещё лет 50, как минимум.
Аноним 05/11/21 Птн 14:07:47 #208 №2203709 
>>2203653
себя закопай петух
лучше си и асма ничего нет
а уж когда компы на кубитах попрут вот тут то петушки вы и соснёте
Аноним 05/11/21 Птн 17:40:49 #209 №2203862 
>>2203653


https://youtu.be/wJ81MZUlrDo
Аноним 06/11/21 Суб 14:41:09 #210 №2204526 
>>2203653
Вот ещё пара ссылок, уничтожающих Си:
http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
https://blog.regehr.org/archives/213
Аноним 06/11/21 Суб 17:40:30 #211 №2204663 
>>2204526
Почему уничтожающих? Наоборот, подробно расписывают один из самых крутых механизмов языка. Если ты его не осилил, это ещё не значит, что си "уничтожен".
Аноним 07/11/21 Вск 07:08:49 #212 №2205060 
Господа программисты помогите распутаться.

Датчик давления даёт 6 байт 0-FFFFFF надо убрать 3 разряда ни как не пойму на сколько нужно поделить

то есть ffffff = 16 777 215 а нужно получить 16777, сдвигать не могу это пердуина и она усрется сдвигать (ну или могу но все равно не знаю как)

тип long
Аноним 07/11/21 Вск 09:15:31 #213 №2205072 
>>2205060
>пердуина
Твоя дурина это AVR (а они далеко не все на AVR)?
>усрется сдвигать
Если у тебя AVR и ты загрузишь свои 6 байт в uint32_t, а потом сдвинешь на один бит вправо, то получится примерно вот такая последовательность команд:
lsr r1
ror r2
ror r3
ror r4
Номера регистров конечно могут быть другими. Каждая из этих команд выполняется за один такт. Ну и поскольку тебе нужно сдвинуть на три, то эта последовательность будет повторена три раза, может быть в цикле. Итого ну максимум тактов 20 в худшем случае, не считая загрузку-сохранение. Ахуеть как много! Да у тебя на загрузку одного байта из ОЗУ тратится три такта.
Аноним 07/11/21 Вск 09:40:04 #214 №2205075 
>>2205060
Не знаю почему ты решил что сдвиг это сложная операция, но разрешите доебаться.
Чтобы отбросить три десятичных разряда действовать нужно нихуя не сдвигом.
Аноним 07/11/21 Вск 09:55:03 #215 №2205079 
>>2205072
Спасибо, но я пошел другим путём я поделил на коэффициент и забил хуй

>>2205075
>нужно нихуя не сдвигом
ну так научи
Аноним 07/11/21 Вск 10:32:49 #216 №2205089 
>>2205079
Разделить на 1000, это ты правильно догадался.

Кстати я раньше думал что пердольщики микроконтроллеров это такие суровые байтоёбы, думающие шестнадцатеричными дампами. Но ардуино-тред и обсуждения на других форумах развеяли это заблуждение и чуть не погасили веру в человечество вообще. Теперь я просто задаюсь вопросом как у вас в принципе хоть что-то работает.
Аноним 07/11/21 Вск 11:11:38 #217 №2205100 
изображение.png
изображение.png
>>2205089
>1000
а ты не очень умный, я думал будет лучше
Аноним 07/11/21 Вск 11:14:23 #218 №2205101 
>>2205089
>как у вас в принципе хоть что-то работает
У меня отлично работает потому что я не программист
Аноним 07/11/21 Вск 12:31:53 #219 №2205136 
>>2203653
Ну и чтиво, конечно... Помню, как-то сам напоролся на strict aliasing с полями структуры и кастом в void, если не изменяет, и анон итт посоветовал мне не страдать хуйней, если не
>знаешь что делаешь и умеешь в -fstrict-aliasing
но я с самоуверенностью Даннинго-Крюгернутого продолжал пукать в ответ на критику UB. Теперь стыдно стало. Прости меня, двачик, за нехорошие слова.
Аноним 07/11/21 Вск 12:40:03 #220 №2205141 
image.png
Бля, это внатуре пиздец какой-то. Есть какой-то гарантированный набор флагов, который исключит всю эту хуету и заставит программу вести себя так, как я думаю?
Аноним 07/11/21 Вск 12:49:12 #221 №2205149 
image.png
Блядь, да вы ебанулись, идите нахуй с таким Си ебаным, воистину лучше уже вернуть совок и посмотреть, какой ЕГЯП (единый государственный язык программирования) сделали бы, чем такие приколы.
Аноним 07/11/21 Вск 18:47:54 #222 №2205445 
>>2203862
А при чем тут LISP?
Аноним 07/11/21 Вск 20:53:04 #223 №2205608 
>>2205149
Пиздец, на картинке сравниваются два указателя - один в сегменте данных, другой на стеке. Они по определению не могут быть рядом.
Аноним 07/11/21 Вск 20:58:33 #224 №2205615 
>>2205149
А здесь попробуй вычесть единицу, а не прибавить. Но никто тебе не гарантирует что указатели будут лежать рядом. Ебаный компилятор может их положить как угодно в стеке, как он сочтёт нужным.

А вычесть вместо прибавления потому что стек растёт в сторону уменьшнния адресов.
Аноним 08/11/21 Пнд 04:45:45 #225 №2206362 
>>2205100
Чел.. Ты разделил на 100016 т.е. на 409610. Оставить ссылку на википедию по системам счисления или сам найдешь?
Аноним 08/11/21 Пнд 21:22:40 #226 №2207236 
image
++
Аноним 09/11/21 Втр 00:41:04 #227 №2207367 
>>2207236
А в чем прикол? В том, что по наивному ожиданию результат будет 4 независимо от порядка выполнения первоочередных выражений с их сайд-эффектами? Сайд-эффект же, вроде, вообще не обязан выполняться до ближайшей запятой или точки с запятой?
Аноним 09/11/21 Втр 07:15:43 #228 №2207454 
нуб в треде.
а если malloc вызвать внутри функции и передать указатель на этот участок памяти из этой функции то будет ли эта память защищена от изменений или это UB?
Аноним 09/11/21 Втр 08:29:00 #229 №2207504 
>>2207454
https://stackoverflow.com/questions/2838038/c-programming-malloc-inside-another-function
Аноним 10/11/21 Срд 16:13:27 #230 №2208922 
Можно ли как-то с помощью макросов или иной магии сделать так, чтобы расширять enum из разных точек программы.

Например, есть изначально enum alpha { A = 0, B = 1}
и вот чтобы в какой-то точке программы вызвать какой-то магический макрос, чтобы оно уже было вида скажем enum alpha { A = 0, B = 1, C = 2}

Вроде как это технически нереализуемо, но может все же я что-то не учел.
Аноним 11/11/21 Чтв 04:06:33 #231 №2209322 
>>2205141
а нахуя использовать флаг который незнаешь что делает в функции с 1 принтф?
Аноним 13/11/21 Суб 19:14:16 #232 №2211447 
image
Почему третий принт выводит -1 если переменная беззнаковая?
Аноним 13/11/21 Суб 19:18:01 #233 №2211453 
>>2211447
Потому что %d
Аноним 13/11/21 Суб 19:51:20 #234 №2211508 
>>2211453
Это же просто формат вывода. Как он влияет на значение переменной?
Аноним 13/11/21 Суб 19:53:31 #235 №2211511 
>>2211447
>>2211453
Бля, я эбал эту сишку.
GCC с тем же кодом выводит обещанные 65535.
А MSVC выводит -1.
Аноним 13/11/21 Суб 19:59:02 #236 №2211517 
>>2211511
> MSVC
потому что этим лучше не пользоваться
для винды юзай MinGW-64
Аноним 13/11/21 Суб 20:03:09 #237 №2211525 
>>2211508
Они хранятся одинаково, но один бит для знака отрезается. Поэтому надо указывать, знаковое оно или беззнаковое.
Аноним 13/11/21 Суб 20:33:39 #238 №2211547 
>>2211525
Хм.. Звучит логично. Но почему тогда GCC и MSVC выдают разный результат?
Аноним 13/11/21 Суб 22:33:16 #239 №2211634 
>>2211547
Потому что разные реализации printf, очевидно же.
Ещё раз, всё, что делает msft - кал.
Аноним 14/11/21 Вск 06:47:06 #240 №2211784 
>>2211547
Потому что %d это знаковый формат, а пердоговно кривое как всегда, им лучше не пользоваться.
Аноним 15/11/21 Пнд 12:59:47 #241 №2212766 
c.png
Почему при некоторых значениях (вроде бы когда последний элемент выдает NULL, но тоже не всегда) делает print еще один раз?
Аноним 15/11/21 Пнд 14:06:11 #242 №2212888 
>>2212766
Функция getenv

#include <stdlib.h>
char getenv(const char name);

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

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

Если при вызове функции getenv() значение аргумента не совпадает ни с одним из данных в описании среды, возвращается нулевой указатель.
Пример

Предположим, что определенный компилятор поддерживает информацию среды относительно устройств, подключенных к системе, тогда следующий фрагмент возвращает указатель на список устройств:

char p
/
... (/
p = getevn("DEVICES");

Зависимые функции
system()
Аноним 15/11/21 Пнд 14:42:26 #243 №2212933 
>>2212766
Потому что твой цикл по vars - это типичное UB (пункт 6.5.6 C99, параграф 8), а после UB в программе может происходить всё, что угодно.
Аноним 15/11/21 Пнд 15:17:04 #244 №2212961 
>>2212933
но у меня C89
Аноним 15/11/21 Пнд 19:05:35 #245 №2213224 
>>2212961
Значит 3.3.6
Аноним 15/11/21 Пнд 19:50:14 #246 №2213260 
>>2213224
Спасибо, столько UB пока не получается удержать в голове и помнить
Аноним 15/11/21 Пнд 19:57:53 #247 №2213276 
>>2213260
Пожалуйста. Уж "не ходить за границы массива", мне кажется, можно как-то уже запомнить.
Аноним 15/11/21 Пнд 21:23:37 #248 №2213341 
>>2213276
Просто для меня не было очевидным где он тут выходит за его границу, поэтому и не понимал сначала. Еще раз спасибо
Аноним 16/11/21 Втр 21:06:35 #249 №2214228 
image.png
image.png
image.png
>>2165466 (OP)
Хочу считывать из stdin самый свежий символ. При этом после того как считал записываю null чтобы если пользователь ничего не нажал я в следующем вызове в ответ получил null и ждал пока он таки сделает ввод. Но оно почему-то не записывает null, или я читаю не самый свежий ? Помогите пжлст
Аноним 16/11/21 Втр 21:18:13 #250 №2214237 
screen.webm
>>2214228
Аноним 16/11/21 Втр 21:21:30 #251 №2214238 
>>2214228
С чего ты взял, что ты можешь писать в stdin?
Аноним 16/11/21 Втр 21:23:03 #252 №2214240 
>>2214238
в смысле с чего? А что не могу?
Аноним 16/11/21 Втр 21:30:11 #253 №2214244 
>>2214240
>>2214238
почитал интернеты. Походу действительно нельзя. Тогда буду сдвигать чтение на 1 влево и проверять совпадает ли текущий с предыдущим. Если не получится выйду на связь
Аноним 16/11/21 Втр 22:33:01 #254 №2214289 
image.png
>>2214244
Вот этот вариант работает. Пущу ее в отдельный тред и будет заебись
Аноним 17/11/21 Срд 00:28:30 #255 №2214375 
Аноны, привет. Месяц как вкатился в си (первый яп), но на указателях понял что нихуя не понимаю как работает компьютер и на решении банальных задач (codewars, etc.) не могу продвинуться дальше. Можете посоветовать чтиво по компьютерам в целом, или что сами паралелльно читаете си?
Аноним 17/11/21 Срд 01:10:13 #256 №2214399 
>>2214375
> но на указателях понял
А чего всех так пугают эти указатели? В свое время изучал си как первый яп по базовому курсу c++ от шилдта и все было ясно с первого раза. Может тебе лучше в python?
Аноним 17/11/21 Срд 10:54:17 #257 №2214556 
>>2214289
Мне нравится эта poopy brownтема. Как называется?
Аноним 17/11/21 Срд 11:57:52 #258 №2214654 
>>2214375
Ну вот у тебя есть ящик, в котором ты можешь хранить утюг. Сам утюг в этом ящике - это значение твоей переменной. А номер на ящике, чтобы ты его нашел из кучи других ящиков на полке - это и есть указатель.

>>2214399
> Может тебе лучше в python?
не советуй каку новичкам
Аноним 17/11/21 Срд 12:31:33 #259 №2214701 
image.png
>>2214654
>не советуй каку
пока молодые шутливые питонисты получают 300кк дата-сциентистом и ебут сочных зумерш-тестировщиц, сишники пердолятся в срачечку с говнолегаси на пару с петровичем из НИИ-ХУЯ
>>2214556
gruvbox-material
Аноним 17/11/21 Срд 17:56:03 #260 №2215182 
>>2214701
вот это у тебя фиксации))
Аноним 17/11/21 Срд 18:33:38 #261 №2215223 
image.png
>>2215182
есть такое, жизнь потрепала :)))
Аноним 17/11/21 Срд 19:01:28 #262 №2215251 
>>2214701
>пока молодые шутливые питонисты получают 300кк дата-сциентистом и ебут сочных зумерш-тестировщиц, сишники пердолятся в срачечку с говнолегаси на пару с петровичем из НИИ-ХУЯ
Пиздец, что ты с таким мышлением в Си-треде забыл, болезный? По твоей логике обычный васян или хач, которые по КД солевых шмар ебут - это высшая стадия человека и предел мечтаний.
Микроконтроллеры С stm cmsis Джорно 17/11/21 Срд 19:02:10 #263 №2215253 
Я учу embedded на си без hal на чистом cmsis посоветуйте
Аноним 17/11/21 Срд 19:05:27 #264 №2215255 
>>2215251
ну извините, ухожу обратно в /b деградировать
Аноним 17/11/21 Срд 23:54:17 #265 №2215517 
а вот если допустим объявлена в коде структура A
дальше по коду можно как-то макросами/директивами чекнуть объявления ли она?
типа:
#ifndef A
printf("NO");
#endif
Аноним 18/11/21 Чтв 00:09:30 #266 №2215525 
>>2215517
Нет, макросы раскрываются препроцессором, который кроме лексического анализа и некоторых преобразований ничего не делает

Но можешь оформить заголовочник подобным образом:
#ifndef STRUCT_A
#define STRUCT_A
struct A;
#endif
а потом уже в коде:
#ifndef STRUCT_A
printf("NO");
#endif
Аноним 18/11/21 Чтв 00:10:36 #267 №2215526 
>>2215253
>посоветуйте
Советую libopencm3
Аноним 18/11/21 Чтв 11:54:02 #268 №2215847 
>>2214701
Проеграл с кода.
Аноним 18/11/21 Чтв 12:23:15 #269 №2215881 
>>2215847
а что не так?
Аноним 18/11/21 Чтв 14:57:05 #270 №2216042 
>>2215881
Как там while прерывается?

мимо нуб
Аноним 18/11/21 Чтв 15:41:23 #271 №2216097 
>>2216042
а он и не должен, в начале мейне detach. Эта функция нужна до конца программы
Аноним 18/11/21 Чтв 18:13:47 #272 №2216267 
>>2215881
Нет смысла брать мутекс, который auto переменная.
Аноним 18/11/21 Чтв 18:23:35 #273 №2216290 
>>2216267
Подождите, mutex нужен чтобы определенный участок кода мог выполняться только из одного треда. Зачем мне статический объект mutex'a ?Я должен что-то с ним делать из другого?
Аноним 18/11/21 Чтв 18:24:35 #274 №2216291 
>>2216290
из другого треда?
фикс
Аноним 18/11/21 Чтв 18:31:04 #275 №2216297 
>>2216290
Проеграл опять. Читай литературу.
Аноним 18/11/21 Чтв 18:36:26 #276 №2216304 
>>2216297
Блять, ты тролишь что ли?На стековерфлоу пишут именно так. Если ты экспэрт то просвети тупого
Аноним 18/11/21 Чтв 18:40:53 #277 №2216314 
>>2216304
Ссылку давай - еще смеяться буду.
Аноним 18/11/21 Чтв 18:41:58 #278 №2216317 
>>2216314
https://stackoverflow.com/questions/34524/what-is-a-mutex
Аноним 18/11/21 Чтв 18:45:47 #279 №2216327 
>>2216317
Ну так он там static. Каждый поток увидит один и тот же экземпляр мутекса - и только так они смогут синхронизоваться (shared state).
Аноним 18/11/21 Чтв 18:51:43 #280 №2216338 
>>2216327
т.е ты хочешь сказать что auto mutex это бред т.к, если я запущу два треда на эту функцию, будет 2 отдельных не связанных между собой mutex'a. Ну ок, звучит логично, пойду поправлю
Аноним 20/11/21 Суб 03:09:42 #281 №2217577 
почему для билда програми обычно юзается мейк либо какая-то петушиная херна поверх мейк. почему нельзя тупо в башскрипте накидать билд скрипт который соберет проект?
Аноним 20/11/21 Суб 03:17:35 #282 №2217578 
>>2217577
можно
Аноним 20/11/21 Суб 03:54:47 #283 №2217584 
>>2217577
А потом ты в своём проекте из миллиона файлов поменяешь один .c-шник, и твой петушиный скрипт либо обосрётся и будет заново всё пересобирать, либо обосрётся и ничего не будет пересобирать, бинарник вот же он, готовый лежит.
Аноним 20/11/21 Суб 04:34:20 #284 №2217592 
>>2217584
ну да, в этом случае башскрипт делает сасай, чет я не подумал. Я просто хеллоуворлдщик, мб поэтому не подумал
Аноним 20/11/21 Суб 09:32:22 #285 №2217666 
>>2217577
> почему для билда програми обычно юзается мейк
потому что это стандарт такой по умолчанию, чтобы везде люди могли собрать его под любую ОС и чтобы синтаксис все знали
поэтому сейчас пишется только CMakeLists.txt, а все остальное уже само делается под нужную систему: хоть яблоки, хоть андроиды (да, они тоже уже на make как альтернативу перебрались)
Аноним 20/11/21 Суб 10:22:53 #286 №2217686 
>>2217577
На самом деле мейк могли написать на шелле, но проще это было сделать на С.
Аноним 21/11/21 Вск 03:44:22 #287 №2218407 
навернул тут control-flag и вспомнил про cppcheck. у меня и в прошлый раз была проблема с ним - он не видел хедеры в системе чтоли, не понял. так вот снова:

он скипает файлы натыкаясь на #error в #if отложенных на всякий случай.
This file is not analyzed. Cppcheck failed to extract a valid configuration. The tested configurations have these preprocessor errors:
я даже свежий скомпилировал - всем похуй или проблемы на самом деле нет (/решается)? но я вроде прочитал хелп.

может есть что-нибудь пободрее, но без платы шекелей? а контрол кстати плотный тул, ни одного фелзпозитив не словил ещё.
Аноним 21/11/21 Вск 03:55:56 #288 №2218408 
>>2218407
и как это обычно бывает, сходу решилось. не увидел что у этой ошибки есть тег, по которому можно заигнорить. я думал что это и не ошибка даже, к тому же в хелпе: Suppress a specific warning.

cppcheck -v --enable=all --suppress='noValidConfiguration' --force --std=c89 --std=c99 --std=posix --platform=unspecified > /tmp/cppcheck.log 2>&1
Аноним 21/11/21 Вск 06:53:16 #289 №2218428 
>>2218408
а не, он просто игнорирует вывод. чтож, придётся опять выкинуть.
Аноним 21/11/21 Вск 09:49:45 #290 №2218458 
cppcheck детектит лучше ПВХстудии?
Аноним 21/11/21 Вск 13:39:50 #291 №2218592 
>>2218458
Нет конечно.
Аноним 21/11/21 Вск 17:24:48 #292 №2218902 
>>2218428
потыкал ещё и похоже упёрся в то, что и прежде. например, у меня много проверок на случай если какого-то типа нет или он не того размера - #error. cppcheck не видит объявления необходимых, а подбирает как-то по особому сочетая, как если бы это были опции компиляции. нужно инклюдить хедеры, но от -I/usr/include/ -I/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/ , ему ещё больше сносит крышу (в частности от sdl). остаётся только точечно: --include=/usr/include/limits.h --include=/usr/include/assert.h --include=/usr/include/stdint.h --include=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/stddef.h. и то, это принудительный инклюд в каждый файл, что как-бы не очень хорошо. и конечно, встаёт вопрос: а нахуя мне всё это надо и к чему это приведёт?

cppcheck -v --enable=all --force --std=c89 --std=c99 --platform=unspecified \
--enable=warning,performance,portability,information,unusedFunction,missingInclude \
--include=/usr/include/limits.h --include=/usr/include/assert.h --include=/usr/include/stdint.h \
--include=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/stddef.h \
> /tmp/cppcheck.log 2>&1

>>2218458
не пробовал линтер жидов. откуда у сишника деньги?
Аноним 21/11/21 Вск 17:49:52 #293 №2218927 
>>2218902
> откуда у сишника деньги?
Чиво нет? В Корее тебе бы платилил весьма неплохо. В Южной.
Аноним 21/11/21 Вск 19:00:22 #294 №2219028 
Кстати, а что мешает в С ввести в каком-нибудь новом стандарте обобщенной программирование? Синтаксис там элементарный, ничего не ломается при этом, шлепается легко поверх старого кода.
Ну имеется ввиду не то, что там этот _Generic ввели, а хотя бы уровня слизанного с плюсов (или даже выше)
Аноним 21/11/21 Вск 19:15:06 #295 №2219040 
>>2219028
шаблоны можно(и делают) сделать через инклюд файла.
Аноним 21/11/21 Вск 19:31:44 #296 №2219043 
>>2219028
Что тебе не так с _Generic?
Аноним 21/11/21 Вск 20:15:35 #297 №2219083 
>>2219043
> Что тебе не так с _Generic?
например, нужно реализовать библиотеку для векторов, ну что-то аналог STL, сейчас есть вариант только накрутить это все через макросы в очень неудобном виде, что нужно в стороннем коде при использовании этой библиотеки для создания вектора своей структуры:
1) задекларировать такой вектор
2) объявить переменную для такого вектора
3) инициализировать вектор
и потом уже очень неудобно работать

ну теперь пробуем применить _Generic, как написать через него вектор произвольного типа с общим поведением? Допустим какие-то мы объявили в этой библиотеке, ну а пользователь в своем коде что должен делать?
Аноним 21/11/21 Вск 23:16:02 #298 №2219215 
>>2219083
Используем магию ##
Аноним 22/11/21 Пнд 00:22:21 #299 №2219238 
>>2219215
> Используем магию ##
ну это и был единственный, но очень кривой вариант, для написания подобной либы у нас, но чтобы оно работало через синтаксис макросов в этом виде - уж больно много ненужного хлама дополнительно генерится в асм выхлопе, поэтому и был такой крик душа, что когда уже..
деструктор бы еще, ну хоть defer может все же скоро завезут
Аноним 22/11/21 Пнд 01:46:51 #300 №2219280 
>>2219083
не знаю что там в stl (поэтому возможно пишу глупости), но вектор (геометрический) специфичная же штука. вот например у меня 16 бит на дробь и 16 на целое, как поможет то, что я его объявлю типом long? остальное же: списки, очереди - они не зависят от типа.
Аноним 22/11/21 Пнд 09:45:06 #301 №2219361 
Привет, аноны, пришел к вам за помощью. У меня имеется 300-350 бинарных файлов весом по 300мб каждый. Необходимо распарсить эти бинарники и записать в большую таблицу для дальнейших преобразований(с парсингом я офк справлюсь и сам), но вот с большими файлами я не работал. Если писать все данные в кучу, то у меня не хватит оперативы. Как изьебнуться и обьединить все 300 файлов в одну таблицу, при этом нагружая оперативку в разумных пределах?
Аноним 22/11/21 Пнд 09:57:40 #302 №2219364 
>>2219361
man 2 mmap
Аноним 22/11/21 Пнд 09:58:26 #303 №2219365 
>>2219361
Писать в буфер, из буфера в файл. Это же классическое решение.
Аноним 22/11/21 Пнд 10:12:53 #304 №2219372 
>>2219365
Ну вот смотри, например, у меня есть слой(таблица из 100 записей) и я их занесу в буфер. Допустим, что таких слоев в файле 10, которые я буду записывать в буфер по мере необходимости. Мне нужна возможность переключать эти слои в двух направлениях(представляю как реализовать), а как быть после простотра последнего слоя в файле? Тупо переключать файловый поток на следующий/предыдущий файл? Или же есть более трушное решение.

>>2219364
>nmap
Вот это уже выглядит ближе к теме, пойду курить маны.
Аноним 22/11/21 Пнд 10:27:15 #305 №2219383 
>>2219372
Сделай базу в любой субд (в том же mysql), загони туда свои данные, выгрузи в файл.
Аноним 22/11/21 Пнд 14:49:01 #306 №2219531 
>>2219383
Или так, да. SQLite попроще будет.
Аноним 22/11/21 Пнд 14:51:32 #307 №2219532 
>>2219531
Кстати sqlite на роботе пригодится или это чисто для хобби-проэктов?
Аноним 22/11/21 Пнд 14:55:26 #308 №2219534 
>>2219532
Пригодится, если у тебя не высоконагруженная имиджборда 10k соединений в наносекунду
Аноним 22/11/21 Пнд 21:32:42 #309 №2219892 
>>2219280
> не знаю что там в stl, но вектор (геометрический) специфичная же штука
да, речь шла про вектор как один из видов контейнеров (например, vector в C++)
Аноним 22/11/21 Пнд 21:46:14 #310 №2219900 
>>2219892
аа, вспомнил. memory pool типа
Аноним 23/11/21 Втр 11:22:39 #311 №2220226 
>>2219900
Нiт. Это динамический массив.
sageАноним 25/11/21 Чтв 21:48:27 #312 №2222398 
Тред умер.
Аноним 25/11/21 Чтв 23:17:13 #313 №2222461 
>>2222398
да здравствует тред
Аноним 26/11/21 Птн 02:39:22 #314 №2222526 
Как можно подключить библиотеку скаченную с гитхаба? Как скомпилировать чтобы всё заработало? На линуксе. У меня ubuntu. Я бы хотел скачать библиотеку GUI лёгкую, простую, и сделать простую программку, скомпилировать её под windows также.
Аноним 26/11/21 Птн 15:28:49 #315 №2222814 
>>2222526
Там всё пишут.
Аноним 26/11/21 Птн 16:12:21 #316 №2222840 
Знаю Си, кодирую пока что простые проги и алгоритмы изучаю. Собираюсь после уверенного знания Си перекатиться в кресты, алсо решаю задачки и т.п в общем применяю на практике алгоритмы. Вопрос господа: У меня аттестат среднего общего, везде требуют блять высшее и минимум год работы и неебические знания. Как найти работку чтобы набраться реального опыта? Мне пиздеть в резюме? Посоветуйте анончики что делать та.
Может написать какие нибудь проги в портфолио, или на гите искать работу? ДС2 23 годиков. Вообще хочу игры кодить, но есть желание в будущем системками заниматься.
Аноним 26/11/21 Птн 16:13:49 #317 №2222841 
Простите за ебанутый слог я сейчас в тяжелом положений. Если можете направить куда нибудь где объяснят как искать работу в любимой сфере деятельности буду признателен.
Я просто хочу сидеть и кодить сутками.
Аноним 26/11/21 Птн 16:20:15 #318 №2222844 
>>2222840
> Собираюсь после уверенного знания Си перекатиться в кресты
Так и учи кресты, это разные языки.
Аноним 26/11/21 Птн 16:26:03 #319 №2222849 
>>2222840
Слишком размыто ты написал. Какие задачи решаешь, какие алгоритмы изучаешь? В какую сторону планируешь развиваться? У меня ощущение, что ты фундаментальные вещи сейчас учишь, не более.
Неебические знания включают в себя, например, анализ сложности алгоритмов, всякий разный матан, короче, то, что учат в вузиках. В принципе, это можно и самому освоить, но будет сложно.
И да, пиши сразу на крестах, выучишь ооп, научишься всякие шаблоны проектирования делоть.
Аноним 26/11/21 Птн 16:30:08 #320 №2222852 
>>2222849
Именно так, база. Хочу поступать на физмат, но нужно работать. Алгоритмы очень базовые, а еще всякие ADT. Закончил Пратовский учебник и сейчас тонкости языка изучаю, а еще либу стандартную ну и дебагер. Алгоритмы по известной книжке пытаюсь писать сам на Си, на c-faq нашел много инфы, но вот практический опыт надо где-то брать.
Спасибо анонче, буду кресты изучать.
Аноним 26/11/21 Птн 16:50:19 #321 №2222872 
>>2222852
>физмат
Это если ты потом хочешь в машоб идти, речёрчами заниматься или еще что-нибудь матаноёмкое. Ну скажи, нах тебе, программисту, знать функциональный анализ или какие-нибудь сплайн-аппроксимации? Если пилить игры, то это пригодится для разработки движков, что весьма специфично при наличии тонн готовых. Если системное программирование - тебе нужны знания об архитектурах, ассемблерах и битоёбстве, что на физмате тоже не очень хорошо изучается. Тебе матан или ехать все-таки?
Аноним 26/11/21 Птн 17:43:59 #322 №2222906 
>>2222872
А на кого мне пойти учиться в вузе если я в геймдев пойду? Дико интересно было кодить симуляции с кружочками и платформеры. Какой нибудь software engineer? Посмотрю сегодня еще раз опции в МФТИ. В любом случае если в будущем будет интересно продолжить изучение матана, уже хотя бы будет понимание. Программировать дико интересно.
На данный момент у меня 9 классов в 23 годиков и в этом году хотел закончить школу экстерном, но материала оказалось много особенно по математике, в этом году собираюсь все догнать хотя бы до линейной алгебры и в следующем сдавать.
Аноним 29/11/21 Пнд 16:49:58 #323 №2225275 
Адекватна ли подобная практика, не нарушает какой-нибудь strict aliasing rule? Переданный в loop() указатель на user передаётся в handler(), и я пытаюсь через этот указатель структуру передать.
https://pastebin.com/PvKsrJY3
Аноним 29/11/21 Пнд 18:12:04 #324 №2225355 
кто шарит за драйверы в линукс? Пишу драйвер блочного устройства

Как зарегистрировать драйвер на шине в sysfs?
Как зарегистрировать устройство на шине в sysfs?
Реализовал ioctl интерфейс, как теперь обращаться к нему в запущенном драйвере? Отправлять команды?
Аноним 29/11/21 Пнд 19:15:47 #325 №2225406 
>>2165466 (OP)
Что сделать чтобы антивирус не пиздел на запуск кода в Code Blocks?
Аноним 29/11/21 Пнд 20:34:42 #326 №2225474 DELETED
>>2225406
>Code Blocks
Не использовать это говноподелие, поставь ВСКоде если ты без ИДЕ не можешь
Аноним 29/11/21 Пнд 21:09:49 #327 №2225495 
>>2225275
Контест передавай через войд звездочка, и будет тебе счасте (касты писать не надо, поведение определенное, код идиоматичен).
Аноним 29/11/21 Пнд 22:36:56 #328 №2225558 
>>2225495
Спасибо, всё работает как надо, правда компилятор ворчит на incompatible pointer type, потому что коллбэк должен принимать unsigned char звёздочка первым аргументом, a loop() - последним. По логике можно игнорировать, но напрягает немного.
Аноним 30/11/21 Втр 01:05:00 #329 №2225637 
Сильно ли плохо, если я в Си сделаю структуру с функциями в качестве мемберов, для некоего подобия "классов"? Ну, фактически прсто соединю функицю-обработчик и передаваемые ей данные в "стандартизированном" формате, для как бы интерфейса? Типа вот такого — https://ideone.com/GaxwyK ?
Аноним 30/11/21 Втр 01:12:10 #330 №2225642 DELETED
>>2225637
>для некоего подобия "классов"
Если ты мыслишь рамками ООП, так и пиши на С++
Аноним 30/11/21 Втр 05:54:17 #331 №2225706 
>>2225637
если тебе по задаче это требуется - нет не плохо
Аноним 30/11/21 Втр 12:36:26 #332 №2225904 
>>2225637
handle - дескриптор, handler - обработчик, а у тебя по смыслу наоборот. В остальном вполне нормальный подход.
Аноним 30/11/21 Втр 14:51:38 #333 №2225978 
.png
>>2165466 (OP)
Задаю тупые вопросы.
Правильно ли я понимаю, что если мы создаем типа динамический массив, потом переопределяем его размерность, то он может перезаписать информацию, которая могла уже быть записана по определенным адресам идущим после него, или же он переопределяет новый пул адресов и каким-то образом переносит массив?
Аноним 30/11/21 Втр 15:12:37 #334 №2225995 
>>2225978
>мы создаем типа динамический массив
>переопределяем его размерность
Нет такого в С.
Аноним 30/11/21 Втр 15:15:39 #335 №2225996 
.png
>>2225995
Я и написал типа.
Аноним 30/11/21 Втр 15:25:53 #336 №2226001 
>>2225996
realloc может тебе вернуть тот же вдрес, если в блоке достаточно места. Может вернуть любой другой с копированием.
Аноним 30/11/21 Втр 15:42:34 #337 №2226020 
>>2226001
Понял, спасеба.
Аноним 30/11/21 Втр 16:00:34 #338 №2226039 
>>2225642
Не, мне не столько ООП нужно, сколько просто возможность собрать несколько однообразных функций и данных в массив для итерации по нему в "общем" коде.

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

То есть, хочу избежать кучи ifdef'ов типа
>enable_wheel();
>#ifdef HAS_LIGHT_INDICATION
.>enable_light();
>#endif
>enable_sound();
Аноним 30/11/21 Втр 17:45:19 #339 №2226106 
>>2226039
Засунь ифдеф внутрь enable_light(). А компилятор потом повыкидывает пустые функции.
В твоем варианте ядру придется перезаписывать pc, сбрасывать конвеер и ждать, пока новые инструкции поступят на исполнительные блоки. Хотя если производительность не важна - то пох.
Аноним 30/11/21 Втр 20:45:01 #340 №2226230 
>>2226039
Всё правильно, анон. Ты почти придумал драйверы и дерево устройств.
Аноним 01/12/21 Срд 22:12:58 #341 №2227136 
Есть такая строчка в массиве
{ "faststart", "Run a second pass to put the index (moov atom) at the beginning of the file", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_FASTSTART}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },

Что в ней блять значит {.i64 = FF_MOV_FLAG_FASTSTART}? Это должно стандартное значение. В другом файле нашёл #define FF_MOV_FLAG_FASTSTART (1 << 7)
Сдвиг единицы на 7? Как такое возможно если параметр по умолчанию выключен? И что значит .i64? Почему к нему обращаются с точки?
Аноним 01/12/21 Срд 22:38:14 #342 №2227152 
>>2227136
>#define FF_MOV_FLAG_FASTSTART (1 << 7)
Это значит, что везде, где ты видишь FF_MOV_FLAG_FASTSTART на самом деле подразумевается (1<<7), т.е. 128.

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

>И что значит .i64? Почему к нему обращаются с точки?
Вероятно, там union, поэтому указывают, какому именно варианту значение дают. Типа вот так — https://ideone.com/z2loWI

Хотя можно и просто структуры инициализировать с именами мемберов, даже в любом порядке — https://ideone.com/GVMe42
Аноним 02/12/21 Чтв 13:31:08 #343 №2227432 
Мужики, а как free( ) узнает, сколько точно байтов надо освобождать?
Аноним 02/12/21 Чтв 14:09:41 #344 №2227478 
>>2227432
сколько ты запросил у менеджера динамической памяти, когда malloc вызывал
Аноним 02/12/21 Чтв 14:27:09 #345 №2227504 
>>2227432
У одних есть заголовок перед тем адресом, который тебе вернули.
У других есть таблица страниц, которая говорит, на какие равные куски разбита страница.
Аноним 02/12/21 Чтв 14:36:08 #346 №2227517 
siziy.png
Знатоки, внимание, вопрос!
Вот я создал массив на десять элементов, arr - это же получается указатель на 0 элемент. Так вот, почему в main тогда sizeof(arr) указывает 40 байт? Я понимаю, что это размер всех элементов внутри, но почему тогда в функции in sizeof(arr) равен 8? и там и там же указатель...
Аноним 02/12/21 Чтв 14:41:15 #347 №2227529 
>>2227517
Майн говорит, сколько он выделил под весь массив.
Аноним 02/12/21 Чтв 14:58:35 #348 №2227556 
>>2227517
в одном случае размер указателя, в другом случае размер массива.
Если не догоняешь, переименуй аргумент в ptr вместо arr.
Аноним 02/12/21 Чтв 22:24:25 #349 №2227893 
image.png
https://pastebin.com/ZGSwgY73
Что я упускаю? Мне нужно в определённой структуре хранить представление целого числа в форме последовательности байт, размер числа будет храниться в ней же. При этом при попытке преобразования происходят вот такие приколы.
Аноним 02/12/21 Чтв 22:36:57 #350 №2227900 DELETED
>>2227893
>представление целого числа в форме последовательности байт, размер числа будет храниться в ней же
Массив uchar + пердолинг с преобразованием
Аноним 02/12/21 Чтв 23:30:49 #351 №2227930 
>>2227893
Перед сдвигом uint8_t приведи его к типу uint64_t
На signed вообще забей - приводи его к unsigned. В твоём случае это роли не играет.
Твой код не учитывает big_endian и low_endian - при портировании на другие архитектуры получишь сюрпризы.

И вишенка на торте - раз ты забил хуй на endianness, то и циклы не нужны - достаточно поиграться с указателями и приведением к типу. Ещё и в 20 раз быстрее работать будет с тем же самым результатом.
Аноним 04/12/21 Суб 16:33:48 #352 №2229138 
>>2214701
Это vim? Расскажите как вкатится в vim?
Аноним 04/12/21 Суб 16:44:01 #353 №2229144 
>>2229138
Раскурить фолиант с пучеглазыми зверушками.
Аноним 04/12/21 Суб 17:49:02 #354 №2229183 
>>2229138
Пройди vimtutor, а потом иди пердолить плагины.
Аноним 04/12/21 Суб 21:10:38 #355 №2229344 
>>2229183
нахуй плагины
там только пару штук реально нужны
Аноним 04/12/21 Суб 22:41:52 #356 №2229407 
image.png
Где найти нормальную сортировку строк по цифрам, чтобы свой велосипед не писать? А то вот такая хуйня получается.
неофит
Аноним 05/12/21 Вск 01:07:15 #357 №2229507 
16195171483750.png
>>2229407
Погугли да скопируй эти 10 строчек со стековерфлоу.
Ебать, в С-треде уже сравнение строк велосипедом называют. Что дальше, пикрил?
Аноним 05/12/21 Вск 09:58:32 #358 №2229603 
>>2229507
>пикрил
Да, как-то делал на нодежс одну прогу впервый раз, и надо было получить текст из клипборда. Вместо того, чтобы вызвать нативную функцию винапи за микросекунду, эти уроды выложили в этот говностор приблуду, запускающую павершелл, потом в нем команду и берущую её результат. Еще бы блять вставили компиляцию винды из исходников сначала, что размениваться на мелочи.
Аноним 05/12/21 Вск 10:49:04 #359 №2229631 
>>2229507
!== нет такого оператора
Аноним 05/12/21 Вск 11:37:27 #360 №2229645 
>>2165466 (OP)
Возможно ли перекатиться в США/Европу/Китай, будучи Embedded-программистом? Я понял, что эта тема - наиболее интересная для меня из всего айти, к тому же, когда я только начинал заниматься программированием, я уже знал, что кодить можно под микроволновки/чайники/переносные устройства, и хотел заняться чем-то подобным.
Аноним 05/12/21 Вск 19:59:31 #361 №2230222 
Чем книга Ритчи и Кернигана лучше Подбельского и Фомина?
Аноним 05/12/21 Вск 22:15:50 #362 №2230290 
>>2229631
поищи получше
Аноним 06/12/21 Пнд 11:17:18 #363 №2230656 
>>2220226
чёт я так это поварил в закромах. а нахрена тебе динамический массив? берёшь мемори пул + список, делаешь обёртку:
struct v {
size_t tsize, toffset;
list_head hl;
memory_pool hp;
};

дальше понятно.
Аноним 06/12/21 Пнд 11:18:27 #364 №2230658 
>>2230656
>>2220226
а и, почему вспомнил. как тебе https://sourceforge.net/projects/tstl2cl/files/tstl2cl/
Аноним 06/12/21 Пнд 16:26:18 #365 №2230977 
>>2230222
это как сравнивать вологодское масло и маспо из пятерочки
Аноним 06/12/21 Пнд 16:35:34 #366 №2230989 
>>2227893
такие вещи делаются через union вообще то..
неужели это настолько сакральные знания стали а я типо мамонта-дурачка который еще что то там бормочет для вкатывающихся школьников..
Аноним 06/12/21 Пнд 16:38:48 #367 №2230993 
>>2226039
лучше придерживайся правила "не обобщай до пяти"
то есть для каждого случая пиши новый код
а когда таких случаев будет больше пяти то уже пытайся выделить общий код
Аноним 06/12/21 Пнд 16:40:50 #368 №2230994 
>>2225637
все компонентное программирование (com, gtk, и десятки других библиотек) на этом и основывается
ты идешь по тропе протоптанной десятками тысяч программистов до тебя но тебе кажеться что это дикий первозданный мир

Аноним 06/12/21 Пнд 16:51:41 #369 №2231011 
>>2230989
нет, ты просто тупой, если делаешь это через union.

>>2227893
как-то вспомнился вопрос с рсдн лет десят назад: а зачем вы нижнее подчёркивание добавляете перед именами функций? - и я до сих пор не знаю, зачем это делают пользователи
Аноним 06/12/21 Пнд 17:03:51 #370 №2231024 
>>2225637
>>2230994
это просто современность испортила людей, подкладывая им в постель идеологов современных стилистик полового сношения. вот и приходится робко открывать для себя, что член структуры указатель на функцию - это не ооп.
Аноним 06/12/21 Пнд 17:06:54 #371 №2231028 
да я и сам после полугода плюсов и пересевши на c (заебался определять что чей метод), удивился, насколько всё просто и что совершенно не обязательно ебать себе мозги.
sageАноним 06/12/21 Пнд 20:43:25 #372 №2231175 
>>2231011
>нет, ты просто тупой, если делаешь это через union.
с хуя ли? если видишь что прогер работает с внутренним представлением чисел через смещения а не через объединения - это сразу признак низкой квалификации

Аноним 06/12/21 Пнд 22:43:43 #373 №2231291 
>>2165466 (OP)
> Очевидный GCC
Не могу разобраться какие флаги оптимизации следует использовать. Что юзает анон?
Аноним 06/12/21 Пнд 22:55:43 #374 №2231297 
>>2231291
>Что юзает анон?
Что ты там собрался оптимизировать?
-O2 вполне достаточно.
а затем strip
Аноним 07/12/21 Втр 05:36:54 #375 №2231397 
>>2231297
>-O2
дженту собираешь?
Аноним 07/12/21 Втр 08:51:35 #376 №2231412 
>>2231175
это мидл квалификация. юнион требует больше кода и ебли с головой - в стандарте, указатель может указывать на конец объекта, выравнивание.

но это всё в идеальном мире, где всё рационально, весь современные код как есть - это проблема переполнения знаковых таймеров времени - всем похуй.
Аноним 07/12/21 Втр 10:34:13 #377 №2231477 
>>2231297
А как же -O3, -Ofast, LTO, PGO, etc?
Аноним 07/12/21 Втр 12:52:06 #378 №2231574 
>>2231477
-O3 в некоторых случая может порождать более медленный код, поскольку всё что можно разворачивает и инлайнит, вследствии чего плохеет кэшам проца и может быть деградация производительности. Не обязательно это случится, но может быть. В зависимости от того, что именно ты компилируешь и как это написано. За остальные ключи ничего не скажу - у меня не было необходимости выжимать такты из кода. Предпочитаю поднимать скорость алгоритмами и стилем написания кода, это несложно, если ты понимаешь ассемблерный код, генерируемый компилятором.

Ну а ежели ты занимаешься "числодробильными" задачами, типа матмоделированием, то не пользуй gcc, а возьми компилятор от Intel - он заточены как раз под оптимизацию больших вычисленй.
Аноним 08/12/21 Срд 04:55:37 #379 №2232242 
>>2231574
ты на амд то не гони, у них тоже есть компилятор.

> матмоделированием
возбуди во мне животное чувство - расскажи что это такое.
Аноним 08/12/21 Срд 18:54:40 #380 №2232665 
CBerror2.png
CBerror1.png
>>2165466 (OP)
Приветствую всех присутствующих. Сейчас пишу курсовую по программированию. Gentoo, CodeBlocks, GCC.
После внезапного аварийного завершения работы компа во время редактирования кода (в компе нет батарейки, а шнур от зарядки такого говённого качества, что любое резкое движение может вырубить комп) программа вообще перестала компилироваться. Когда я в CodeBlocks нажимаю "собрать и запустить", выдаёт пикрилы.
Причём если я команд, указанные в логе, ввожу непосредственно в консоль - всё компилируется нормально. А если я то же самое делаю через кодблок - нихуя, файл .o почему-то не создаётся. Что делать?
Аноним 08/12/21 Срд 20:20:30 #381 №2232700 
>>2232665
Как бы сделал я - забил нахуй на этот codeblocks и шел бы в командную строку на виме писать
Аноним 08/12/21 Срд 20:26:16 #382 №2232705 
>>2232700
Дело в том, что у меня эта программа крайне криво работает, мне её дебажить нужно. А дебажить в консоли - мазохизм.
Аноним 08/12/21 Срд 21:26:09 #383 №2232737 
>>2232705
Дебажь printf'ами, чё ты как баба
Аноним 08/12/21 Срд 22:07:03 #384 №2232760 
>>2232665
make clean уже пробовал? Пересоздать проект и скопировать туда весь код?
Аноним 08/12/21 Срд 23:08:30 #385 №2232795 
>>2232705
Отладь в Visual Studio, что ты как маленький. Наверняка же у тебя консольная программа, которой похуй - Windows или Linux. За исключением маленьких нюансов.
Аноним 09/12/21 Чтв 08:19:26 #386 №2232888 
>>2232705
> А дебажить в консоли - мазохизм.
а как по другому? как вы получаете трейс? у вас есть кнопочка прописывает команду из 4х букв?
Аноним 09/12/21 Чтв 08:19:50 #387 №2232889 
>>2232888
которая*
Аноним 09/12/21 Чтв 08:28:38 #388 №2232896 
>>2232888
Из каких четырёх, две же - bt
Аноним 09/12/21 Чтв 08:54:09 #389 №2232905 
>>2232896
это условность, зачем ты начинаешь
Аноним 09/12/21 Чтв 15:57:17 #390 №2233217 
>>2232705
> А дебажить в консоли - мазохизм.
вот так потом и сидят на винде и на джаве программируют
Аноним 09/12/21 Чтв 17:11:24 #391 №2233263 
>>2233217
Не, ну реально же мазозизм. Особливо ежели юникод. А в VS мышку подвёл и всё на виду.
Аноним 10/12/21 Птн 00:29:11 #392 №2233637 
Анон, тяжело ли найти работу программистом микроконтроллеров?
Аноним 10/12/21 Птн 00:32:47 #393 №2233638 
Вопрос один:
Вот понял я как работают указатели в C, и отсюда возникает вопрос, как в более высокоуровневых языках где нет указателей, компитятор/интерпретатор понимает, где идет речь о значении, а где о адресе?
Вопрос два:
Была такая проблема: выделяю память динамически через malloc в программе, компилирую используя gcc i686 4.8.4, запускаю - все заебись.
Далее беру тот же код, компилирую через gcc x86_64 4.8.4 - компилируется нормально, запускаю, ввожу тот же тест и получаю Segmentation fault (если заменить динамическое выделение памяти на автоматическое, то ошибка пропадает), и так не только с одним тестом, а в целом скомпилированная одной и той же версией компилятора, но под разные платформы программа просто не работает нормально. Загуглив, что такое i868 я нихуя не понял, челы с stackovwerflow пишут, что это просто разновидность x86, зачем тогда существует отдельная версия gcc под нее? правильно я понимаю, что я могу и то, и то использовать на 64-х битной системе?
Аноним 10/12/21 Птн 00:46:14 #394 №2233645 DELETED
>>2233638
> а где о адресе
А там такого обычно нет. Есть на пример в Perl ссылки, но у них свой синтаксис
Аноним 10/12/21 Птн 08:11:25 #395 №2233702 
>>2233638
>компитятор/интерпретатор понимает, где идет речь о значении, а где о адресе?
ну там же есть понятие объекта и способов к нему обращаться.

> Вопрос два:
это не один вопрос.

> Далее беру тот же код, компилирую через gcc x86_64 4.8.4 - компилируется нормально, запускаю, ввожу тот же тест и получаю Segmentation fault
хз, может ты это делаешь на 32хбитно системе.

> что это просто разновидность x86, зачем тогда существует отдельная версия gcc под нее?
это не отдельная версия, а отдельный билд.

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

но это не точно всё.
Аноним 10/12/21 Птн 08:40:55 #396 №2233706 
>>2233637
Легко уехать в ЮВА, вплоть до Самсунга. В России тоже можно, но запралата будет ниже чем у "формошлёпов".
Аноним 10/12/21 Птн 13:19:13 #397 №2233883 
>>2233638
>компилируется нормально, запускаю, ввожу тот же тест и получаю Segmentation fault
Классическое описание undefined behaviour. Ищи, где объебался, ворнинги компилятора, ub sanitizer и valgrind в помощь.
Аноним 12/12/21 Вск 06:36:59 #398 №2235551 
братики, нужна хелпа. прохожу https://adventofcode.com/2021/day/11
вот мой код
https://pastebin.com/yGkDBY8x

скармливаю любой пример из задания. например:
11111
19991
19191
19991
11111
то на 6 степе валится сегфолт.
если дебажить то на выходе из функции octos_next_step дебагер ругается
> Cannot find bounds of current function
я так понимаю стек закораптился, но я не понимаю почему.
У меня там рекурсия, но поидее это не должно влиять, там не так уже и много вызовов рекурсивных должно быть.

Аноним 12/12/21 Вск 08:50:29 #399 №2235569 
>>2235551
>if (0 < nrow < octos->rows && 0 < ncol < octos->cols)
Что по-твоему тут написано?
Аноним 12/12/21 Вск 10:03:52 #400 №2235590 
>int main(int argc, char* argv[argc+1])
Взвизгнул.

Автор, чому ты намешал все фишечки С11, не усвоив БАЗУ из книжки K&R?
Аноним 12/12/21 Вск 10:40:17 #401 №2235605 
>>2230977
>вологодское масло и маспо из пятерочки
И где какое?
Аноним 12/12/21 Вск 15:13:33 #402 №2235764 
>>2235569
бляааадь, а с чего я взял что так можно писать?
кажется фляга уже совсем свистит. Пожалуй сегоня без компа проведу выходной.
Спасибо, братик. Я реально хз откуда я это высрал.
Ну дела, конечно.

>>2235590
> Взвизгнул.
а что, сильно все хуево кроме этой залупы 0<nrow<rows?

> Автор, чому ты намешал все фишечки С11, не усвоив БАЗУ из книжки K&R?
Я хз, я си еще давно в универе учил, тогда мне не зашло, на отъебись его тогда сдал.
Не так давно решил узнать, что в си нового, да и старое вспомнить.
И вот как-то так вкатился заново уже с новыми фишками языка. За K&R я как-то сел , но не вхатило терпения что-ли. В сотый раз читать про что такое тип, переменная, функция супер скучно.
Аноним 12/12/21 Вск 15:20:55 #403 №2235771 
>>2235551
>>2235764

блядь, код все равно не рабочий, не правильные ответы дает, кекв.
Аноним 12/12/21 Вск 21:29:12 #404 №2236068 
image.png
Почему когда я пытаюсь вывести число как строку ("%s"), компилятор выдаёт 3221225477?
Аноним 12/12/21 Вск 21:34:18 #405 №2236073 
>>2236068
undefined behavior
Аноним 12/12/21 Вск 21:47:45 #406 №2236095 
>>2236073
Удобно.
Аноним 12/12/21 Вск 21:55:32 #407 №2236103 
>>2236073
А нахуя там ub делать? поч не дать считать как с указателя и получить вылет? Буквально вместо падения приложения делают тихое игнорирование..
Аноним 12/12/21 Вск 22:03:04 #408 №2236115 
image.png
>>2236103
у меня вылетает
Аноним 12/12/21 Вск 22:35:03 #409 №2236148 
>>2236103
Что "делают", дубинелло? Если твое число как адрес случайно указывает в наличную память, оттуда что-то будет прочитано как строка. Если нет - вылетит.
Аноним 12/12/21 Вск 23:25:52 #410 №2236177 
>>2236148
ну так, то что ты написал - понятное мне поведение, а выше чел писал что это UB. Вообще я не подумал, наверн чтение мимо это тоже UB, тогда тут все очевидно. Я сначала решил, что там какой-то специальный случай UB для va_args, типо ожидет строку, а передает int, и компилятор хуйню придумает. В примере 1ого чела не вылетело, а у него число 5, какбы сомневаюсь что на 5 там можно читать ему.
Аноним 12/12/21 Вск 23:28:29 #411 №2236180 DELETED
>>2236115
Argv + 1
Чигобля?
Аноним 12/12/21 Вск 23:47:57 #412 №2236196 
>>2236180
Pattern matching на конструкторе натурального числа, ведь там не может быть zero.
Аноним 13/12/21 Пнд 00:03:22 #413 №2236203 
>>2236068
>Почему
Потому что иди в питон, дебил
Аноним 13/12/21 Пнд 00:07:45 #414 №2236205 DELETED
>>2236196
>Pattern matching на конструкторе натурального числа
atgv[argc + 1] <- это шта за пиздец? Какой нах патернмачинг?
Аноним 13/12/21 Пнд 00:12:34 #415 №2236208 DELETED
>>2236205
Ебать, ты еще там число как строку пытаешься вывести.
printf("%d\n", 5);
Пиши так и уебуй к питухонщикам
Аноним 13/12/21 Пнд 00:19:09 #416 №2236212 
>>2236208
Ты можешь пояснить нормально почему так происходит и как эта залупа внутри работает? Или больше чем на пук ты не способен?
Аноним 13/12/21 Пнд 00:26:21 #417 №2236214 DELETED
>>2236212
Просвещайся:
https://elixir.bootlin.com/glibc/latest/source/stdio-common/vfprintf-internal.c

Аноним 13/12/21 Пнд 00:32:48 #418 №2236217 
>>2236214
Чувак явно только вкатывается, а ты ему исходники кидаешь. Что ещё ожидать от харкачеров...
Аноним 13/12/21 Пнд 00:35:18 #419 №2236218 DELETED
>>2236217
>Чувак явно только вкатывается, а ты ему исходники кидаешь
> как эта залупа внутри работает?
Как он просил. Почему бы вкатуну не использовать праметры по назначению, а не подавать всякую хуйню.
Аноним 13/12/21 Пнд 00:36:58 #420 №2236220 
>>2236218
Пиздец ты тупой блядь.
Аноним 13/12/21 Пнд 00:40:48 #421 №2236221 DELETED
>>2236220
Уходи, глупец, тебе еще Си рано.
Аноним 13/12/21 Пнд 00:49:01 #422 №2236224 
>>2236205
>>2236208
спасибо)

>>2236212
предполагаю, что printf когда доходит до %s вызывает va_arg(args, const char*), и так как "If the type of the next argument in ap (after promotions) is not compatible with T, the behavior is undefined" (цитата с cppreference - C docs). Поэтому UB. Реально же (не по стандарту, но на обычном компе), va_arg тупо копирует со стека столько байт, сколько было бы, если бы там был указатель. На x64 у тебя скорее всего в int'e 4 байта и в указателе 8 - ты получишь указатель, который наполовину будет 5, наполовину - мусор со стека.
Аноним 13/12/21 Пнд 00:53:38 #423 №2236226 DELETED
>>2236224
>va_arg(args, const char*)
То есть указатель на чар тебя не смущает? Про литералы и строки уже читал?
Аноним 13/12/21 Пнд 01:07:49 #424 №2236232 
image.png
>>2236226
а? не понимаю твой текст. Я конешн на Си никогда не писал, но про указатели и литерал строковый знаю из плюсов. На пике cppreference (раздел про Си), пишет что ожидается указатель на char, какие вопросы?
Аноним 13/12/21 Пнд 02:19:31 #425 №2236262 
>>2236180
что не понятно тебе?
Аноним 13/12/21 Пнд 02:44:52 #426 №2236281 
В вашем си хоть текст можно нормально распарсить?
Аноним 13/12/21 Пнд 02:51:24 #427 №2236287 DELETED
>>2236281
Нет
Аноним 13/12/21 Пнд 04:26:55 #428 №2236304 
>>2236281
Конечные автоматы используй.
Аноним 13/12/21 Пнд 09:19:45 #429 №2236331 
image.png
Как на этом блядском языке нормально хендлить инпут пользователя? Пытаюсь написать консольный калькулятор и столкнулся со следующей ошибкой, когда я делаю scanf("%d",operation), то если пользователь введет, допустим, 1B, то в переменную operation считается 1 и scanf вернет 1 мол все ахуенно прошло, но у меня-то операция 1 а не 1B. Че делать подскажите вкатуну, с меня как обычно ниухя
Аноним 13/12/21 Пнд 11:46:06 #430 №2236416 
>>2236331
перед сканф проверь строку на валидность
Аноним 13/12/21 Пнд 12:35:42 #431 №2236447 
>>2236331
>Как на этом блядском языке нормально хендлить инпут пользователя?
Как и на всех остальных - читаешь строку а дальше сам думаешь что с таким вводом делать
Аноним 13/12/21 Пнд 13:33:36 #432 №2236498 
>>2236331
> scanf("%d",operation),

Сканфу нужно указатель передавать.

scanf("%d",&operation);

И как ты получил единицу? Он вернёт тебе единицу, поскольку это количество считанных переменных.
А значение должно попасть в operation
Аноним 13/12/21 Пнд 14:43:35 #433 №2236578 
Есть один STM32 и необходимость записать 8 байт (один uint64_t) во флеш.

Сделал вот так — https://ideone.com/qYkgwU и вроде всё норм работало (gcc компилировал). Это нормально так делать? У коллеги затем (тоже gcc, только другой немного версии и на винде) почему-то работать перестало, и значения *ptr как-то плавно перетекли в 0x5555 после нескольких повторений записи (пока дебажили, почему неправильное значение после азпуска. При этом value остаётся нормальным, т.е. сама память-то вроде правильная, а вот если к этой же области обратиться как к uin16_t — нет.

Что-то я понять не могу, что это вообще такое и почему происходит? Запускается всё на идентичной плате, но у меня почему-то работает (с -O0).


При этом на ideone видна та же самая проблема, ptr выводится мусором. Однако, если я чуть изменю лишь один принт, чтобы и адрес выводил, то всё нормально становится — https://ideone.com/UG7rmg / https://ideone.com/r2kyZW. Что за херня вообще?
Аноним 13/12/21 Пнд 15:54:30 #434 №2236637 
>>2236578
>Однако, если я чуть изменю лишь один принт, чтобы и адрес выводил, то всё нормально становится
Люблю запах Undefined Behaviour по утрам. Это запах... нуба.
Аноним 13/12/21 Пнд 17:23:47 #435 №2236761 
>>2236637
Прекрасно, а объяснить что именно тут undefined-то можешь? Или только язвить горазд?
Аноним 13/12/21 Пнд 17:45:08 #436 №2236780 DELETED
>>2236578
uintptr_t flash_addr = flash
Убери звездочку перед флеш, массив это и так указатель
Аноним 13/12/21 Пнд 18:10:04 #437 №2236806 
>>2236780
Это я, конечно, провафлил, но этот массив только в примере на ideone существует (чтобы код выполнялся) и к никак делу не относится. На самом деле там адрес флеш памяти указан, естественно. В принципе, это в примере вообще лишнее, для полноты оставил.

Вот тут пару вариантов протестировал — https://ideone.com/Ph67mH
>uint16_t u16_2 = (uint16_t)&value;
Выдаёт правильное значение. А вот
>uint16_t ptr = (uint16_t)&value;
>*ptr
Уже нет. Я не пойму, в чём разница между этими двумя вариантами, кроме того, что во втором случае на две строки разделено?

Как только я пытаюсь вывести адрес value или значение указателся ptr, чтобы убедиться, что они действительно на одну точку указывают (мало ли там с alignment'ами что), всё магическим образом начинает работать. Будто тут какая-то квантовая физика с суперпозицией.

Может такое быть, что uint16_t ptr указывает на, скажем, 0xff00, а ptr+1 будет не 0xff02, а 0xff04 по какой-то причине? И даже если такое возможно, первые два байта-то уж точно же должн читать правильно? Да, указатель может указывать как на начало, так и на конец области памяти, вроде как, но ведь изначально они оба указывают на одну точку, до инкремента ptr'а он обязан взять те же данные, что в value записаны, разве нет?
Аноним 13/12/21 Пнд 18:22:40 #438 №2236822 
>>2236806
Точнее, как можно увидеть по ссылке, до цикла значение ptr'а выводится правильно, а вот в первой же итерации, до всяких манипуляций — нет. Обзывайте меня как угодно, только объясните, пожалуйста, что происходит.
Аноним 13/12/21 Пнд 18:23:34 #439 №2236823 DELETED
>>2236806
Вангую у тебя проеб с кастами, ptr может быть 64 бита, а ты кастуешь на 16 битный указатель. Убери всю эту _t пидарасню и попробуй с сишными типами.
Аноним 13/12/21 Пнд 18:41:03 #440 №2236840 
>>2236823
>ptr может быть 64 бита, а ты кастуешь на 16 битный указатель.
В смысле? В прошлом сообщении макаба сожрала звёздочки, я нигде 64 бита в 16 бит не кастую. Сам ptr имеет размер указателя, но указывает он на переменную типа uint16_t.

Вот сделал без _t (ну, за тайпдефал стандартные типы) — https://ideone.com/aKGYoJ Всё то же самое.

Возможно, проблема из-за "dereferencing type-punned pointer", gcc на сайте даже ворнинг выдаёт. Раньше читал, но до конца толком не понял, что это такое. Ну, кроме того, что "нельзя" одну и ту же область указателями на разные типы читать. Только если не char•, там можно почему-то.
Вот только почему идентичный принт на разных строках до изменений переменной выдаёт разный результат это не объясняет. Раз уж ломается, почему так выборочно?
Аноним 13/12/21 Пнд 18:56:54 #441 №2236858 
>>2236840
godbolt.org
Аноним 13/12/21 Пнд 19:05:03 #442 №2236863 DELETED
>>2236840
Если в цыкле закоментишь инкремент, то все выводится нормально, вероятно какая то оптимизация конпелятора, которую нужно выключить. Попробуй на компе собрать.
Аноним 13/12/21 Пнд 19:08:47 #443 №2236868 DELETED
>>2236863
>>2236840
Вае понятно, это 2236863 не смотри. Я тебе пидор что сказал, заменить типы на дефолтные, а ты что сделал? Вот так правь и уебуй
typedef unsigned long long int uint64_t;
typedef unsigned long long int uint16_t;
typedef unsigned long long int * uintptr_t;
Аноним 13/12/21 Пнд 19:16:43 #444 №2236879 
>>2236868
беды с башкой
Аноним 13/12/21 Пнд 19:17:00 #445 №2236880 DELETED
>>2236868
Даже так, а том там опять проеб в середине цикла

typedef int uint64_t;
typedef int uint16_t;
typedef int * uintptr_t;
Аноним 13/12/21 Пнд 19:36:02 #446 №2236903 
image.png
>>2236840
Вот вывод с godbolt'а, -O0, gcc 8.3, как и на ideone.
Аноним 13/12/21 Пнд 19:41:08 #447 №2236910 
>>2236903
Добавлю: с O1 также, с O2 выводит нули, с O2 и "-fno-strict-aliasing" выводит правильно.
>>2236840
>"dereferencing type-punned pointer"
тут ты прав скорее всего
Аноним 13/12/21 Пнд 19:43:03 #448 №2236911 
>>2236868
> Я тебе пидор что сказал, заменить типы на дефолтные, а ты что сделал?
А чем short не дефолтный?

> Вот так правь и уебуй
> typedef unsigned long long int uint16_t;
С чего это uint16_t будет long long? Сделав uint16_t == uint64_t, понятное дело никаких проблем при кастах и возникнуть не может, потому что они просто ничего не делают, типа идентичны. Сам-то вообще понял, что сделал, заменив все типы на один и тот же?

В STM32 запись во флеш идёт только по half-word'ам (16 бит), так что мне нужен был именно 16-байтный тип. Т.е. строка
>٭(uint16_t٭)addr = data;
В любом случае будет, и если эта data другого типа, то опять проблемы могут появиться. Суть моей задачи была разделить 64 бита данных на 4 16-битных куска и позаписывать их в память. Теперь-то я, конечно, переделаю всё на простые сдвиги без подоных алиасингов, чтобы точно правильно работало.
Аноним 13/12/21 Пнд 19:47:54 #449 №2236917 
>>2236910
Через union работает без флага.
Аноним 13/12/21 Пнд 20:00:24 #450 №2236927 DELETED
>>2236911
>заменив все типы на один и тот же?
В 64 битном конпеляторе все типы 64 битные, кроме чар, так что пох, как и в 32 битном все 32 битные, они играют роль только при арифметике. В твоем случае если бы ты использовал стандартные инты то было бы проще, ну или заморочился с кастами.
Аноним 13/12/21 Пнд 20:05:13 #451 №2236932 
>>2236927
>В 64 битном конпеляторе все типы 64 битные
И все таки беды с башкой
Аноним 13/12/21 Пнд 20:14:06 #452 №2236937 
>>2236927
>В твоем случае если бы ты использовал стандартные инты то было бы проще, ну или заморочился с кастами.
Как я могу использовать int в 32-битной системе для переменной, которая должна хранить 8 байт?
Аноним 13/12/21 Пнд 20:38:28 #453 №2236960 
>>2236937
>Как я могу использовать int в 32-битной системе для переменной, которая должна хранить 8 байт?

typedef union { long long my64; struct { int hi; int lo; } } my_int64_t;

как-то так, но не проверял.
Аноним 13/12/21 Пнд 21:27:26 #454 №2236990 DELETED
>>2236937
>которая должна хранить 8 байт?
Не должна, ты там чета намудрил
Аноним 13/12/21 Пнд 22:00:28 #455 №2237003 
>>2236761
Паяльник, ты имеешь право кастовать указатель на uint64_t только в указатели на войд или чар.
Аноним 13/12/21 Пнд 22:00:54 #456 №2237004 
>>2236990
Что значит не должна, с чего ты это взял? У меня есть 64-битный айдишник, который я получаю откуда-то там, и вот с ним дальше работать. Это начальное условие задачи, что есть 8-байтная переменная с данными.

>>2236960
Ну можно и так, но через юнион проще тогда сразу на uint64_t и uint16_t [4] делить, инты эти мне совсем не нужны.
Аноним 14/12/21 Втр 00:32:13 #457 №2237101 
Пацаны, помогите.
Короче, есть одна проблема.
Нужна копия массива на этапе компиляции. Масив генерируется из matlab .h файла(весь контент через #define).
Как это сделать?


Просто из матлаба это грузится в мк, где это инит конфигурация, которую надо сверить правильно ли загрузилась.
Я долбоёб и без плюсов constexpr контейнеров не умею.
Аноним 14/12/21 Втр 00:40:19 #458 №2237104 
>>2237101
как ты массив в макросе копировать собрался
Аноним 14/12/21 Втр 00:55:24 #459 №2237113 
>>2237104
Не собрался я копировать масив в макросе.
У меня есть .h файл, куда матлаб сбрасывает готовую глобальную переменную массив. Но мне нужна копия этого массива, так как эту переменную как только пройдет 10 мс микроконтроллер изменит и мне надо сверить что изменилось(должно быть также).

Срака в том, что я не могу узнать даже в каком месте поставить memcpy() чтобы копировать в другую глобал переменную, у меня нету кода места записи этого массива, кудя я бы захуярил этот memcpy
Аноним 14/12/21 Втр 00:59:29 #460 №2237117 
>>2237113
>У меня есть .h файл, куда матлаб сбрасывает готовую глобальную переменную массив.

Ну сделай разбор .h файла.
Задача вполне решаема.
Аноним 14/12/21 Втр 02:28:19 #461 №2237139 DELETED
>>2237101
>Нужна копия массива на этапе компиляции.
Никак, пусть пишет в бинарь который ты считаешь в память
Аноним 14/12/21 Втр 10:44:35 #462 №2237244 
>>2237113
Копируешь этот хедер в другой, седом меняешь имя массива.
Аноним 14/12/21 Втр 11:04:02 #463 №2237265 
>>2237244
Заебца, так и сделаю на питоне хуёне скрипт и в makefile скопирую это говно.
>>2237139
Ну это я и раньше понял,
>>2237117
Идея неплоха, но каждый раз там хуй знает сколько символов и всегда меняются названия.
Аноним 16/12/21 Чтв 13:30:37 #464 №2239059 
image.png
>>2165466 (OP)
Как это понимать? Память утекла во время линковки?
Аноним 16/12/21 Чтв 15:04:55 #465 №2239120 
>>2165466 (OP)
Сап /clang/ . Можете посоветовать интернет ресурсы где я могу изучать криптографию? Желательно с примерами на C/C++
Аноним 16/12/21 Чтв 16:55:38 #466 №2239211 
>>2239059
У тебя криво установлен valgrind, файлы исключений не соответствуют твоей libc. Похоже, что пришло время переустанавливать генту
Аноним 16/12/21 Чтв 16:56:31 #467 №2239214 
>>2239120
https://cryptobook.nakov.com/

примеры - зависит от того, что конкретно тебе нужно
Аноним 16/12/21 Чтв 16:58:04 #468 №2239215 
>>2239211
давай тоньше
Аноним 16/12/21 Чтв 17:00:17 #469 №2239217 
>>2239215
Так я не троллю, https://stackoverflow.com/a/15535105
Аноним 16/12/21 Чтв 17:40:12 #470 №2239247 
>>2239214
Спасибо.
Аноним 17/12/21 Птн 12:50:52 #471 №2239780 
Здравствуйте уважаемые. Есть распбери 3б+.
Мне нужно принимать данные с ацпшки(10 бит)с частотой 13 мгц. Т.е 10 проводов с ацпшки подключены с 10 пинам GPIO, как мне считывать пины с такой частотой? Пните в какую сторону вобще мне посмотреть. Я уже с ног до головы обмазался документациями никак не могу хоть как-то подобраться к этому вопросу.
ps. Используя библиотеку pipgio у меня получается запустить апаратный шим до 20Мгц. Но опять же никакого понимания как к этому подвязаться нету.

используя библиотеку wiring pi.
Бесконечный цикл while(true) с двумя командами подать 1 на пин, подать 0 на пин, работает с частотой ~470кГц.

https://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/ - вот тут у чела на чистом СИ получился 14 Мгцовый адекватный шим. Когда я скомпилировал у себя у меня получилась говносинусойда на 30 мгц, лул. Опять же как к нему прицепиться?

Если подытожить: как сделать чтобы while(1) работал с частотой 13мГц ? это задержка 0.074 микросекунды, лол, это вобще возможно?

Я буду вам очень благодарен за любую помощь.
Возможно я документацию жопой читаю, т.к мой английский далек от идеала, и есть какое-нибудь решения на готовой библотеке. Может быть вообще нужно делать все как-то по другому.
Аноним 17/12/21 Птн 13:10:18 #472 №2239802 
>>2239780
>это вобще возможно?
Почему нет. Скорость там ограничивается шиной, на которой сидит gpio.
https://github.com/hzeller/rpi-gpio-dma-demo#direct-output-loop-to-gpio
Аноним 17/12/21 Птн 20:18:18 #473 №2240185 
>>2239802
Я не он, но у тебя по ссылке судя по всему не совсем то что требуется. Данные там же синхронные, они должны приниматься не когда попало, а по переднему или по заднему фронту внешнего (для одноплатника) сигнала.
Аноним 18/12/21 Суб 01:44:15 #474 №2240470 
>>2237003
А в обратную сторону можно? Допустим, указатель на чар я могу кастануть в указатель на uint64_t?
>uint8_t arr[8] = {0};
>uint64_t v = ⚙︎(uint64_t⚙︎)arr; ?

Ведь обращение к хардварным адресам/регистрам как-то работает, всякие там ⚙︎(uint32_t⚙︎)addr = data, каст "железного" адреса периферии в структуру с полями её конфига и т.д.?

В чём разница между
>#define GPIOA ((GPIO_TypeDef ⚙︎) GPIOA_BASE)
Где GPIOA_BASE это просто какое-то число, и
>uint32_t addr = &somevar;
>some_type⚙︎ var = (some_type⚙︎)addr;

Ведь в обоих случая просто берётся какой-то адрес: либо "из головы", захардкоженный, либо в рантайме считается, беря адрес какой-то другой переменной. Суть одна и та же — взглянуть на область памяти определённым образом.
Аноним 18/12/21 Суб 02:06:24 #475 №2240479 
>>2240470
Ты немного не так понимаешь.
Есть шина адресов, есть шина данных. Адрес ты можешь вписывать любую хуйню и если она не прокатит, тебе сразу конпенлятор скажет что ты еблан, потому что в .ldscript вписано максимальный адрес и оно не скомпилируется скорее всего или будет бить уведомлениями.
Другое дело, когда тебе производитель, в данном случае STM32 пишет, например, что GPIO это 32 разрядный адрес, это значит что физически к этому адресу есть 32 электронных контакта.
Теперь смотрим что будет:
Ты ставишь указатель с числом куда сказал производитель(оно не будет превышать максимальное число 32 бит, все окей, если бы было больше 64 бит то приложение на МК ушло бы в ресет или что там прошивка мк говорит)
uint64_t gpio = 0xff
Теперь ты берешь и пишешь в ячейку памяти с 32 контактами 64 битное число на запись которой нужно 64 контакта
gpio = 0xf
Что блядь произойдет в конкретной архитектуре конкретного процессора вообще известно только тем кто его сделал. Может два раза перемотать 32 битное число, может процессор послать тебя нахуй и даже не делать такую ебанутую операцию, хуй знает, это undefined behaviour
Аноним 18/12/21 Суб 05:51:54 #476 №2240508 
>>2240479
Как-то не совсем на то ответил, при чём тут запись 64 бит в 32-битную ячейку? Мне ломать ничего не надо, да и я про чтение в основном говорил.

Вот есть там встроенная флеш память. Мне может что-нибудь помешать сделать
>const struct mystruct⚙︎ sp = (struct mystruct⚙︎)addr;
? Вроде работает, да и советы такие на стаке были (с оговорками о совместимости из-за пэддингов и выравниваний, разумеется), но я уже ни в чём не уверен.


Ну и касательно
>ты имеешь право кастовать указатель на uint64_t только в указатели на войд или чар
Вопрос ещё в силе:
>А в обратную сторону можно?
>uint8_t arr[8] = {0};
>uint64_t v = ⚙︎(uint64_t⚙︎)arr;
Работая только с оперативной памятью.

Если я сделаю, скажем, malloc, он найдёт нужное количество байт и вернёт void указатель, который я затем должен кастить в нужный мне тип. Если я создаю переменную в стеке, то он там так же "выделит" память. Почему я не могу её адрес так же в любой (совместимый, так сказать) тип кастить? Я вот этой разницы понять не могу, откуда вообще берётся этот UB из-за type-punning'а. Адрес и адрес, какая разница, откуда он взялся? Если он будет не выровнен как надо, то SIGBUS, да, но я с тем же успехом могу и руками ввести неправильный адрес, при этом компилятор ругаться не будет. В остальном-то что не так?
Еидснтвенное, что приходит в голову, это если из-за оптимизаций он вовсе не создаёт никакой переменной, соответственно и адреса как такового нет, хотя что он в таком случае делает с тем, что я как бы эту переменную с числом далее вообще-то использую, не очень понятно.


Возвращаясь к моему изначальному примеру.
>uint32_t v = 10;
>uint16_t vv = ⚙︎(uint16_t⚙︎)v
gcc на ideone выдаёт
>warning: dereferencing type-punned pointer will break strict-aliasing rules

Однако, если я сделаю
>uint32_t v = 10;
>void⚙︎ ptr = (void⚙︎)&v;
>uint16_t vv = ⚙︎(uint16_t⚙︎)ptr;
То никакого ворнинга о type-punned поинтерах и нарушении strict aliasing'а нет. Но ведь я делаю абсолютно то же самое?!
Аноним 18/12/21 Суб 08:43:11 #477 №2240534 
>>2240470
>А в обратную сторону можно?
Можно. Разрешено ровно то, что необходимо.
>В чём разница между
>#define GPIOA ((GPIO_TypeDef ⚙︎)
GPIOA_BASE)
В первом случае адрес является константой. Это красный флаг для компилятора, т.к. это может оказаться адресом любого объекта. Во втором случае компилятор понял, что ты берешь адрес somevar и наоптимизировал. Кстати, в uint32 адрес превращать непортабельно, используй intptr_t или хотя бы long.
Аноним 18/12/21 Суб 15:15:38 #478 №2240876 
>>2240508
> откуда вообще берётся этот UB из-за type-punning'а
(Тред не читал). UB в стандарте всегда избыточные. Очень сильно избыточные. А причины вот такие, например:
- trap representations - это когда процессор конкретную комбинацию бит не любит обрабатывать, и делает эксепшен на нее (этого нигде нет в современных машинах: можно, конечно, заставить x86 на флоатах трапаться, но требуется много телодвижений).
- выравнивание - например, нужно, чтобы адрес инта был кратен четырем, и если ты кастанешь чар в инт, это будет соблюдаться не всегда, и будет эксепшен. Понемногу это требование становится ненужным: в x86 это нужно специально включать (по умолчанию все работает без выравнивания, ну кроме SIMD и interlocked), в арм раньше было обязательным, но теперь все тоже работает в любом случае. Нормальные разработчики стандарта сделали бы все это unspecified или даже implementation-defined behavior, но комитет любит портить людям жизнь, поэтому это UB.
- третье - это UB-driven оптимизации, когда разработчики стандарта (многие из которых разработчики компиляторов, засевшие в комитете по стандартизации) специально, назло тебе, ради призрачного полпроцента производительности ломают твой код. Например, компилятор может считать, что указатели на int и uint64_t гарантированно ссылаются на разные объекты в памяти (strict aliasing), закладывает на это всякие оптимизации вроде отложенной записи, ты читаешь по неправильному указателю, и читаешь не те данные, что должны были там лежать с точки зрения сишной абстрактной машины.

В целом, если ты знаком с архитектурой и знаешь, что делаешь, все нормально работает и с кастом, и с type-punning через union, диванных не слушай.
#define с многострочными аргументами fat_alien 18/12/21 Суб 19:53:36 #479 №2241210 
Возможно ли при использовании макроса в аргументах вставлять несколько строк кода, наподобие следующего примера?
#define macroIf(trcod,flcod) if(x<100) { trcod } else { flcod }

int x,y,z;

int main()
{
macroIf(
// 2 строки кода на 1-й аргумент:
y = x + z;
y = z y;
,
y = x
z; // 1-я строка кода на 2-й аргумент
y = y - z; // 2-я строка кода на 2-й аргумент
)
}

Обратный слэш не нужен в строках 7...13? Комментарии в строках 7...13 можно обозначать двумя слэшами, а не блоком? Если аргументы или комментарии будут содержать внутри запятые, повлияют ли они на подстановку в макросы? Возможно ли макрос подставлять на место аргумента другого макроса?
Аноним 18/12/21 Суб 20:19:20 #480 №2241264 
>>2241210
в конце строки \ поставь
так на каждой кроме последней
Аноним 18/12/21 Суб 20:20:20 #481 №2241268 
>>2241264
а, я не о том вообще..
Аноним 18/12/21 Суб 22:25:19 #482 №2241366 
>>2240876
>в арм раньше было обязательным, но теперь все тоже работает в любом случае.
А у того анона STM32, то есть Cortex-M0/M3/M4 и может быть M7. Для M0 выравнивание необходимо. И никуда Cortex-M0 в обозримом будущем не исчезнет, точно так же как 8051.
Аноним 18/12/21 Суб 22:59:08 #483 №2241382 
>>2241366
>>2240876
M4 у меня, и да, выравнивание там всё же нужно, вроде как. По крайней мере я разок с попыткой каста из адреса нечётного элемента чар буфера уже обосрался. При этом, что интересно, ломалось оно только с выключенными оптимизациями (логично), а с -Os он каким-то образом там всё переставлял и у него вполне получалось правильно выполнять код:
>uint8_t buf[9];
>receive_data(buf);
>uint64_t v = ⚙︎(uint64_t⚙︎)&(buf[1])
Смотреть, что он там сгенерировал как-то не дошли руки.
Аноним 18/12/21 Суб 23:05:57 #484 №2241389 
image
>>2241382
>из адреса нечётного элемента чар буфера
Ты же не думаешь, что чётный элемент гарантирует выравнивание?
Аноним 18/12/21 Суб 23:59:16 #485 №2241439 
>>2241382
>M4 у меня, и да, выравнивание там всё же нужно, вроде как.
Там не все инструкции могут работать по не выровненным адресам, но большая часть может в отличии от ARMv6 и предыдущих.

>и у него вполне получалось правильно выполнять код:
Не слишком ли много лишних действий? Не проще ли было сразу взять uint64_t?
Аноним 19/12/21 Вск 00:50:40 #486 №2241463 
>>2241366
> выравнивание необходимо
Да похуй, у компиляторов арм принято в таких случаях просто читать побайтово и собирать. Так что будет перфоманс дроп в качестве UB.

>>2241210
> Возможно ли при использовании макроса в аргументах вставлять несколько строк кода
Полноценно нет, на зачем тебе, если в Си переводы строк почти везде можно заменить на пробел?

> Если аргументы или комментарии будут содержать внутри запятые, повлияют ли они на подстановку в макросы?
Иногда. Зависит от того, где макрос раскрывается.

> Возможно ли макрос подставлять на место аргумента другого макроса?
Да.
Аноним 19/12/21 Вск 01:29:23 #487 №2241476 
>>2241389
Я думаю, что нечётный гарантирует невыравнивание, поэтому так и выразился. А гарантирует, вероятно, нулевой и каждый n-ый.
По крайней мере этот код — https://ideone.com/OtuNQX — у меня выдаёт:
>&a = 0x2000185f, &b = 0x2000185c, &c = 0x20001858
>&d = 0x20001854, &e = 0x20001850, &f = 0x20001848
>&g = 0x20001840, &h = 0x20001838, &i = 0x20001830
>&j = 0x20001824, &k = 0x20001818
т.е. char где угодно выходит, а все массивы обязательно начинаются на байте, кратном четырём. (На самом идеоне, однако, это не так, и каждый массив начинается на следующем за последним "занятым" байтом.)

>>2241439
>Не слишком ли много лишних действий? Не проще ли было сразу взять uint64_t?
Там функция принимает байты извне (по onewire), и затем уже я вот как раз это всё дело и соединяю в один удобный инт для дальнейшей работы (а первый байт в данном случае надо отбросить, потому что там отправленная перед этим команда). Не всегда одно и то же количество байт принимается, не всегда из них все вообще нужны, и т.д. То есть, где-то в любом случае придётся вот так собирать целое число из отдельных байтов.
Аноним 19/12/21 Вск 09:50:44 #488 №2241580 
>>2241476
>А гарантирует, вероятно, нулевой и каждый n-ый.
А в станларте такого нету.

union {
uint32_t align;
char buf[9];
} u;
Аноним 19/12/21 Вск 15:58:46 #489 №2241901 
>>2241580
Не совсем понятно, что тут должно произойти. Типа, выделив под этот юнион 12 байт, нужные для буфера 9 могут оказаться где угодно внутри этого пространства, что ли?

https://ideone.com/0BP8rv до сих пор выдаёт нормальные, кратные четырём адреса:
>&un = 0x20001848, &un2 = 0x20001854, u16 = 0x20001806
>&un.buf = 0x20001848, &un2.buf = 0x20001854

Если тут что-то может пойти не так, то и через union type-punning тоже нельзя, но ведь советуют? Говорят, что всё ок и по спеке — https://stackoverflow.com/questions/25664848/unions-and-type-punning
А если всё по спеке, то как там может быть не выровнен адрес элементов? Не может же он хранить начало буфера в каком-нибудь 0x1 адресе (из которого обычно uint32_t не прочитать), но когда ты обращаешься к uint32_t элементу, каким-то магическим образом всё же получать правильное значение.
Аноним 20/12/21 Пнд 02:46:55 #490 №2242471 
Подскажите, где взять хороших упражнений (на набить руку), прорешав которые можно будет точно решить, что основы языка усвоены.

Не уровня, напиши функцию складывания двух int, а что то посерьезней и интереснее (с указателями к примеру)

Аноним 20/12/21 Пнд 07:20:10 #491 №2242511 
>>2242471
codewars
Аноним 20/12/21 Пнд 09:37:57 #492 №2242550 
>>2242471
Книга Crafting Interpreters - вторая половина про написание интерпретатора на С, есть упражнения.
Аноним 20/12/21 Пнд 15:50:29 #493 №2242891 
Вопросы:

В голове при слове указатель вот такой концепт - память это "массив" байтов (2^64-1) где индекс это номер байта в этом "массиве". указатель это просто индекс (первый) в этом "массиве", а значение это содержимое 'массива' по данному индексу(указателю)

Норм так думать об указателях? или такой концепт в будущем спотыкнется обо что то?

второй вопрос, почему для unsigned чисел реализован механизм операций по модулю, то есть если я выйду за диапазон, оно будет все операции делать по модулю Unsigned_Type_MAX
(пример 0u - 1u) Почему для ансайнт чисел такое есть, а для обычных такого нет. И какой в этом глубинный смысл...
Аноним 20/12/21 Пнд 15:58:33 #494 №2242895 
>>2242891
>Норм так думать об указателях? или такой концепт в будущем спотыкнется обо что то?
Норм. Спотыкнётся об виртуальную память, таблицы страниц, TLB и вот это вот всё.

> второй вопрос
https://stackoverflow.com/questions/18195715
профессионально ищу на stackoverflow, дорого. звонить 8-800-555-35-55
Аноним 20/12/21 Пнд 17:58:17 #495 №2243036 
>>2242891
>или такой концепт в будущем спотыкнется обо что то?
Комитет не хочет, чтобы ты так думал. Указатель (в мифическом Эльбрусе) может быть сущностью, для которой оперделны операции создания, преобразования, разыменования, индексации...
Аноним 20/12/21 Пнд 18:04:29 #496 №2243045 
>>2242895
> Спотыкнётся об виртуальную память
Трансляция адресов никак не пересекается с указателями, а про маппинг в юзермоде можно успешно думать отдельно.

>>2243036
Не только в мифическом эльбрусе, но и в реальном x86 под досом far-указатели - не совсем индексы. Но думать об указателях, как об индексах в адресном пространстве все равно очень удобно и наглядно.

>>2242891
> Почему для ансайнт чисел такое есть, а для обычных такого нет. И какой в этом глубинный смысл...
Много-много лет подряд, когда уже весь мир хранил числа в дополнительном коде, комитет по стандартизации сишки отказывался фиксировать метод хранения чисел со знаком. А потом компиляторы подтянулись и начали пилить оптимизации, основанные на UB при переполнении знаковых чисел, и уже ничего не изменить. И вот спустя почти 35 лет после выхода первого стандарта в Си наконец укажут, что у нас дополнительный код, но... UB не уберут.
Аноним 20/12/21 Пнд 18:08:49 #497 №2243053 
>>2242895
>>2243036
>>2243045
Благодарю за ответы!
В очередной раз убеждаюсь, что если хочешь глубоко понять все эти вещи, то кроме K&R и задач надо читать совместно с учебниками типо:
Computer Systems
A Programmer’s Perspective
Аноним 21/12/21 Втр 08:56:11 #498 №2243557 
image.png
>>2243045
>думать об указателях, как об индексах
Ты указатель с адресом попутал, учитель херов.

>очень удобно и наглядно
Дебилизм какой-то. Что тебе непонятно прямо на пикриле, безо всяеких манямассивов с маняиндексами?
Аноним 21/12/21 Втр 15:48:34 #499 №2244001 
>>2243557
Указатель - это адрес объекта, плюс-минус дополнительные данные у fat pointers. Адрес объекта - это индекс первого байта объекта в адресном пространстве. Он же офсет (смещение) объекта в байтах, считая от начала адресного пространства. На некоторых архитектурах все может быть немного сложнее.

> Что тебе непонятно прямо на пикриле
Ты притащил файл, в нем лишь офсеты, указателей и адресов нет по определению, так как нет памяти.
Аноним 21/12/21 Втр 18:08:05 #500 №2244153 
Салаги, записывайте: указатель - это тип данных, значением которого является "адрес".
Адрес объекта - это индекс первой ячейки пам'яти, начиная с которой расположен объект.
Аноним 21/12/21 Втр 19:14:38 #501 №2244250 
image.png
Решаю задание 1.2 из K&R Там где вместо \n говорят ввести \c и посомтреть что будет, на мое удивление выводится

> printf("c - \c");
Вывод:
c - c
Если это неизвестная esqape sequence, то куда пропадает косая черта?

Дальше больше, я ввожу такое:
>printf("e:\e");

И оно рисует стрелку вообще, что за дела мудрецы?
Привел табличку ескейпов и там нет \e

Аноним 21/12/21 Втр 19:39:48 #502 №2244276 
>>2244250
\e это расширение в некоторых компиляторах. Оно аналогично \033 то есть стрелочка вверх.
Косую черту съело потому что по правилам \ начинает esq-sequnce . Чтобы нарисовать косую черту делай так : printf("%c",'\\');
Аноним 21/12/21 Втр 20:08:22 #503 №2244303 
image
>>2244276
>Чтобы нарисовать косую черту делай так : printf("%c",'\\');
printf("\\");
putchar(putchar(92));
Аноним 21/12/21 Втр 20:40:42 #504 №2244349 
>>2244303

printf("%c",'\\'); ИЛИ printf("\\"); ?

ХОЛИВАР ОБЪЯВЛЯЕТСЯ ОТКРЫТЫМ
Аноним 21/12/21 Втр 21:29:00 #505 №2244414 
>>2244349
однохуйственно
Аноним 21/12/21 Втр 21:53:16 #506 №2244453 
>>2244414
Второй способ меньше по коду.
Аноним 21/12/21 Втр 22:00:54 #507 №2244459 
image.png
image.png
>>2244349
Аноним 22/12/21 Срд 09:02:27 #508 №2244810 
>>2244349
puts
Аноним 22/12/21 Срд 13:34:32 #509 №2245028 
>>2244810
write(1, "\\", 1);
ПЕРЕКАТ Аноним OP 22/12/21 Срд 18:46:18 #510 №2245332 
>>2245329 (OP)
>>2245329 (OP)
>>2245329 (OP)
>>2245329 (OP)
Аноним 22/12/21 Срд 18:49:55 #511 №2245338 
image.png
>>2245028
мужчина, вы смыть stdout не забыли?
Аноним 22/12/21 Срд 18:52:49 #512 №2245340 
>>2245338
write не stdout, у него нет кэширования, кэширование выше.
Аноним 22/12/21 Срд 18:59:30 #513 №2245348 
>>2245340
>write не stdout
в смысле не stdout? А куда? Я думал stdout это просто какой-то файл и вывод это собственно запись туда. Если нужно отобразить на экран то fflush. Ну а printf делает то же самое только буферизирует и само смывает когда надо.

В чем я не прав?
Аноним 22/12/21 Срд 22:33:18 #514 №2245491 
>>2245348
Насколько я знаю, кэширование stdout производит libc, а запись в файл небуферизируется. Но это надо уточнить и может зависит от реализации. В моей системе по крайней мере так.
Аноним 23/12/21 Чтв 00:43:02 #515 №2245553 
>>2245491
Этот прав, я просто не очень точно выразился. Сишный stdout кэширует, а по \n (или по fflush, или если буфер кончится), пишет буфер через write. Там ниже write на уровне ядра тоже может быть кэш, но, по крайней мере, по умолчанию, если у тебя терминал, то все записанное через write сразу отобразится.
comments powered by Disqus