Этого треда уже нет.
Это копия, сохраненная 11 июля 2022 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
C Propaganda.jpg1,9 Мб, 2000x2610
C Programming Language #71 /clang/ # OP 2165466 В конец треда | Веб
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь 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)
2 2165501
3 2165553
Си говно говна, хуже чем си вряд ли что-то есть.
С++ уже почти нормальный язык, за некоторыми исключениями оставшимися от наследия си.
Rust нормальный язык, вполне годный для замены первого говна.

Единственный вопрос треда - Нахуя вы продолжаете жрать говно?
4 2165581
>>165553
А почему ты считаешь что всем одинаково не нравится жрать дерьмо? На вкус и цвет как бы.
5 2165786
>>165553
Си лучший из лучших, прошло 40 лет, но лучше си врядли что-то появится.
С++ уже почти нормальный язык, за некоторыми исключениеми добавлеными поверх си
Rust самый конченый язык, создан СЖВ скамом, чтобы выебать программиста в жопу своим борроу чекером и конченым синтаксисом, чтобы пополнить ряды пидорасов.

Единственный вопрос треда - почему мы тут все такие пиздатые?
6 2165792
>>165786
Глянь проекты трансух и фурриебов, обнаружишь, что почти все они железнячники и пишут на си. Про трансух на cppcon все знают. На расте же пишут белые цисгендерные мужчины. Даже на rust survey были диаграммы, в которых 90% растоманов не относили себя к меньшинствам.
7 2165835
>>165792

> Глянь проекты трансух и фурриебов, обнаружишь, что почти все они железнячники и пишут на си


так раньше было, да пидоры писали на С, как и все, ничего плохого в этом не вижу. Но вскоре времена поменялись, пидоры фемки и вские другие залупские меньшинства начали вещать свои извращеные идеи громче всех, эмулируя своим ором массовую поддержку (на самом деле их как было 1% так и осталось). Это сказалось на многие вещи, БЛМ, поблажки неграм и пидорам почти во всех сферах, также и в программистской среде это тоже случилось (пример - замены master slave). Из-за общего тренда (а не из-за своих личностных качеств) эти никчемные фемки и пидоры дорвались до власти, и смогли навязать что надо написать свой раст. Т. к. идея его создания высосана из пальца, а истинная причина - (они даже это во всех статьях так и пишут) убить детище белых гетеросексуальных мужчин (с с++), то новый язык получился как и собственно идея его создания - КУСКОМ ГОВНА.

> Даже на rust survey были диаграммы, в которых 90% растоманов не относили себя к меньшинствам.


ага, спасибо что посчитал по головам тупых ебланов. Будет новый тренд ебать своих мамок - увидишь теже лица
8 2165841
>>165553

>Си говно говна, хуже чем си вряд ли что-то есть.


Си это такой высокоуровневый ассемблер. Например, когда я пишу на Си, я знаю какой машинный код сгенерит компилятор.
Си++ это (Си + синтаксический сахар). Почти всегда я тоже знаю что сгенерирует компилятор. Но только почти.
9 2165865
>>165841
Во-первых, это слова Линуса Торвальдса. Во-вторых, давай будем честны друг с другом, ты ничего такого низкоуровневого не пишешь, чтобы знать какой там ассемблер будет сгенерирован.

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

К тому же нормальный человек видит задачу и решает ее высокоуровневым методом, а говнари на си, будут 90% времени ублажать компилятор и процессор. А на выходе получат только баганное говно которое будет постоянно падать и жрать память из-за мемориликов.
10 2165905
Ребята подскажите что делать, если при компиляции такая ошибка возникает?

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

В интернете пишут, что типа делается не в консольном приложении и нет функции main. Проект не мой, но нужно скомпилировать. Если тупо засунуть в рандомный файл эту функцию - то, конечно, компилируется и получается экзешник но программа там не работает.
11 2165986
>>165905
Обычно линкер отлично сам детектит, какая функция есть (main или WinMain), подсовывает соответствующий стартап, и все работает. Без исходников сложно понять, что ты делаешь не так, и что именно ты сломал. Попробуй -mconsole сказать.

>>165865

> нормальный человек видит задачу и решает ее высокоуровневым методом


Он на 100% не знает, что там внутри высокоуровневого метода, документация почти никогда четко не описывает контракт, и мы получаем что? Правильно, вот это твое

> сотни багов с доступом к памяти, мемори ликов и если дело происходит в многопоточной среде кучу data race'ов


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

Плохой код на крестах писать гораздо проще, чем на сишке. А если заодно вспомнить, что кресты - это не один, а четыре разных языка (C с классамии и три основных стандарта), становится ясно, что лучше на крестах не писать вообще.
12 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, но их тред умер.)
13 2166056
>>166051
Минусы первых двух вариантов в том, что размер массива уже не известен на стадии компиляции и становится проблематичным создание второго массива того же размера, разве что опять же делать его extern или передавать в register_data_array. Уж не знаю, как этого можно избежать.
14 2166063
>>165986
При чем тут С++. Я согласен, что на С++ нахуевертить по незнанию можно так же как и на Си а то еще хуже. Я говорю о высокоуровневых языках типа хаскеля, где проблемы решаются высокими абстракциями, без всяких там мутексов и прочей низкоуровневой хуйни. Где априори не может быть дата рейсов, сегфолтов и мемориликов.
Но даже если брать с++, то во-первых, мы не берем в расчет всяких джунов, а берем в расчет среднего мидла, которы уже умеет программировать на своем языке и знает где вставить мутекс и т.д. и если взять такого же среднего разработчика на си и дать им одну и ту же задачу, шанс того что на си будет больше багов намного больше и время которое он затратить реализуя какую-то сложную вещь на си написывая все с нуля начиная от примитивных дата стракчерс будет вообще не сопоставимо со временем которое потратит С++-Чэд, просто заинклюдя в свой проект буст и реша проблему в пару сотен строк.
15 2166121
>>165553

>Си говно говна, хуже чем си вряд ли что-то есть.


>С++ уже почти нормальный язык, за некоторыми исключениями оставшимися от наследия си.


>Rust нормальный язык, вполне годный для замены первого говна.


На новой архитектуре/платформе компилятор и окружение раста не собирается без компилятора си и плюсов, вот и думай теперь.
16 2166172
>>166121
И нахуя ты это высрал?
На новой архитектуре без реализации компилятора хоть какого-то языка нихуя не соберется. При чем тут си?
17 2166180
>>166172
При том, что без него не работает раст, следовательно раст вторичен?
18 2166354
>>166180
Хуйню не неси
19 2166378
>>166056

> размер массива уже не известен на стадии компиляции


Есть еще четыре возможных решения:
- вместо register сделать функцию-геттер, которой будет видно определение, и она сможет возвращать и указатель, и массив (плюсы - не нужно заботиться о том, не забыли ли вызвать register при инициализации);
- создавать переменную с размером с помощью макроса и магии (вполне нлом, если стайлгайд осуждает макросы);
- положить массив в отдельную секцию и считать размер секции
(типичное решение в embedded, когда и компилятор тебе известен, и линкер ты контролируешь)
- ну и возможно стоит подумать о том, нужен ли тебе вообще размер - возможно, нуль-терминатор в конце тоже подойдет.
Я бы сделал register, раз уже известно, что код будет переиспользоваться. Тем более на STM32 писать подобное в традиции.

Примеры первых трех вариантов https://wandbox.org/permlink/qTi8ZGJFSNXYQkY4 (вкладка array.c в редакторе).
sage 20 2166379
>>166378

>и указатель, и массив


и указатель, и размер
21 2166412
>>166172

>И нахуя ты это высрал?


>При чем тут си?


При том, что где будет раст, там всегда будет Си и плюсы. А вот в обратную сторону это не работает. Тогда встает вопрос, нахрена он нужен и как он может заменить си, если сам без него не собирается?
22 2166633
>>166412
Ты несёшь абсолютную хуйню. Ты походу вообще не врубаешься как работают бинарники в ос
image.png55 Кб, 760x597
23 2166698
>>165865

>Во-первых, это слова Линуса Торвальдса.


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

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


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

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


Если ты больше 20 лет пишешь на Си, то твои программы не будут падать и течь, потому что это всё пройденный этап.
24 2166723
>>166698

>Эти FPU инструкциии


Лол, а че sse не завезли?

>Если ты давно тут тусуешься,


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

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

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


Если ты больше 20 лет пишешь на си, то с тобой явно что-то не так, при чем сильно.
25 2166736
>>166723

>Если ты больше 20 лет пишешь на си, то с тобой явно что-то не так, при чем сильно.


А кто тебе сказал что я пишу ТОЛЬКО на Си? Зарплату мне платят за C#. На сях и плюсах я пишу для души.
26 2166763
>>166723

>Лол, а че sse не завезли?


Нахуя sse для последовательных вычислений?
Мимо
27 2166797
>>166633
На давай, расскажи мне как ты будешь компилятор раста и прочее окружение портировать на новую архитектуру.
28 2166817
>>166736

>C#


>На сях и плюсах я пишу для души.


Ясно, с этого и надо было начинать.

>>166763
х87 сопроцессор уже лет как хуй знает сколько не используется даже для одинарных вычислений.
Попробуй дизасемблируй любую арифметическую функцию и увидишь там simd инструкции для одиночных скаляров.
29 2166823
>>166797
Ты еблан. Даже объяснять тебе что-то лень. Иди учи матчасть. При чем здесь новая архитектура и си? Твой компилятор ( любого языка ) должен преобразовывать высокоуровневый код в машинные инструкции этой архитектуры и взаимодействовать с операционной системой через syscalls, в стандартных люнуксах за это отвечает glibc или аналоги, но никто не мешает тебе сделать тоже самое на другом языке. При чем здесь си еще раз?
изображение.png55 Кб, 1079x465
30 2166845
31 2166855
>>165466 (OP)

>Brian Kernighan, Dennis Ritchie "The C Programming Language":


Хотел бы совета насчёт перевода данной книги, какой самый лучший из всех ? В ориге не осилю, ибо слабо знаю английский.
sage 32 2166978
>>166855
Есть переиздание 2017 года. Насколько я знаю, там все более-менее норм (кроме цены). Ну и в целом все переводы говно по определению.
33 2167121
>>165865

>Во-первых, это слова Линуса Торвальдса


А можно пруф? Желательно ссылкой на английскую версию, на lkml.
34 2167454
Здравствуйте, я немного запутался в указателях, вот, к примеру у меня есть указатель ptr, для которого я выделяю 5 ячеек памяти: int ptr = calloc(5, sizeof(int)), можно и с malloc(5 sizeof (int)).
Правильно ли я понял, что если создать другой указатель pptr и присвоить ему ptr: int pptr = ptr, то я смогу делать все с указателем ptr через pptr, в том числе и free(pptr)=>очищу так же и ptr, т.к. все это ссылается на один адрес в памяти, это справедливо будет?
35 2167696
как же вы заебали со своим керниганом. самый наихуевейший учебник который я только видел
36 2167712
>>167696
прочитал как Керриган.

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

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

Выдает ненужные числа после запятой. Это связано с байтами но я не вдупляю.
sage 37 2167802
>>167712
Эти числа нельзя представить точно в виде суммы положительных и отрицательных двойки. Округляй или ограничивай количество цифр после запятой более вменяемым числом. Алсо, lf тебе не нужно, ты печатаешь дабл, это просто f, а long double это уже Lf.
sage 38 2167804
>>167802
*степеней двойки
sage 39 2167811
>>167454
На ptr твои манипуляции не повлияют, они влияют на объект, на который ссылается ptr. Просто после free объект удалится, но ptr не "очистится", оба указателя будут продолжать одинаково указывать на невалидный объект. Захочешь очистить - пиши NULL в каждый по отдельности.
40 2167902
>>167811
Спасибо
41 2167993
Как компактно объявить массив, у которого первые n байт одинаковые, а оставшиеся k имеют свои значения?
42 2168023
нахуй указатели нужны? я что не могу без них обойтись чтоли?
sage 43 2168133
>>168023
Нахуй нужны индексы в массиве? Я что, не могу без них обойтись чтоли? Указатели на обычных машинах - это индексы в массиве байтов под названием память.
44 2168319
>>168023
Подучи сосамблер, ты потом эти указатели в K&R даже не заметишь
45 2168732
>>168319
Проблема в том, что после ассемблера сложно понять, почему нельзя float x = 3.14f; printf("%08lx", ∗(uint32_t ∗)&x).
46 2168901
>>168732
А кто сказал что нельзя? Может быть тебе надо на экран вывести адрес стека, на котором лежит переменная x.
47 2169025
>>168732
А в чем тут собственно проблема?
Да, неизвестно какие байты ты получишь, на бульбуляторе с не IEEE-шным флоатом и/или little endian. Правда при условии что размер и выравнивание у типов одинаковое.
мимо из крестотреда
48 2169103
>>168901
Ах блядь, там звёздочка. Пора очки менять.
sage 49 2169332
>>169025

> А в чем тут собственно проблема?


strict aliasing. Стандарт не гарантирует возможность доступа по несовместимому указателю, а компиляторы этим пользуются. В таком простом коде, конечно, не сломается, но в каком-то другом - обязательно.

>>168901
>>169103
Тогда нужен каст не в uint32_t, а хотя бы в uintptr_t (а то сломается на 64 битах) или поменять формат на %p. И с этим после ассемблера тоже сложно смириться. Ты знаешь, что там лежит, а компилятор Си выделывается и не хочет.
50 2169412
>>169332

> И с этим после ассемблера тоже сложно смириться.


Ой, да ладно. Я сначала Бейсик выучил, потом ассемблер, затем ассемблер другой архитектуры, затем паскаль, затем Си. На Си сложно было переходить, но ассемблер тут не при чём.
51 2170308
Сяп. Нужно убрать элайны в некоторых структурках. Есть возможность сделать такое без прагмы пак?
52 2170364
>>169332

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


Вот поэтому я и не осилил си. Слишком много букв а толку ноль.
Один хуй никакой совместимости в реальных проектах между архитектурами не существует, все равно нужно править и переписывать код при любой смене окружения. Что именно даёт си, что все так любят его,мне не ясно. А вот отнимает он очень порядошно.
53 2170445
>>169332

>strict aliasing.


Отключается параметром компилятора. В майкрософтовских компиляторах его нет вообще.
54 2170449
>>170364

>Что именно даёт си, что все так любят его,мне не ясно.


Замена?
55 2170501
>>170449
RUST!!!!!
56 2170543
>>170364

>Один хуй никакой совместимости в реальных проектах между архитектурами не существует


Сморя чего пишешь, если GUI, то не существует. в остальном хватает #ifdef

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

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

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

> По сути есть лишь две платформы


"Две" платформы - только для хелловорлдов (даже для хелловорлдов уже две).

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

> в остальном хватает #ifdef


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

> логика платформонезависима


Да, пока ты пишешь тормозное говно на жс.
58 2171080
В плюсотреде рекомендовали юзать возможности системы сборки вместо препроцессора для сборки под разные платформы.
59 2171081
Даже в расте, вроде, так же, но конфиги для карго.
60 2171117
>>171080
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 есть, поэтому я собирать не буду.

Нет ни одной вменяемой системы сборки. Это как с лефтпадами в жс. Тебе их рекомендуют для не того, чтобы решать проблемы, а для того, чтобы у тех, кто рекомендует, была работа.
61 2171507
>>171063

>(даже для хелловорлдов уже две


Пиздёжь.
printf есть везде. За редчайшим исключением, типа прошивой для какой-то экзотической ёбы. Да то не факт, что его там нет, скорее всего будет через JTAG писать в терминал.
62 2171531
>>171507

>через JTAG писать в терминал.


Было такое в MicroBlaze, надеюсь больше не будет.
63 2171695
Цишники блять, а ну быстро пояснили Питоногосподину почему чар залупа = "А" это H через %с в принтф, че это за хуйня? инбифор: Я знаю что А выводится через одинарные кавычки нормально, я спрашиваю какого хуя Н через двойные выводится
64 2171698
>>171695
Потому что ты петухонер.
char zalupa = "A";
printf("%c\n",
zalupa);
65 2171699
>>171698
блять, там ещё указатель стоит перед zalupa, на дваче не отображается, и в принтф перед zalupa разыменователь стоит
66 2171700
>>171698
Ну и че ты скинул, оно тоже Н выдает. Для справки цлев, компилю через мсвц.
image.png7 Кб, 488x75
67 2171701
>>171700
Я же тебе выше отписал, что там звёздочка должна быть, на дваче она не отображается
68 2171702
>>171699
А лол, ну так на вопрос то ответь, какого хуя с двойными кавычками такие фокусы нужны, схуя они не эквивалентны одинарным для ситуации одного чара.
69 2171703
>>171701
Я сначала скинул, потом обновил тредю
70 2171704
>>171702
Потому что 2 кавычки это строка, а когда ты бля выводишь через %c ты выводишь СИМВОЛ, %c - char/charachter/символ
Вот тебе пример с %c и двойными кавычками и %s.
71 2171707
>>171704
Это я понимаю, я не понимаю почему Н выводится без фокусов с указателями. Что вообще такое Н? Ну ок я дебс в чар строку запихнул и решил ее через %с вывести лулзов ради. Почему оно не кидает ошибку или первый символ строки, а кидает какой-то Н. В чем смысл?
72 2171710
>>171707
Просто потому. я сделал такой же пример как и у тебя, у меня вывело j, не придавай этому большого значения
73 2171716
>>171707

> Ну ок я дебс в чар строку запихнул


Это как?
В твоём примере zalupa это указатель на строку. Когда ты перед ним пишешь звёздочку, это разименовывание указателя называется, на выходе будет первый символ.

А у тебя 'A' кириллическая или латинская? Вероятно кириллическая, потому что другой ошибки быть там не может.
74 2171772
>>171695

> быстро пояснили


> Питоногосподину


'a' - это ord(a), а "a" - это id("a").
75 2171895
>>171772
Понял, пасиб
76 2172203
>>165466 (OP)

> 2021


> GCC всё ещё не умеет в C11

77 2172462
>>172203
Лолшто? Обновляться пробовал? он с2x умеет даже, хотя стандарт еще не вышел
78 2172551
>>166723

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


Можешь подробнее разложить, почему говно?
79 2172572
>>172551
да он шизик, сбежал с соседнего треда по расту самоутвердиться
80 2172676
>>165466 (OP)
Сап, нюфажеский вопрос. Есть алгебраическая функция, непрерывная, ф1. Есть функция, которая считает производную от этой функции, назовем ее ф2. Но вот есть функция, которой нужна и функция ф1 и функция взятия производной ф2, пусть будет ф3, например разложение в ряд или что-то еще. Как добавить ф2 в ф3 в качестве аргумента чтобы ничего не сломалось?
delo-raskryto.jpg110 Кб, 800x775
81 2173151
Кароче, посоны, передавать структуры напрямую без указателя - зашквар, в то время как на стэке выделять можно, всё пральна?
82 2173166
Как в определении переменной строго указать компилятору порядок байт?
socyrno.png1 Кб, 80x144
83 2173175
>>173166
Сам нашёл - https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html.
Заодно и ответ на >>170308-вопрос тоже здесь
оказывается в дваче есть не все ответы
84 2173219
>>173151
Выделять на стеке можно (не забывая, что стек не резиновый), передавать мелкие тоже можно (например, чтобы наколхозить именованные аргументы), крупные/разнородные лучше передавать указателем.
85 2174199
>>172676
Ты не в том треде интересуешься.
Тут нужен код.
А вообще гугли "указатель на функцию".
Его можно передавать как аргумент функции.
И чтобы не ебацца понапрасну, объяви его как typedef, инвче хуй голову сломает - получится нечитаемая конструкция, которую даже автор кода не поймёт.
А через typedef указателя на функцию получится вполне читаемое.
86 2175027
А в Си можно както тайпдефить 24-битный тип?
87 2175113
>>175027
Нет. Можешь сделать typedef структуре из трех байтов, но арифметики к ней конечно не будет. Нативно 24 бита будет только там, где 24-битные инты. Старые dsp например.
88 2175215
>>175027
Да, структура из трёх char'ов без packing'а.
89 2178222
Какие есть нетривиальные но хорошие способы изучения Си? Курсы может какие нибудь, бут кемпы там? Книги мне тяжко осиливать, а вот, например, туториалы хорошо заходят
90 2178415
>>178222

> нетривиальные но хорошие способы изучения Си?


Напиши компилятор Си.
91 2178730
Что читать, чтобы научиться писать такой код, за который меня не будет чмырить линтер и фильтровать гитхаб?
93 2179696
>>175027
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);
}
94 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 работает нормально, но если задать иные значения - виснет. Если компилировать пошагово непонятно, что с ней - тоже виснет, как только переходит на вычисления.
Это у меня глюки на ноуте или у программы проблемы? Прошу о помощи.
Да, я знаю, что хуй и быдлокодер, но я только учусь
94 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 работает нормально, но если задать иные значения - виснет. Если компилировать пошагово непонятно, что с ней - тоже виснет, как только переходит на вычисления.
Это у меня глюки на ноуте или у программы проблемы? Прошу о помощи.
Да, я знаю, что хуй и быдлокодер, но я только учусь
95 2179709
>>179705
А ещё не могу в разметку двача.
#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;
};
}
95 2179709
>>179705
А ещё не могу в разметку двача.
#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;
};
}
96 2179879
>>179705

> учат сям (точнее, гибриду сей и с++, так как препу не хочется учить нас сишному вводу-выводу).


вся суть снгшного образования
плюнь в лицо этому преподу от меня
97 2179908
>>179705

>виснет


Очевидно, что у тебя никогда не заканчивается цикл

>while ((abs(f(b)-f(a))>e)&&(abs(b-a)>d))



Так что напихай туда принтов да посмотри, чему равны твои f(b), f(a), abs(b-a).
.png35 Кб, 1003x90
98 2179916
Аноны, лень изучать новый язык, поэтому опишите вкратце, почему раст говно?
99 2180261
Скажите, плез, как хранить аргументы при формировании строки.

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

Думаю, с с можеством аргументов поможет vsnprintf... Но как их накопить?
100 2180385
>>179916
Потому что не Си.
гыгы 101 2180558
>>180261
Не надо мудрить. Деды просто используют динамическую типизацию:
if i_flag printf %d i;
if s_flag printf %s s;
Снимок экрана от 2021-10-11 20-00-32.png50 Кб, 899x535
102 2180560
почему pb больше pa ? Почему не равны? Что я сравниваю?
Пробовал увеличить размер массива а[] тогда "pa" становится больше.... но не равны.
103 2180562
>>180560
Чел, ты сравниваешь адреса.
Это сравнение равносильно сравнению a и b (e.g. pa > pb <=> a > b)
104 2180566
>>180562
тогда посмотри пож-та на 24-ю строчку.
там вроде тоже адреса сравнивают? Эта строчка должна определить какая строка больше и укоротить её до размера destination.
Снимок экрана от 2021-10-11 20-17-29.png45 Кб, 620x487
105 2180567
>>180566
пикча тут
106 2180579
>>180567
Такие махинации возможны в пределах одного массива. Точно не помню, но стандартом гарантировано, элементы массива распололжены в памяти последовательно, поэтому адрес n-1 элемента меньше/больше это зависит от системы адреса n-го элемента на определённое число байт.
107 2180582
>>180560
Скомпиль с оптимизациями.
108 2180594
>>180579

>меньше/больше это зависит от системы


бля, обосрался. Стандарт гарантирует, что адрес меньше.
109 2180596
>>180579

>адрес n-1 элемента меньше/больше


меньше

>на определённое число байт


на sizeof элемента, если приводить к char #
110 2180621
>>180566
там же memmove написано. если адрес dst больше src, значения пишутся типа от конца, если нет, то к концу.
len может быть любым неотрицательным, но есть риск записать больше и что-нибудь испортить.
Алсо, не ясно, что происходит при перекрытии адресов в ходе записи.
111 2180624
>>180621

>значения пишутся типа от конца, если нет, то к концу.


конца же два поэтому
В сторону уменьшения адресов, иначе в сторону возрастания.
112 2180639
Чел с программой по хордам.
Оказывается, что в методичке неправильно указан метод хорд, потому программа и улетает в цикл. Заебись/10.
113 2180732
как разбить массив uint8_t на массив по 6 бит? т.е. как из 8-битного массива брать по 6 бит по очереди?
114 2180871
115 2180874
>>180871
stdarg
116 2180897
Аноны, привет.
В си есть какой-то быстрый метод перевода числа из любой системы (условно n), в десятичную? Интересно как это тут работает
117 2180899
>>180897
long n;
scanf("%ld",&n);
printf("%ld", strtol(n, NULL, 16));
118 2180903
>>180899
Как это скомпилировать? Ошибку выдает
119 2180925
>>180899
Спасибо, отличная идея. Написал прогу по твоей наводке, но немного изменил.

n - так получал:
fgets(n, 30, stdin);
53421225.jpg207 Кб, 774x894
120 2183331
>>165466 (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.
121 2183601
>>183331
В составе стандартной библиотеки armcc есть _membitcpybb() и сопутствующие, но это не является частью стандарта. Погугли, может кто-то запилил кастомную реализацию.
122 2183611
>>183331
Я делал на питоне частный случай, когда битовое поле помещается в целое. И то получилось громоздко.
123 2184277
>>183331

> Приходится писать отдельную логику


Страшно-то как. Так же как и в реализациях memcpy: если хочешь быстрое блочное копирование, ты пишешь отдельную логику (читай: побитовое копирование или ебля со сдвигами и переменными-аккумуляторами) для невыровненной части данных в начале и в конце. Другого не дано.
124 2184529
>>183601
>>183611
>>184277
Если кому интересно, вот такое решение получилось:
https://pastebin.com/Wh1KM5dN
125 2185200
>>184677 (Del)
Что бы ты сделал по-другому?
14492277033450.png344 Кб, 500x675
126 2185736
Подскажите, плез, что получается при обработке 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

Это тоже самое, что подсчитать кол-во символов в массиве?
127 2185771
>>185736
Да, но в идеале надо ещё делить на размер элемента массива, если размер каждого элемента массива больше минимально адресуемой единицы памяти.
128 2185799
>>185771
Ок, спасибо.
129 2187417
>>184529

>int Δ =


Это же шутка?
7cNZbGzASyY.jpg198 Кб, 960x830
130 2187992
>>187417
Нет, вот это - шутка
131 2188348
Ребяты, я пишу на многих языках, а с этим наверное надо в С++ тред, но тем не менее - молчать не могу.

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

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

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

Кажись выговорился. "Энерпрайз" - говно.
1399552739288o0sm1.png407 Кб, 1278x913
132 2188360
>>188348

>Minecraft


Ты просто дебил и нихуя не пони маешь.
Именно говноджава дала возможность
1) делать моды
2) несмотря на истеричную РРРРЯЯЯЯЯЯ сначала жирного пидора а потом и мелкомягких они все, конечно, утверждали что моды норм и совсем не бомбит - очень смешно выглядит это всё
То есть манякампф состоялся исключительно благодаря говняве.
Вот такой вот дерьмовый мир.
Убей себя.
133 2188378
>>188360

>Убей себя.


Сначала тебя.
b5b32c8fab1f2a6df76b19b603984fc4.png2,4 Мб, 1920x1280
134 2188382
>>188378
Благодарю.
изображение.png680 Кб, 566x800
135 2188414
136 2188417
>>188412 (Del)
Мертвый язык, а работа на ней то еще болото
да я пишу это в С треде
137 2188419
>>188412 (Del)
лучше сишарп
138 2188539
>>175027
Пока нет. Надо ждать С23.
>>188348
Поставил бы просто оптифайн или аналог и не парился бы
139 2189177
а че там в С23 пиздатое что-нибудь завезут? если кто знает, плиз краткий пересказ в студию. То лень искать читать эти спеки, я просто любитель хелоуворлды на си пописать не более.
140 2189245
>>189177
Transactional memory (n1961), асинхронщина на уровне языка (n2017). По мелочи - атрибуты функций теперь будут в стандарте, а не расширением GCC, неименованные параметры функций, decimal типы.
141 2189826
Почему в КиР ничегошеньки о функциональных поинтерах?
142 2189873
>>189826
Потому что k&r вышла за двадцать лет до первого стандарта, в котором были функциональные поинтеры.
143 2190109
Тред по крестам тонет в бамплимите, поэтому спрошу тут.
Я правильно понимаю, что если начну учить кресты, то фактически смогу кодить и на обычной сишке и учебники непосредственно по Pure C НИНУЖНЫ, или это осталось давно в прошлом и после плюсов, если захочу пощупать просто Си, придется листать учебники по нему?
144 2190212
>>190109
Это разные языки с разными паттернами, все

Учебники наверное не так важны как просто код на гитхабе читать, чтобы видеть как идиоматичный код на обоих языках пишется
image.png30 Кб, 1258x166
145 2190267
>>190109
С++ слишком высокоуровневый. Вопреки сложившемуся мнению, что Си мешает учить С++ (а он действительно мешает), ты не сможешь оптимально писать на С++, не зная Си.

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

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

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

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

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

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

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

>1. Ассемблер(ы)


Двачую. А то вырастают люди, не знающие нюансов сдвига отрицательных чисел.

>2. Современный Си.


А с какого года начинается современный и чем плох C89?
147 2190883
>>190811
С 99, как минимум. C89 - архаика, деревянные игрушки к полу прибитые.
148 2191188
>>190267
Спасибо.
И еще вопрос: нахуя так много учебников? Касается как просто C, так и C++.
Видел, как люди успешно вкатывались в язык после одной-двух книг, но также видел мнение, что без чтения минимум 10 штук ты хеллоуворлдщик.
Например, если у C я решу пройти K & R и, возможно, Прату после него, то что я потеряю если не буду читать остальные книги из шапки?
То же самое с крестами - неужели Липпмана, Праты и Шилдта будет недостаточно? Опять мнения разделились и кто-то говорит, что после одного только Страуструпа для ньюфагов успешно работали над сложными проектами и вообще стали профессионалами в языке, а кто-то говорит, что это только примитивная база, которой недостаточно, и нужно еще штук 20 книжек прорешать.
149 2191241
>>187992
Почему в конце нет endl? Я что, как долбоеб, должен смотреть на
апельсинарбузвишняклубникаананаспомидорanon@pc123:~/codefrom2ch$ _
?
Алсо, нахуя false через функцию возвращать, и вообще нахуя вот это вот с ифом? enum, кстати, вообще не используется.
150 2191246
>>191188
И ещё вопрос: нахуя так много лекарств?
Видел, как люди успешно вылечивались после одного-двух, но также видел мнение, что без долгой терапии минимум 10 таблетками ты помрёшь.
Например, если я решу выпить кетопрофен и, возможно, азитромицин, то что я потеряю если не буду пить остальные таблетки из ЖНВЛП?
151 2191260
>>191188
Идеальных книг не существует, анон, потому что у каждого свой бэкграунд, и могут быть как пробелы в знаниях, необходимых для усвоения нового материала, так и "лишние" знания из других источников, из-за которых некоторые главы книги будут скучными. А пишется книга не для тебя, не для меня, и даже не для ОПа, а для десятков тысяч студентов. У тебя никогда не было чувства, когда тебе кто-то что-то неравнодушно объясняет, что этот чел умнее любого хорошо продаваемого автора? А он всего-навсего лучше попадает в твои слабые места. С книгами же придется выбирать. Либо берешь хардкорное чтиво и активно гуглишь непонятное, либо берешь исчерпывающий томик на 1000 страниц и пропускаешь хорошо знакомое, бегло ознакамливаешься с частично знакомым и вдумчиво останавливаешься на качественно новом материале. А такое избыточное разнообразие естественно при свободном (да-да, "свободном") рынке. ИМХО, прям от корки до корки, как первоклассник, читать надо ровно до тех пор, пока не начнешь комфортно плавать в области, а там уже сам разберешься, где хороших практик подсмотреть, где про матчасть какой-то штуки полистать и т.д. и т.п.
152 2191264
>>191188
Я >>191260 другой анон, если что
image.png22 Кб, 690x393
153 2191301
>>180732
Берешь и делоешь. Не тестировал.
154 2191681
>>191241
Там еще и опечатка в 31 строчке.
155 2191801
Аноны, а что думаете о книгах/учебных пособиях издательства O'Reilly? Конкретно: Head First C: A Brain-Friendly Guide. Реддиторы её регулярно рекомендуют новичкам. Как для совсем ретарда, который ничего сложнее примитивных баш и питон-скриптов не писал - не лучше вариант, чем то, что в шапке?
156 2191839
>>191801

> что думаете о книгах/учебных пособиях издательства O'Reilly


Хорошие.

> Конкретно: Head First


Хуйня.
157 2191921
>>188491 (Del)

>отлов эксепшенов


МК, нет эксепшенов - нечего отлавливать
158 2192494
>>189177
Обещают завести лямбды и typeof. Может хоть теперь можно будет воспользоватся макросами нормально.
>>190811
Тем что там по крайней мере завезли нормальные типы целочислиных с нормальным размером, restrict, анонимные структуры и юнионы, static assert. Есть ещё потоки, но они нигде из коробки не работают.
159 2192500
>>191801
Можно с таким же успехом на сололерн курс по Си посмотреть.
160 2192503
>>192494
>>189245

>асинхронщина на уровне языка


>Обещают завести лямбды


наконец-то можно будет как на жаваскрипте писать, каааеф
161 2192504
>>192494
>>189245
неймспейсы лучше бы подвезли и интерфейсы
162 2192784
>>192494

>Лямбды и typeof


В принципе смотрю добавляют все то, что в gcc было сделано расширениями. И эти штуки не исключения. Можно сделать лямбды на базе gcc nested functions и typeof в си через расширение там тоже есть.
163 2192815
>>192784
Проблема в том что в gcc вложеные функции запилены через костыль который даёт немножко ебёт безопасность.
164 2192834
>>192815
Стандарт тоже можно реализовать как угодно криво.
165 2193134
>>166845
стивен прата норм учебник
166 2193282
>>192834
Дело в том что обычные вложеные функции требуют либо костыль, который отключает no execute бит, либо менять ABI. Ну или можно
а) никогда не брать адресс функции
б) не использовать в фунции адреса внешних функций
Лямбды какбы обходят это. Плюс анонимность лямбд полезна при написании макросов или когда надо отправить одну фунуцию в qsort. Вообще об этом можно почитать здесь https://medium.com/program-practical/blocks-procs-lambdas-oh-my-8c636a54757c
167 2193496
братишки, почему при первом curl_easy_init все норм, но когда присваиваю к полю структуры получаю сегфолт?
168 2193503
>>193496
аа забейте, я супер еблан, я же к какой-то рандомной не инициализированной памяти что-то присваиваю
169 2193516
Ребзя, посоветуйте студентоте учебник по си на русском. Желательно, чтобф подробно было
170 2193587
>>193503
Быстро ты разобрался. Одобряю.
171 2193657
>>193516
шапку глянь
172 2200838
Аноны, привет
Хочу подключиться к порту динамика и работь с ним как с потоком, то есть я посылаю какую-то частоту и она воспроизводится через динамик. Все это я бы хотел сделать используя язык Си на Windows, не подскажите как это сделать или можете скинуть литературу, статьи или другие формы источников, а то я пытался найти решение как на русском, так и на английском, но ничего не нашел, буду очень Вам благодарен.
173 2200847
>>200838
winapi, документацию найти несложно.
174 2200851
>>200847
Можешь, пожалуйста, точно сказать как именно это искать, чтобы именно хуйню не найти?
175 2200933
>>200851
может за тебя ещё и код написать
176 2200953
>>200838
Можно использовать http://sox.sourceforge.net/ И никакого winapi не потребуется, тупо в stdout писать отсчеты и всех делов то, проще некуда. Но это конечно смотря для чего тебе все это нужно.
177 2201004
>>200851
Не ебу, что ты хочешь. Для винды есть wasapi, directsound, winapi, плюс сторонние либы.
Ты хочешь типа вывод на аудио перенаправить? Чтобы писать write(fd,buf,c)?
178 2201241
>>201004
Да-да-да, анончик, именно это
179 2201353
>>193496
Обращение к несуществуему участку пвмяти
180 2201365
>>201241
Если так, то я тебе уже писал >>200953 прямо так и работает.
Вот пример того как оно работает подобным образом https://www.reddit.com/r/RTLSDR/comments/4jt4uk/transfer_sdrsettings_to_rtl_fm_sox/
182 2201514
Может кто сталкивался с vulkan.
Он я так понял написан на C99 и если его используешь, то уже, как я понял, нет смысла брать C89?
183 2201554
>>201514
Лучше взять плюсы.
184 2201587
>>201554
на плюсы проект переводить никто не будет, а вот повысить стандарт с 89, который сейчас используется, до 99 - это возможно. Поэтому и спрашиваю
185 2202402
>>201554
Учусь в ВУЗ'е и я дегенерат, почти не шарю за языки, почему все так хвалят ООП и С++, если это говно лютое, говорят, что код легче писать, чем в структурном программировании, но типо все равно же если какую-то деталь меняешь/добавляет код переписывать нужно?
186 2202404
>>202402
Сам очень люблю Си, как и многие, но, конечно, знаю где-то на 3%, все его охуенные фичи не знаю
187 2202449
>>201514
В msvc поддержки c99 почти что нет, поэтому вулкан должен работать и с c89
>>202402
Абстракции легче строить. Попробуй фп, там похожие ощущения, и не потому что не надо думать о модели памяти, а потому что абстракции строить и поддерживать проще и удобнее.
В низкоуровневых апи, как вулкан, много бойлерплейта, от которого можно частично избавиться с помощью абстракций.
>>202404
Какие охуенные фичи? ub?
188 2202457
>>202449

> В msvc поддержки c99 почти что нет, поэтому вулкан должен работать и с c89


да в msvc уже давно C11 завезли
сейчас проверил покомпилить с vulkan, там все комменты в стиле C99 написаны, поэтому как минимум их придется тогда менять во всей либе, глубже пока не раскапывал
189 2202464
>>202449
Всех особенностей языка, ну, могу немного работать с паматью, но вот на потоках(если не считать работу с бинарками и текстовыми файлами) остановился.
Как кстати узнать свой уровень владения языка?
190 2202649
>>202457
Ну как давно, год назад, в самой последней версии студии. Это ж майкросовт, ёбаный рот.
15740954723560.jpg55 Кб, 750x1000
191 2203577
Есть какой-нибудь калькулятор паттернов regxep в Сишечке?

После пистона, BRE - лютая агония.
Начинаю думать, что городить велосипед на основе функций из string.h - не такая уж и плохая идея.
192 2203579
193 2203596
>>203577
Что ещё смешнее, в питоне весьма каличные регулярки.
194 2203599
>>203596
По сравнению с чем, блядь?
Если с джаббой, то может быть.
195 2203633
>>203599
с тем же растом, например
196 2203653
http://cmustdie.com/
Дано подробное объяснение, почему Си нужно закопать.
197 2203654
>>203653
https://youtu.be/3pKL4YEa4_Y
Подробное объяснение от Александра Викторовича Григорина, почему Си будет актуален ещё лет 50, как минимум.
198 2203709
>>203653
себя закопай петух
лучше си и асма ничего нет
а уж когда компы на кубитах попрут вот тут то петушки вы и соснёте
200 2204526
201 2204663
>>204526
Почему уничтожающих? Наоборот, подробно расписывают один из самых крутых механизмов языка. Если ты его не осилил, это ещё не значит, что си "уничтожен".
202 2205060
Господа программисты помогите распутаться.

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

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

тип long
203 2205072
>>205060

>пердуина


Твоя дурина это AVR (а они далеко не все на AVR)?

>усрется сдвигать


Если у тебя AVR и ты загрузишь свои 6 байт в uint32_t, а потом сдвинешь на один бит вправо, то получится примерно вот такая последовательность команд:
lsr r1
ror r2
ror r3
ror r4
Номера регистров конечно могут быть другими. Каждая из этих команд выполняется за один такт. Ну и поскольку тебе нужно сдвинуть на три, то эта последовательность будет повторена три раза, может быть в цикле. Итого ну максимум тактов 20 в худшем случае, не считая загрузку-сохранение. Ахуеть как много! Да у тебя на загрузку одного байта из ОЗУ тратится три такта.
204 2205075
>>205060
Не знаю почему ты решил что сдвиг это сложная операция, но разрешите доебаться.
Чтобы отбросить три десятичных разряда действовать нужно нихуя не сдвигом.
205 2205079
>>205072
Спасибо, но я пошел другим путём я поделил на коэффициент и забил хуй

>>205075

>нужно нихуя не сдвигом


ну так научи
206 2205089
>>205079
Разделить на 1000, это ты правильно догадался.

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

>1000


а ты не очень умный, я думал будет лучше
208 2205101
>>205089

>как у вас в принципе хоть что-то работает


У меня отлично работает потому что я не программист
209 2205136
>>203653
Ну и чтиво, конечно... Помню, как-то сам напоролся на strict aliasing с полями структуры и кастом в void, если не изменяет, и анон итт посоветовал мне не страдать хуйней, если не

>знаешь что делаешь и умеешь в -fstrict-aliasing


но я с самоуверенностью Даннинго-Крюгернутого продолжал пукать в ответ на критику UB. Теперь стыдно стало. Прости меня, двачик, за нехорошие слова.
image.png19 Кб, 556x306
210 2205141
Бля, это внатуре пиздец какой-то. Есть какой-то гарантированный набор флагов, который исключит всю эту хуету и заставит программу вести себя так, как я думаю?
image.png77 Кб, 612x636
211 2205149
Блядь, да вы ебанулись, идите нахуй с таким Си ебаным, воистину лучше уже вернуть совок и посмотреть, какой ЕГЯП (единый государственный язык программирования) сделали бы, чем такие приколы.
212 2205445
>>203862
А при чем тут LISP?
213 2205608
>>205149
Пиздец, на картинке сравниваются два указателя - один в сегменте данных, другой на стеке. Они по определению не могут быть рядом.
214 2205615
>>205149
А здесь попробуй вычесть единицу, а не прибавить. Но никто тебе не гарантирует что указатели будут лежать рядом. Ебаный компилятор может их положить как угодно в стеке, как он сочтёт нужным.

А вычесть вместо прибавления потому что стек растёт в сторону уменьшнния адресов.
215 2206362
>>205100
Чел.. Ты разделил на 100016 т.е. на 409610. Оставить ссылку на википедию по системам счисления или сам найдешь?
image111 Кб, 650x796
216 2207236
++
217 2207367
>>207236
А в чем прикол? В том, что по наивному ожиданию результат будет 4 независимо от порядка выполнения первоочередных выражений с их сайд-эффектами? Сайд-эффект же, вроде, вообще не обязан выполняться до ближайшей запятой или точки с запятой?
218 2207454
нуб в треде.
а если malloc вызвать внутри функции и передать указатель на этот участок памяти из этой функции то будет ли эта память защищена от изменений или это UB?
220 2208922
Можно ли как-то с помощью макросов или иной магии сделать так, чтобы расширять enum из разных точек программы.

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

Вроде как это технически нереализуемо, но может все же я что-то не учел.
221 2209322
>>205141
а нахуя использовать флаг который незнаешь что делает в функции с 1 принтф?
image20 Кб, 333x179
222 2211447
Почему третий принт выводит -1 если переменная беззнаковая?
223 2211453
>>211447
Потому что %d
224 2211508
>>211453
Это же просто формат вывода. Как он влияет на значение переменной?
225 2211511
>>211447
>>211453
Бля, я эбал эту сишку.
GCC с тем же кодом выводит обещанные 65535.
А MSVC выводит -1.
226 2211517
>>211511

> MSVC


потому что этим лучше не пользоваться
для винды юзай MinGW-64
227 2211525
>>211508
Они хранятся одинаково, но один бит для знака отрезается. Поэтому надо указывать, знаковое оно или беззнаковое.
228 2211547
>>211525
Хм.. Звучит логично. Но почему тогда GCC и MSVC выдают разный результат?
229 2211634
>>211547
Потому что разные реализации printf, очевидно же.
Ещё раз, всё, что делает msft - кал.
230 2211784
>>211547
Потому что %d это знаковый формат, а пердоговно кривое как всегда, им лучше не пользоваться.
c.png19 Кб, 1576x446
231 2212766
Почему при некоторых значениях (вроде бы когда последний элемент выдает NULL, но тоже не всегда) делает print еще один раз?
232 2212888
>>212766
Функция getenv

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

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

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

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

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

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

Зависимые функции
system()
233 2212933
>>212766
Потому что твой цикл по vars - это типичное UB (пункт 6.5.6 C99, параграф 8), а после UB в программе может происходить всё, что угодно.
234 2212961
>>212933
но у меня C89
235 2213224
>>212961
Значит 3.3.6
236 2213260
>>213224
Спасибо, столько UB пока не получается удержать в голове и помнить
237 2213276
>>213260
Пожалуйста. Уж "не ходить за границы массива", мне кажется, можно как-то уже запомнить.
238 2213341
>>213276
Просто для меня не было очевидным где он тут выходит за его границу, поэтому и не понимал сначала. Еще раз спасибо
239 2214228
>>165466 (OP)
Хочу считывать из stdin самый свежий символ. При этом после того как считал записываю null чтобы если пользователь ничего не нажал я в следующем вызове в ответ получил null и ждал пока он таки сделает ввод. Но оно почему-то не записывает null, или я читаю не самый свежий ? Помогите пжлст
screen.webm1,5 Мб, webm,
1920x1080, 0:14
240 2214237
241 2214238
>>214228
С чего ты взял, что ты можешь писать в stdin?
242 2214240
>>214238
в смысле с чего? А что не могу?
243 2214244
>>214240
>>214238
почитал интернеты. Походу действительно нельзя. Тогда буду сдвигать чтение на 1 влево и проверять совпадает ли текущий с предыдущим. Если не получится выйду на связь
image.png31 Кб, 1000x309
244 2214289
>>214244
Вот этот вариант работает. Пущу ее в отдельный тред и будет заебись
245 2214375
Аноны, привет. Месяц как вкатился в си (первый яп), но на указателях понял что нихуя не понимаю как работает компьютер и на решении банальных задач (codewars, etc.) не могу продвинуться дальше. Можете посоветовать чтиво по компьютерам в целом, или что сами паралелльно читаете си?
246 2214399
>>214375

> но на указателях понял


А чего всех так пугают эти указатели? В свое время изучал си как первый яп по базовому курсу c++ от шилдта и все было ясно с первого раза. Может тебе лучше в python?
247 2214556
>>214289
Мне нравится эта poopy brownтема. Как называется?
248 2214654
>>214375
Ну вот у тебя есть ящик, в котором ты можешь хранить утюг. Сам утюг в этом ящике - это значение твоей переменной. А номер на ящике, чтобы ты его нашел из кучи других ящиков на полке - это и есть указатель.

>>214399

> Может тебе лучше в python?


не советуй каку новичкам
image.png209 Кб, 1918x1052
249 2214701
>>214654

>не советуй каку


пока молодые шутливые питонисты получают 300кк дата-сциентистом и ебут сочных зумерш-тестировщиц, сишники пердолятся в срачечку с говнолегаси на пару с петровичем из НИИ-ХУЯ
>>214556
gruvbox-material
250 2215182
>>214701
вот это у тебя фиксации))
image.png392 Кб, 477x593
251 2215223
>>215182
есть такое, жизнь потрепала :)))
252 2215251
>>214701

>пока молодые шутливые питонисты получают 300кк дата-сциентистом и ебут сочных зумерш-тестировщиц, сишники пердолятся в срачечку с говнолегаси на пару с петровичем из НИИ-ХУЯ


Пиздец, что ты с таким мышлением в Си-треде забыл, болезный? По твоей логике обычный васян или хач, которые по КД солевых шмар ебут - это высшая стадия человека и предел мечтаний.
Микроконтроллеры С stm cmsis Джорно 253 2215253
Я учу embedded на си без hal на чистом cmsis посоветуйте
254 2215255
>>215251
ну извините, ухожу обратно в /b деградировать
255 2215517
а вот если допустим объявлена в коде структура A
дальше по коду можно как-то макросами/директивами чекнуть объявления ли она?
типа:
#ifndef A
printf("NO");
#endif
256 2215525
>>215517
Нет, макросы раскрываются препроцессором, который кроме лексического анализа и некоторых преобразований ничего не делает

Но можешь оформить заголовочник подобным образом:
#ifndef STRUCT_A
#define STRUCT_A
struct A;
#endif
а потом уже в коде:
#ifndef STRUCT_A
printf("NO");
#endif
257 2215526
>>215253

>посоветуйте


Советую libopencm3
258 2215847
>>214701
Проеграл с кода.
259 2215881
>>215847
а что не так?
260 2216042
>>215881
Как там while прерывается?

мимо нуб
261 2216097
>>216042
а он и не должен, в начале мейне detach. Эта функция нужна до конца программы
262 2216267
>>215881
Нет смысла брать мутекс, который auto переменная.
263 2216290
>>216267
Подождите, mutex нужен чтобы определенный участок кода мог выполняться только из одного треда. Зачем мне статический объект mutex'a ?Я должен что-то с ним делать из другого?
264 2216291
>>216290
из другого треда?
фикс
265 2216297
>>216290
Проеграл опять. Читай литературу.
266 2216304
>>216297
Блять, ты тролишь что ли?На стековерфлоу пишут именно так. Если ты экспэрт то просвети тупого
267 2216314
>>216304
Ссылку давай - еще смеяться буду.
269 2216327
>>216317
Ну так он там static. Каждый поток увидит один и тот же экземпляр мутекса - и только так они смогут синхронизоваться (shared state).
270 2216338
>>216327
т.е ты хочешь сказать что auto mutex это бред т.к, если я запущу два треда на эту функцию, будет 2 отдельных не связанных между собой mutex'a. Ну ок, звучит логично, пойду поправлю
271 2217577
почему для билда програми обычно юзается мейк либо какая-то петушиная херна поверх мейк. почему нельзя тупо в башскрипте накидать билд скрипт который соберет проект?
272 2217578
>>217577
можно
273 2217584
>>217577
А потом ты в своём проекте из миллиона файлов поменяешь один .c-шник, и твой петушиный скрипт либо обосрётся и будет заново всё пересобирать, либо обосрётся и ничего не будет пересобирать, бинарник вот же он, готовый лежит.
274 2217592
>>217584
ну да, в этом случае башскрипт делает сасай, чет я не подумал. Я просто хеллоуворлдщик, мб поэтому не подумал
275 2217666
>>217577

> почему для билда програми обычно юзается мейк


потому что это стандарт такой по умолчанию, чтобы везде люди могли собрать его под любую ОС и чтобы синтаксис все знали
поэтому сейчас пишется только CMakeLists.txt, а все остальное уже само делается под нужную систему: хоть яблоки, хоть андроиды (да, они тоже уже на make как альтернативу перебрались)
276 2217686
>>217577
На самом деле мейк могли написать на шелле, но проще это было сделать на С.
277 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:
я даже свежий скомпилировал - всем похуй или проблемы на самом деле нет (/решается)? но я вроде прочитал хелп.

может есть что-нибудь пободрее, но без платы шекелей? а контрол кстати плотный тул, ни одного фелзпозитив не словил ещё.
278 2218408
>>218407
и как это обычно бывает, сходу решилось. не увидел что у этой ошибки есть тег, по которому можно заигнорить. я думал что это и не ошибка даже, к тому же в хелпе: Suppress a specific warning.

cppcheck -v --enable=all --suppress='noValidConfiguration' --force --std=c89 --std=c99 --std=posix --platform=unspecified > /tmp/cppcheck.log 2>&1
279 2218428
>>218408
а не, он просто игнорирует вывод. чтож, придётся опять выкинуть.
280 2218458
cppcheck детектит лучше ПВХстудии?
281 2218592
>>218458
Нет конечно.
282 2218902
>>218428
потыкал ещё и похоже упёрся в то, что и прежде. например, у меня много проверок на случай если какого-то типа нет или он не того размера - #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



>>218458
не пробовал линтер жидов. откуда у сишника деньги?
283 2218927
>>218902

> откуда у сишника деньги?


Чиво нет? В Корее тебе бы платилил весьма неплохо. В Южной.
284 2219028
Кстати, а что мешает в С ввести в каком-нибудь новом стандарте обобщенной программирование? Синтаксис там элементарный, ничего не ломается при этом, шлепается легко поверх старого кода.
Ну имеется ввиду не то, что там этот _Generic ввели, а хотя бы уровня слизанного с плюсов (или даже выше)
285 2219040
>>219028
шаблоны можно(и делают) сделать через инклюд файла.
286 2219043
>>219028
Что тебе не так с _Generic?
287 2219083
>>219043

> Что тебе не так с _Generic?


например, нужно реализовать библиотеку для векторов, ну что-то аналог STL, сейчас есть вариант только накрутить это все через макросы в очень неудобном виде, что нужно в стороннем коде при использовании этой библиотеки для создания вектора своей структуры:
1) задекларировать такой вектор
2) объявить переменную для такого вектора
3) инициализировать вектор
и потом уже очень неудобно работать

ну теперь пробуем применить _Generic, как написать через него вектор произвольного типа с общим поведением? Допустим какие-то мы объявили в этой библиотеке, ну а пользователь в своем коде что должен делать?
288 2219215
>>219083
Используем магию ##
289 2219238
>>219215

> Используем магию ##


ну это и был единственный, но очень кривой вариант, для написания подобной либы у нас, но чтобы оно работало через синтаксис макросов в этом виде - уж больно много ненужного хлама дополнительно генерится в асм выхлопе, поэтому и был такой крик душа, что когда уже..
деструктор бы еще, ну хоть defer может все же скоро завезут
290 2219280
>>219083
не знаю что там в stl (поэтому возможно пишу глупости), но вектор (геометрический) специфичная же штука. вот например у меня 16 бит на дробь и 16 на целое, как поможет то, что я его объявлю типом long? остальное же: списки, очереди - они не зависят от типа.
291 2219361
Привет, аноны, пришел к вам за помощью. У меня имеется 300-350 бинарных файлов весом по 300мб каждый. Необходимо распарсить эти бинарники и записать в большую таблицу для дальнейших преобразований(с парсингом я офк справлюсь и сам), но вот с большими файлами я не работал. Если писать все данные в кучу, то у меня не хватит оперативы. Как изьебнуться и обьединить все 300 файлов в одну таблицу, при этом нагружая оперативку в разумных пределах?
292 2219364
>>219361
man 2 mmap
293 2219365
>>219361
Писать в буфер, из буфера в файл. Это же классическое решение.
294 2219372
>>219365
Ну вот смотри, например, у меня есть слой(таблица из 100 записей) и я их занесу в буфер. Допустим, что таких слоев в файле 10, которые я буду записывать в буфер по мере необходимости. Мне нужна возможность переключать эти слои в двух направлениях(представляю как реализовать), а как быть после простотра последнего слоя в файле? Тупо переключать файловый поток на следующий/предыдущий файл? Или же есть более трушное решение.

>>219364

>nmap


Вот это уже выглядит ближе к теме, пойду курить маны.
295 2219383
>>219372
Сделай базу в любой субд (в том же mysql), загони туда свои данные, выгрузи в файл.
296 2219531
>>219383
Или так, да. SQLite попроще будет.
297 2219532
>>219531
Кстати sqlite на роботе пригодится или это чисто для хобби-проэктов?
298 2219534
>>219532
Пригодится, если у тебя не высоконагруженная имиджборда 10k соединений в наносекунду
299 2219892
>>219280

> не знаю что там в stl, но вектор (геометрический) специфичная же штука


да, речь шла про вектор как один из видов контейнеров (например, vector в C++)
300 2219900
>>219892
аа, вспомнил. memory pool типа
301 2220226
>>219900
Нiт. Это динамический массив.
sage 302 2222398
Тред умер.
303 2222461
>>222398
да здравствует тред
304 2222526
Как можно подключить библиотеку скаченную с гитхаба? Как скомпилировать чтобы всё заработало? На линуксе. У меня ubuntu. Я бы хотел скачать библиотеку GUI лёгкую, простую, и сделать простую программку, скомпилировать её под windows также.
305 2222814
>>222526
Там всё пишут.
306 2222840
Знаю Си, кодирую пока что простые проги и алгоритмы изучаю. Собираюсь после уверенного знания Си перекатиться в кресты, алсо решаю задачки и т.п в общем применяю на практике алгоритмы. Вопрос господа: У меня аттестат среднего общего, везде требуют блять высшее и минимум год работы и неебические знания. Как найти работку чтобы набраться реального опыта? Мне пиздеть в резюме? Посоветуйте анончики что делать та.
Может написать какие нибудь проги в портфолио, или на гите искать работу? ДС2 23 годиков. Вообще хочу игры кодить, но есть желание в будущем системками заниматься.
307 2222841
Простите за ебанутый слог я сейчас в тяжелом положений. Если можете направить куда нибудь где объяснят как искать работу в любимой сфере деятельности буду признателен.
Я просто хочу сидеть и кодить сутками.
308 2222844
>>222840

> Собираюсь после уверенного знания Си перекатиться в кресты


Так и учи кресты, это разные языки.
309 2222849
>>222840
Слишком размыто ты написал. Какие задачи решаешь, какие алгоритмы изучаешь? В какую сторону планируешь развиваться? У меня ощущение, что ты фундаментальные вещи сейчас учишь, не более.
Неебические знания включают в себя, например, анализ сложности алгоритмов, всякий разный матан, короче, то, что учат в вузиках. В принципе, это можно и самому освоить, но будет сложно.
И да, пиши сразу на крестах, выучишь ооп, научишься всякие шаблоны проектирования делоть.
310 2222852
>>222849
Именно так, база. Хочу поступать на физмат, но нужно работать. Алгоритмы очень базовые, а еще всякие ADT. Закончил Пратовский учебник и сейчас тонкости языка изучаю, а еще либу стандартную ну и дебагер. Алгоритмы по известной книжке пытаюсь писать сам на Си, на c-faq нашел много инфы, но вот практический опыт надо где-то брать.
Спасибо анонче, буду кресты изучать.
311 2222872
>>222852

>физмат


Это если ты потом хочешь в машоб идти, речёрчами заниматься или еще что-нибудь матаноёмкое. Ну скажи, нах тебе, программисту, знать функциональный анализ или какие-нибудь сплайн-аппроксимации? Если пилить игры, то это пригодится для разработки движков, что весьма специфично при наличии тонн готовых. Если системное программирование - тебе нужны знания об архитектурах, ассемблерах и битоёбстве, что на физмате тоже не очень хорошо изучается. Тебе матан или ехать все-таки?
312 2222906
>>222872
А на кого мне пойти учиться в вузе если я в геймдев пойду? Дико интересно было кодить симуляции с кружочками и платформеры. Какой нибудь software engineer? Посмотрю сегодня еще раз опции в МФТИ. В любом случае если в будущем будет интересно продолжить изучение матана, уже хотя бы будет понимание. Программировать дико интересно.
На данный момент у меня 9 классов в 23 годиков и в этом году хотел закончить школу экстерном, но материала оказалось много особенно по математике, в этом году собираюсь все догнать хотя бы до линейной алгебры и в следующем сдавать.
313 2225275
Адекватна ли подобная практика, не нарушает какой-нибудь strict aliasing rule? Переданный в loop() указатель на user передаётся в handler(), и я пытаюсь через этот указатель структуру передать.
https://pastebin.com/PvKsrJY3
314 2225355
кто шарит за драйверы в линукс? Пишу драйвер блочного устройства

Как зарегистрировать драйвер на шине в sysfs?
Как зарегистрировать устройство на шине в sysfs?
Реализовал ioctl интерфейс, как теперь обращаться к нему в запущенном драйвере? Отправлять команды?
315 2225406
>>165466 (OP)
Что сделать чтобы антивирус не пиздел на запуск кода в Code Blocks?
316 2225495
>>225275
Контест передавай через войд звездочка, и будет тебе счасте (касты писать не надо, поведение определенное, код идиоматичен).
317 2225558
>>225495
Спасибо, всё работает как надо, правда компилятор ворчит на incompatible pointer type, потому что коллбэк должен принимать unsigned char звёздочка первым аргументом, a loop() - последним. По логике можно игнорировать, но напрягает немного.
318 2225637
Сильно ли плохо, если я в Си сделаю структуру с функциями в качестве мемберов, для некоего подобия "классов"? Ну, фактически прсто соединю функицю-обработчик и передаваемые ей данные в "стандартизированном" формате, для как бы интерфейса? Типа вот такого — https://ideone.com/GaxwyK ?
319 2225706
>>225637
если тебе по задаче это требуется - нет не плохо
320 2225904
>>225637
handle - дескриптор, handler - обработчик, а у тебя по смыслу наоборот. В остальном вполне нормальный подход.
.png119 Кб, 1920x1080
321 2225978
>>165466 (OP)
Задаю тупые вопросы.
Правильно ли я понимаю, что если мы создаем типа динамический массив, потом переопределяем его размерность, то он может перезаписать информацию, которая могла уже быть записана по определенным адресам идущим после него, или же он переопределяет новый пул адресов и каким-то образом переносит массив?
322 2225995
>>225978

>мы создаем типа динамический массив


>переопределяем его размерность


Нет такого в С.
.png26 Кб, 957x124
323 2225996
>>225995
Я и написал типа.
324 2226001
>>225996
realloc может тебе вернуть тот же вдрес, если в блоке достаточно места. Может вернуть любой другой с копированием.
325 2226020
>>226001
Понял, спасеба.
326 2226039
>>225642 (Del)
Не, мне не столько ООП нужно, сколько просто возможность собрать несколько однообразных функций и данных в массив для итерации по нему в "общем" коде.

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

То есть, хочу избежать кучи ifdef'ов типа

>enable_wheel();


>#ifdef HAS_LIGHT_INDICATION


.>enable_light();

>#endif


>enable_sound();

327 2226106
>>226039
Засунь ифдеф внутрь enable_light(). А компилятор потом повыкидывает пустые функции.
В твоем варианте ядру придется перезаписывать pc, сбрасывать конвеер и ждать, пока новые инструкции поступят на исполнительные блоки. Хотя если производительность не важна - то пох.
328 2226230
>>226039
Всё правильно, анон. Ты почти придумал драйверы и дерево устройств.
329 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? Почему к нему обращаются с точки?
330 2227152
>>227136

>#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
331 2227432
Мужики, а как free( ) узнает, сколько точно байтов надо освобождать?
332 2227478
>>227432
сколько ты запросил у менеджера динамической памяти, когда malloc вызывал
333 2227504
>>227432
У одних есть заголовок перед тем адресом, который тебе вернули.
У других есть таблица страниц, которая говорит, на какие равные куски разбита страница.
siziy.png30 Кб, 802x333
334 2227517
Знатоки, внимание, вопрос!
Вот я создал массив на десять элементов, arr - это же получается указатель на 0 элемент. Так вот, почему в main тогда sizeof(arr) указывает 40 байт? Я понимаю, что это размер всех элементов внутри, но почему тогда в функции in sizeof(arr) равен 8? и там и там же указатель...
335 2227529
>>227517
Майн говорит, сколько он выделил под весь массив.
336 2227556
>>227517
в одном случае размер указателя, в другом случае размер массива.
Если не догоняешь, переименуй аргумент в ptr вместо arr.
image.png11 Кб, 541x93
337 2227893
https://pastebin.com/ZGSwgY73
Что я упускаю? Мне нужно в определённой структуре хранить представление целого числа в форме последовательности байт, размер числа будет храниться в ней же. При этом при попытке преобразования происходят вот такие приколы.
338 2227930
>>227893
Перед сдвигом uint8_t приведи его к типу uint64_t
На signed вообще забей - приводи его к unsigned. В твоём случае это роли не играет.
Твой код не учитывает big_endian и low_endian - при портировании на другие архитектуры получишь сюрпризы.

И вишенка на торте - раз ты забил хуй на endianness, то и циклы не нужны - достаточно поиграться с указателями и приведением к типу. Ещё и в 20 раз быстрее работать будет с тем же самым результатом.
339 2229138
>>214701
Это vim? Расскажите как вкатится в vim?
340 2229144
>>229138
Раскурить фолиант с пучеглазыми зверушками.
341 2229183
>>229138
Пройди vimtutor, а потом иди пердолить плагины.
342 2229344
>>229183
нахуй плагины
там только пару штук реально нужны
image.png15 Кб, 125x824
343 2229407
Где найти нормальную сортировку строк по цифрам, чтобы свой велосипед не писать? А то вот такая хуйня получается.
неофит
16195171483750.png1 Мб, 959x890
344 2229507
>>229407
Погугли да скопируй эти 10 строчек со стековерфлоу.
Ебать, в С-треде уже сравнение строк велосипедом называют. Что дальше, пикрил?
345 2229603
>>229507

>пикрил


Да, как-то делал на нодежс одну прогу впервый раз, и надо было получить текст из клипборда. Вместо того, чтобы вызвать нативную функцию винапи за микросекунду, эти уроды выложили в этот говностор приблуду, запускающую павершелл, потом в нем команду и берущую её результат. Еще бы блять вставили компиляцию винды из исходников сначала, что размениваться на мелочи.
346 2229631
>>229507
!== нет такого оператора
347 2229645
>>165466 (OP)
Возможно ли перекатиться в США/Европу/Китай, будучи Embedded-программистом? Я понял, что эта тема - наиболее интересная для меня из всего айти, к тому же, когда я только начинал заниматься программированием, я уже знал, что кодить можно под микроволновки/чайники/переносные устройства, и хотел заняться чем-то подобным.
348 2230222
Чем книга Ритчи и Кернигана лучше Подбельского и Фомина?
349 2230290
>>229631
поищи получше
350 2230656
>>220226
чёт я так это поварил в закромах. а нахрена тебе динамический массив? берёшь мемори пул + список, делаешь обёртку:
struct v {
size_t tsize, toffset;
list_head hl;
memory_pool hp;
};

дальше понятно.
351 2230658
>>230656
>>220226
а и, почему вспомнил. как тебе https://sourceforge.net/projects/tstl2cl/files/tstl2cl/
352 2230977
>>230222
это как сравнивать вологодское масло и маспо из пятерочки
353 2230989
>>227893
такие вещи делаются через union вообще то..
неужели это настолько сакральные знания стали а я типо мамонта-дурачка который еще что то там бормочет для вкатывающихся школьников..
354 2230993
>>226039
лучше придерживайся правила "не обобщай до пяти"
то есть для каждого случая пиши новый код
а когда таких случаев будет больше пяти то уже пытайся выделить общий код
355 2230994
>>225637
все компонентное программирование (com, gtk, и десятки других библиотек) на этом и основывается
ты идешь по тропе протоптанной десятками тысяч программистов до тебя но тебе кажеться что это дикий первозданный мир
356 2231011
>>230989
нет, ты просто тупой, если делаешь это через union.

>>227893
как-то вспомнился вопрос с рсдн лет десят назад: а зачем вы нижнее подчёркивание добавляете перед именами функций? - и я до сих пор не знаю, зачем это делают пользователи
357 2231024
>>225637
>>230994
это просто современность испортила людей, подкладывая им в постель идеологов современных стилистик полового сношения. вот и приходится робко открывать для себя, что член структуры указатель на функцию - это не ооп.
358 2231028
да я и сам после полугода плюсов и пересевши на c (заебался определять что чей метод), удивился, насколько всё просто и что совершенно не обязательно ебать себе мозги.
sage 359 2231175
>>231011

>нет, ты просто тупой, если делаешь это через union.


с хуя ли? если видишь что прогер работает с внутренним представлением чисел через смещения а не через объединения - это сразу признак низкой квалификации
360 2231291
>>165466 (OP)

> Очевидный GCC


Не могу разобраться какие флаги оптимизации следует использовать. Что юзает анон?
361 2231297
>>231291

>Что юзает анон?


Что ты там собрался оптимизировать?
-O2 вполне достаточно.
а затем strip
362 2231397
>>231297

>-O2


дженту собираешь?
363 2231412
>>231175
это мидл квалификация. юнион требует больше кода и ебли с головой - в стандарте, указатель может указывать на конец объекта, выравнивание.

но это всё в идеальном мире, где всё рационально, весь современные код как есть - это проблема переполнения знаковых таймеров времени - всем похуй.
364 2231477
>>231297
А как же -O3, -Ofast, LTO, PGO, etc?
365 2231574
>>231477
-O3 в некоторых случая может порождать более медленный код, поскольку всё что можно разворачивает и инлайнит, вследствии чего плохеет кэшам проца и может быть деградация производительности. Не обязательно это случится, но может быть. В зависимости от того, что именно ты компилируешь и как это написано. За остальные ключи ничего не скажу - у меня не было необходимости выжимать такты из кода. Предпочитаю поднимать скорость алгоритмами и стилем написания кода, это несложно, если ты понимаешь ассемблерный код, генерируемый компилятором.

Ну а ежели ты занимаешься "числодробильными" задачами, типа матмоделированием, то не пользуй gcc, а возьми компилятор от Intel - он заточены как раз под оптимизацию больших вычисленй.
366 2232242
>>231574
ты на амд то не гони, у них тоже есть компилятор.

> матмоделированием


возбуди во мне животное чувство - расскажи что это такое.
367 2232665
>>165466 (OP)
Приветствую всех присутствующих. Сейчас пишу курсовую по программированию. Gentoo, CodeBlocks, GCC.
После внезапного аварийного завершения работы компа во время редактирования кода (в компе нет батарейки, а шнур от зарядки такого говённого качества, что любое резкое движение может вырубить комп) программа вообще перестала компилироваться. Когда я в CodeBlocks нажимаю "собрать и запустить", выдаёт пикрилы.
Причём если я команд, указанные в логе, ввожу непосредственно в консоль - всё компилируется нормально. А если я то же самое делаю через кодблок - нихуя, файл .o почему-то не создаётся. Что делать?
368 2232700
>>232665
Как бы сделал я - забил нахуй на этот codeblocks и шел бы в командную строку на виме писать
369 2232705
>>232700
Дело в том, что у меня эта программа крайне криво работает, мне её дебажить нужно. А дебажить в консоли - мазохизм.
370 2232737
>>232705
Дебажь printf'ами, чё ты как баба
371 2232760
>>232665
make clean уже пробовал? Пересоздать проект и скопировать туда весь код?
372 2232795
>>232705
Отладь в Visual Studio, что ты как маленький. Наверняка же у тебя консольная программа, которой похуй - Windows или Linux. За исключением маленьких нюансов.
373 2232888
>>232705

> А дебажить в консоли - мазохизм.


а как по другому? как вы получаете трейс? у вас есть кнопочка прописывает команду из 4х букв?
374 2232889
>>232888
которая*
375 2232896
>>232888
Из каких четырёх, две же - bt
376 2232905
>>232896
это условность, зачем ты начинаешь
377 2233217
>>232705

> А дебажить в консоли - мазохизм.


вот так потом и сидят на винде и на джаве программируют
378 2233263
>>233217
Не, ну реально же мазозизм. Особливо ежели юникод. А в VS мышку подвёл и всё на виду.
379 2233637
Анон, тяжело ли найти работу программистом микроконтроллеров?
380 2233638
Вопрос один:
Вот понял я как работают указатели в C, и отсюда возникает вопрос, как в более высокоуровневых языках где нет указателей, компитятор/интерпретатор понимает, где идет речь о значении, а где о адресе?
Вопрос два:
Была такая проблема: выделяю память динамически через malloc в программе, компилирую используя gcc i686 4.8.4, запускаю - все заебись.
Далее беру тот же код, компилирую через gcc x86_64 4.8.4 - компилируется нормально, запускаю, ввожу тот же тест и получаю Segmentation fault (если заменить динамическое выделение памяти на автоматическое, то ошибка пропадает), и так не только с одним тестом, а в целом скомпилированная одной и той же версией компилятора, но под разные платформы программа просто не работает нормально. Загуглив, что такое i868 я нихуя не понял, челы с stackovwerflow пишут, что это просто разновидность x86, зачем тогда существует отдельная версия gcc под нее? правильно я понимаю, что я могу и то, и то использовать на 64-х битной системе?
381 2233702
>>233638

>компитятор/интерпретатор понимает, где идет речь о значении, а где о адресе?


ну там же есть понятие объекта и способов к нему обращаться.

> Вопрос два:


это не один вопрос.

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


хз, может ты это делаешь на 32хбитно системе.

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


это не отдельная версия, а отдельный билд.

> правильно я понимаю, что я могу и то, и то использовать на 64-х битной системе?


нет. можно, если ос имеет к поддержку (библиотеки 32хбитные и какую-то там совместимость - в теории)

но это не точно всё.
382 2233706
>>233637
Легко уехать в ЮВА, вплоть до Самсунга. В России тоже можно, но запралата будет ниже чем у "формошлёпов".
383 2233883
>>233638

>компилируется нормально, запускаю, ввожу тот же тест и получаю Segmentation fault


Классическое описание undefined behaviour. Ищи, где объебался, ворнинги компилятора, ub sanitizer и valgrind в помощь.
384 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


я так понимаю стек закораптился, но я не понимаю почему.
У меня там рекурсия, но поидее это не должно влиять, там не так уже и много вызовов рекурсивных должно быть.
385 2235569
>>235551

>if (0 < nrow < octos->rows && 0 < ncol < octos->cols)


Что по-твоему тут написано?
386 2235590

>int main(int argc, char* argv[argc+1])


Взвизгнул.

Автор, чому ты намешал все фишечки С11, не усвоив БАЗУ из книжки K&R?
387 2235605
>>230977

>вологодское масло и маспо из пятерочки


И где какое?
388 2235764
>>235569
бляааадь, а с чего я взял что так можно писать?
кажется фляга уже совсем свистит. Пожалуй сегоня без компа проведу выходной.
Спасибо, братик. Я реально хз откуда я это высрал.
Ну дела, конечно.

>>235590

> Взвизгнул.


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

> Автор, чому ты намешал все фишечки С11, не усвоив БАЗУ из книжки K&R?


Я хз, я си еще давно в универе учил, тогда мне не зашло, на отъебись его тогда сдал.
Не так давно решил узнать, что в си нового, да и старое вспомнить.
И вот как-то так вкатился заново уже с новыми фишками языка. За K&R я как-то сел , но не вхатило терпения что-ли. В сотый раз читать про что такое тип, переменная, функция супер скучно.
389 2235771
>>235551
>>235764

блядь, код все равно не рабочий, не правильные ответы дает, кекв.
image.png6 Кб, 274x182
390 2236068
Почему когда я пытаюсь вывести число как строку ("%s"), компилятор выдаёт 3221225477?
391 2236073
>>236068
undefined behavior
392 2236095
>>236073
Удобно.
393 2236103
>>236073
А нахуя там ub делать? поч не дать считать как с указателя и получить вылет? Буквально вместо падения приложения делают тихое игнорирование..
image.png35 Кб, 382x175
394 2236115
>>236103
у меня вылетает
395 2236148
>>236103
Что "делают", дубинелло? Если твое число как адрес случайно указывает в наличную память, оттуда что-то будет прочитано как строка. Если нет - вылетит.
396 2236177
>>236148
ну так, то что ты написал - понятное мне поведение, а выше чел писал что это UB. Вообще я не подумал, наверн чтение мимо это тоже UB, тогда тут все очевидно. Я сначала решил, что там какой-то специальный случай UB для va_args, типо ожидет строку, а передает int, и компилятор хуйню придумает. В примере 1ого чела не вылетело, а у него число 5, какбы сомневаюсь что на 5 там можно читать ему.
397 2236196
>>236180 (Del)
Pattern matching на конструкторе натурального числа, ведь там не может быть zero.
398 2236203
>>236068

>Почему


Потому что иди в питон, дебил
399 2236212
>>236208 (Del)
Ты можешь пояснить нормально почему так происходит и как эта залупа внутри работает? Или больше чем на пук ты не способен?
400 2236217
>>236214 (Del)
Чувак явно только вкатывается, а ты ему исходники кидаешь. Что ещё ожидать от харкачеров...
401 2236220
>>236218 (Del)
Пиздец ты тупой блядь.
402 2236224
>>236205 (Del)
>>236208 (Del)
спасибо)

>>236212
предполагаю, что 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, наполовину - мусор со стека.
image.png21 Кб, 762x141
403 2236232
>>236226 (Del)
а? не понимаю твой текст. Я конешн на Си никогда не писал, но про указатели и литерал строковый знаю из плюсов. На пике cppreference (раздел про Си), пишет что ожидается указатель на char, какие вопросы?
404 2236262
>>236180 (Del)
что не понятно тебе?
405 2236281
В вашем си хоть текст можно нормально распарсить?
406 2236304
>>236281
Конечные автоматы используй.
image.png1,2 Мб, 1200x1200
407 2236331
Как на этом блядском языке нормально хендлить инпут пользователя? Пытаюсь написать консольный калькулятор и столкнулся со следующей ошибкой, когда я делаю scanf("%d",operation), то если пользователь введет, допустим, 1B, то в переменную operation считается 1 и scanf вернет 1 мол все ахуенно прошло, но у меня-то операция 1 а не 1B. Че делать подскажите вкатуну, с меня как обычно ниухя
408 2236416
>>236331
перед сканф проверь строку на валидность
409 2236447
>>236331

>Как на этом блядском языке нормально хендлить инпут пользователя?


Как и на всех остальных - читаешь строку а дальше сам думаешь что с таким вводом делать
410 2236498
>>236331

> scanf("%d",operation),



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

scanf("%d",&operation);

И как ты получил единицу? Он вернёт тебе единицу, поскольку это количество считанных переменных.
А значение должно попасть в operation
411 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. Что за херня вообще?
412 2236637
>>236578

>Однако, если я чуть изменю лишь один принт, чтобы и адрес выводил, то всё нормально становится


Люблю запах Undefined Behaviour по утрам. Это запах... нуба.
413 2236761
>>236637
Прекрасно, а объяснить что именно тут undefined-то можешь? Или только язвить горазд?
414 2236806
>>236780 (Del)
Это я, конечно, провафлил, но этот массив только в примере на 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 записаны, разве нет?
415 2236822
>>236806
Точнее, как можно увидеть по ссылке, до цикла значение ptr'а выводится правильно, а вот в первой же итерации, до всяких манипуляций — нет. Обзывайте меня как угодно, только объясните, пожалуйста, что происходит.
416 2236840
>>236823 (Del)

>ptr может быть 64 бита, а ты кастуешь на 16 битный указатель.


В смысле? В прошлом сообщении макаба сожрала звёздочки, я нигде 64 бита в 16 бит не кастую. Сам ptr имеет размер указателя, но указывает он на переменную типа uint16_t.

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

Возможно, проблема из-за "dereferencing type-punned pointer", gcc на сайте даже ворнинг выдаёт. Раньше читал, но до конца толком не понял, что это такое. Ну, кроме того, что "нельзя" одну и ту же область указателями на разные типы читать. Только если не char•, там можно почему-то.
Вот только почему идентичный принт на разных строках до изменений переменной выдаёт разный результат это не объясняет. Раз уж ломается, почему так выборочно?
417 2236858
>>236840
godbolt.org
418 2236879
>>236868 (Del)
беды с башкой
image.png21 Кб, 651x377
419 2236903
>>236840
Вот вывод с godbolt'а, -O0, gcc 8.3, как и на ideone.
420 2236910
>>236903
Добавлю: с O1 также, с O2 выводит нули, с O2 и "-fno-strict-aliasing" выводит правильно.
>>236840

>"dereferencing type-punned pointer"


тут ты прав скорее всего
421 2236911
>>236868 (Del)

> Я тебе пидор что сказал, заменить типы на дефолтные, а ты что сделал?


А чем 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-битных куска и позаписывать их в память. Теперь-то я, конечно, переделаю всё на простые сдвиги без подоных алиасингов, чтобы точно правильно работало.
422 2236917
>>236910
Через union работает без флага.
423 2236932
>>236927 (Del)

>В 64 битном конпеляторе все типы 64 битные


И все таки беды с башкой
424 2236937
>>236927 (Del)

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


Как я могу использовать int в 32-битной системе для переменной, которая должна хранить 8 байт?
425 2236960
>>236937

>Как я могу использовать int в 32-битной системе для переменной, которая должна хранить 8 байт?



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

как-то так, но не проверял.
426 2237003
>>236761
Паяльник, ты имеешь право кастовать указатель на uint64_t только в указатели на войд или чар.
427 2237004
>>236990 (Del)
Что значит не должна, с чего ты это взял? У меня есть 64-битный айдишник, который я получаю откуда-то там, и вот с ним дальше работать. Это начальное условие задачи, что есть 8-байтная переменная с данными.

>>236960
Ну можно и так, но через юнион проще тогда сразу на uint64_t и uint16_t [4] делить, инты эти мне совсем не нужны.
428 2237101
Пацаны, помогите.
Короче, есть одна проблема.
Нужна копия массива на этапе компиляции. Масив генерируется из matlab .h файла(весь контент через #define).
Как это сделать?

Просто из матлаба это грузится в мк, где это инит конфигурация, которую надо сверить правильно ли загрузилась.
Я долбоёб и без плюсов constexpr контейнеров не умею.
429 2237104
>>237101
как ты массив в макросе копировать собрался
430 2237113
>>237104
Не собрался я копировать масив в макросе.
У меня есть .h файл, куда матлаб сбрасывает готовую глобальную переменную массив. Но мне нужна копия этого массива, так как эту переменную как только пройдет 10 мс микроконтроллер изменит и мне надо сверить что изменилось(должно быть также).

Срака в том, что я не могу узнать даже в каком месте поставить memcpy() чтобы копировать в другую глобал переменную, у меня нету кода места записи этого массива, кудя я бы захуярил этот memcpy
431 2237117
>>237113

>У меня есть .h файл, куда матлаб сбрасывает готовую глобальную переменную массив.



Ну сделай разбор .h файла.
Задача вполне решаема.
432 2237244
>>237113
Копируешь этот хедер в другой, седом меняешь имя массива.
433 2237265
>>237244
Заебца, так и сделаю на питоне хуёне скрипт и в makefile скопирую это говно.
>>237139 (Del)
Ну это я и раньше понял,
>>237117
Идея неплоха, но каждый раз там хуй знает сколько символов и всегда меняются названия.
image.png212 Кб, 1554x741
434 2239059
>>165466 (OP)
Как это понимать? Память утекла во время линковки?
435 2239120
>>165466 (OP)
Сап /clang/ . Можете посоветовать интернет ресурсы где я могу изучать криптографию? Желательно с примерами на C/C++
436 2239211
>>239059
У тебя криво установлен valgrind, файлы исключений не соответствуют твоей libc. Похоже, что пришло время переустанавливать генту
437 2239214
>>239120
https://cryptobook.nakov.com/

примеры - зависит от того, что конкретно тебе нужно
438 2239215
>>239211
давай тоньше
439 2239217
440 2239247
>>239214
Спасибо.
441 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 микросекунды, лол, это вобще возможно?

Я буду вам очень благодарен за любую помощь.
Возможно я документацию жопой читаю, т.к мой английский далек от идеала, и есть какое-нибудь решения на готовой библотеке. Может быть вообще нужно делать все как-то по другому.
442 2239802
>>239780

>это вобще возможно?


Почему нет. Скорость там ограничивается шиной, на которой сидит gpio.
https://github.com/hzeller/rpi-gpio-dma-demo#direct-output-loop-to-gpio
443 2240185
>>239802
Я не он, но у тебя по ссылке судя по всему не совсем то что требуется. Данные там же синхронные, они должны приниматься не когда попало, а по переднему или по заднему фронту внешнего (для одноплатника) сигнала.
444 2240470
>>237003
А в обратную сторону можно? Допустим, указатель на чар я могу кастануть в указатель на 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;



Ведь в обоих случая просто берётся какой-то адрес: либо "из головы", захардкоженный, либо в рантайме считается, беря адрес какой-то другой переменной. Суть одна и та же — взглянуть на область памяти определённым образом.
445 2240479
>>240470
Ты немного не так понимаешь.
Есть шина адресов, есть шина данных. Адрес ты можешь вписывать любую хуйню и если она не прокатит, тебе сразу конпенлятор скажет что ты еблан, потому что в .ldscript вписано максимальный адрес и оно не скомпилируется скорее всего или будет бить уведомлениями.
Другое дело, когда тебе производитель, в данном случае STM32 пишет, например, что GPIO это 32 разрядный адрес, это значит что физически к этому адресу есть 32 электронных контакта.
Теперь смотрим что будет:
Ты ставишь указатель с числом куда сказал производитель(оно не будет превышать максимальное число 32 бит, все окей, если бы было больше 64 бит то приложение на МК ушло бы в ресет или что там прошивка мк говорит)
uint64_t gpio = 0xff
Теперь ты берешь и пишешь в ячейку памяти с 32 контактами 64 битное число на запись которой нужно 64 контакта
gpio = 0xf
Что блядь произойдет в конкретной архитектуре конкретного процессора вообще известно только тем кто его сделал. Может два раза перемотать 32 битное число, может процессор послать тебя нахуй и даже не делать такую ебанутую операцию, хуй знает, это undefined behaviour
446 2240508
>>240479
Как-то не совсем на то ответил, при чём тут запись 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'а нет. Но ведь я делаю абсолютно то же самое?!
446 2240508
>>240479
Как-то не совсем на то ответил, при чём тут запись 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'а нет. Но ведь я делаю абсолютно то же самое?!
447 2240534
>>240470

>А в обратную сторону можно?


Можно. Разрешено ровно то, что необходимо.

>В чём разница между


>#define GPIOA ((GPIO_TypeDef ⚙︎)


GPIOA_BASE)
В первом случае адрес является константой. Это красный флаг для компилятора, т.к. это может оказаться адресом любого объекта. Во втором случае компилятор понял, что ты берешь адрес somevar и наоптимизировал. Кстати, в uint32 адрес превращать непортабельно, используй intptr_t или хотя бы long.
448 2240876
>>240508

> откуда вообще берётся этот 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 449 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 можно обозначать двумя слэшами, а не блоком? Если аргументы или комментарии будут содержать внутри запятые, повлияют ли они на подстановку в макросы? Возможно ли макрос подставлять на место аргумента другого макроса?
450 2241264
>>241210
в конце строки \ поставь
так на каждой кроме последней
451 2241268
>>241264
а, я не о том вообще..
452 2241366
>>240876

>в арм раньше было обязательным, но теперь все тоже работает в любом случае.


А у того анона STM32, то есть Cortex-M0/M3/M4 и может быть M7. Для M0 выравнивание необходимо. И никуда Cortex-M0 в обозримом будущем не исчезнет, точно так же как 8051.
453 2241382
>>241366
>>240876
M4 у меня, и да, выравнивание там всё же нужно, вроде как. По крайней мере я разок с попыткой каста из адреса нечётного элемента чар буфера уже обосрался. При этом, что интересно, ломалось оно только с выключенными оптимизациями (логично), а с -Os он каким-то образом там всё переставлял и у него вполне получалось правильно выполнять код:

>uint8_t buf[9];


>receive_data(buf);


>uint64_t v = ⚙︎(uint64_t⚙︎)&(buf[1])


Смотреть, что он там сгенерировал как-то не дошли руки.
image11 Кб, 148x168
454 2241389
>>241382

>из адреса нечётного элемента чар буфера


Ты же не думаешь, что чётный элемент гарантирует выравнивание?
455 2241439
>>241382

>M4 у меня, и да, выравнивание там всё же нужно, вроде как.


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

>и у него вполне получалось правильно выполнять код:


Не слишком ли много лишних действий? Не проще ли было сразу взять uint64_t?
456 2241463
>>241366

> выравнивание необходимо


Да похуй, у компиляторов арм принято в таких случаях просто читать побайтово и собирать. Так что будет перфоманс дроп в качестве UB.

>>241210

> Возможно ли при использовании макроса в аргументах вставлять несколько строк кода


Полноценно нет, на зачем тебе, если в Си переводы строк почти везде можно заменить на пробел?

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


Иногда. Зависит от того, где макрос раскрывается.

> Возможно ли макрос подставлять на место аргумента другого макроса?


Да.
457 2241476
>>241389
Я думаю, что нечётный гарантирует невыравнивание, поэтому так и выразился. А гарантирует, вероятно, нулевой и каждый 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 где угодно выходит, а все массивы обязательно начинаются на байте, кратном четырём. (На самом идеоне, однако, это не так, и каждый массив начинается на следующем за последним "занятым" байтом.)

>>241439

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


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

>А гарантирует, вероятно, нулевой и каждый n-ый.


А в станларте такого нету.

union {
uint32_t align;
char buf[9];
} u;
459 2241901
>>241580
Не совсем понятно, что тут должно произойти. Типа, выделив под этот юнион 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 элементу, каким-то магическим образом всё же получать правильное значение.
460 2242471
Подскажите, где взять хороших упражнений (на набить руку), прорешав которые можно будет точно решить, что основы языка усвоены.

Не уровня, напиши функцию складывания двух int, а что то посерьезней и интереснее (с указателями к примеру)
461 2242511
>>242471
codewars
462 2242550
>>242471
Книга Crafting Interpreters - вторая половина про написание интерпретатора на С, есть упражнения.
463 2242891
Вопросы:

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

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

второй вопрос, почему для unsigned чисел реализован механизм операций по модулю, то есть если я выйду за диапазон, оно будет все операции делать по модулю Unsigned_Type_MAX
(пример 0u - 1u) Почему для ансайнт чисел такое есть, а для обычных такого нет. И какой в этом глубинный смысл...
464 2242895
>>242891

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


Норм. Спотыкнётся об виртуальную память, таблицы страниц, TLB и вот это вот всё.

> второй вопрос


https://stackoverflow.com/questions/18195715
профессионально ищу на stackoverflow, дорого. звонить 8-800-555-35-55
465 2243036
>>242891

>или такой концепт в будущем спотыкнется обо что то?


Комитет не хочет, чтобы ты так думал. Указатель (в мифическом Эльбрусе) может быть сущностью, для которой оперделны операции создания, преобразования, разыменования, индексации...
466 2243045
>>242895

> Спотыкнётся об виртуальную память


Трансляция адресов никак не пересекается с указателями, а про маппинг в юзермоде можно успешно думать отдельно.

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

>>242891

> Почему для ансайнт чисел такое есть, а для обычных такого нет. И какой в этом глубинный смысл...


Много-много лет подряд, когда уже весь мир хранил числа в дополнительном коде, комитет по стандартизации сишки отказывался фиксировать метод хранения чисел со знаком. А потом компиляторы подтянулись и начали пилить оптимизации, основанные на UB при переполнении знаковых чисел, и уже ничего не изменить. И вот спустя почти 35 лет после выхода первого стандарта в Си наконец укажут, что у нас дополнительный код, но... UB не уберут.
467 2243053
>>242895
>>243036
>>243045
Благодарю за ответы!
В очередной раз убеждаюсь, что если хочешь глубоко понять все эти вещи, то кроме K&R и задач надо читать совместно с учебниками типо:
Computer Systems
A Programmer’s Perspective
image.png42 Кб, 569x383
468 2243557
>>243045

>думать об указателях, как об индексах


Ты указатель с адресом попутал, учитель херов.

>очень удобно и наглядно


Дебилизм какой-то. Что тебе непонятно прямо на пикриле, безо всяеких манямассивов с маняиндексами?
469 2244001
>>243557
Указатель - это адрес объекта, плюс-минус дополнительные данные у fat pointers. Адрес объекта - это индекс первого байта объекта в адресном пространстве. Он же офсет (смещение) объекта в байтах, считая от начала адресного пространства. На некоторых архитектурах все может быть немного сложнее.

> Что тебе непонятно прямо на пикриле


Ты притащил файл, в нем лишь офсеты, указателей и адресов нет по определению, так как нет памяти.
470 2244153
Салаги, записывайте: указатель - это тип данных, значением которого является "адрес".
Адрес объекта - это индекс первой ячейки пам'яти, начиная с которой расположен объект.
image.png10 Кб, 466x358
471 2244250
Решаю задание 1.2 из K&R Там где вместо \n говорят ввести \c и посомтреть что будет, на мое удивление выводится

> printf("c - \c");


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

Дальше больше, я ввожу такое:

>printf("e:\e");



И оно рисует стрелку вообще, что за дела мудрецы?
Привел табличку ескейпов и там нет \e
472 2244276
>>244250
\e это расширение в некоторых компиляторах. Оно аналогично \033 то есть стрелочка вверх.
Косую черту съело потому что по правилам \ начинает esq-sequnce . Чтобы нарисовать косую черту делай так : printf("%c",'\\');
image11 Кб, 148x168
473 2244303
>>244276

>Чтобы нарисовать косую черту делай так : printf("%c",'\\');


printf("\\");
putchar(putchar(92));
474 2244349
>>244303

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

ХОЛИВАР ОБЪЯВЛЯЕТСЯ ОТКРЫТЫМ
475 2244414
>>244349
однохуйственно
476 2244453
>>244414
Второй способ меньше по коду.
478 2244810
479 2245028
>>244810
write(1, "\\", 1);
ПЕРЕКАТ # OP 480 2245332
image.png633 Кб, 1000x562
481 2245338
>>245028
мужчина, вы смыть stdout не забыли?
482 2245340
>>245338
write не stdout, у него нет кэширования, кэширование выше.
483 2245348
>>245340

>write не stdout


в смысле не stdout? А куда? Я думал stdout это просто какой-то файл и вывод это собственно запись туда. Если нужно отобразить на экран то fflush. Ну а printf делает то же самое только буферизирует и само смывает когда надо.

В чем я не прав?
484 2245491
>>245348
Насколько я знаю, кэширование stdout производит libc, а запись в файл небуферизируется. Но это надо уточнить и может зависит от реализации. В моей системе по крайней мере так.
485 2245553
>>245491
Этот прав, я просто не очень точно выразился. Сишный stdout кэширует, а по \n (или по fflush, или если буфер кончится), пишет буфер через write. Там ниже write на уровне ядра тоже может быть кэш, но, по крайней мере, по умолчанию, если у тебя терминал, то все записанное через write сразу отобразится.
Тред утонул или удален.
Это копия, сохраненная 11 июля 2022 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски