Это копия, сохраненная 4 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь 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
Онлайн-утилиты:
- №70: http://arhivach.net/thread/713839/
- №71: http://arhivach.net/thread/727405/
- №72: >>2245329 (OP)
В общем, есть такое мнение, что программист, который не умеет писать на Си, не является программистом. Вместо Си можно подставить Паскаль, потому что разница между ними ничтожна и заключается лишь в синтаксисе - они близнецы и братья.
Это не значит, что нужно всё писать на Си. Это даже не значит что на Си вообще нужно писать. Это значит что знать язык Си обязан каждый программист.
Поясняю почему так. Потому что Си наиболее близок к железу, к машинным кода, к ассемблеру. С отключенный оптимизацией сишный код почти один-в-один вырождается в ассемблер. Когда пишешь на Си, знаешь какой код тебе сгенерирует компилятор.
Си это священная корова, которую не обязательно доить.
На Си можно написать всё, абсолютно всё, а что нецелесообразно писать на Си, то можно написать на языке, который написан на Си.
С++ это "Си на стероидах". В общем случае корректную программу на Си, можно собрать С++ компилятором и в 90% случаев она соберётся. Даже без warnings. Исключения из этого правила есть, но их ничтожно мало и в большинстве случаев они легко обходятся.
Итак, суть этого поста - ТЫ МОЖЕШЬ НЕ ЛЮБИТЬ ЯЗЫК СИ, НО ЗНАТЬ ЕГО ОБЯЗАН. Ты даже можешь его ненавидеть, но знать обязан. Иначе ты не программист, а приживала, зря едящий свой хлеб.
Поехали!
>Вместо Си можно подставить Паскаль, потому что разница между ними ничтожна и заключается лишь в синтаксисе - они близнецы и братья.
Нельзя, не братья, не близнецы.
>Это значит что знать язык Си обязан каждый программист.
Не всегда и не каждый, зачем мне знать С, если я пишу логику для какого-либо сайта, на JS? Оптимизации, по выделению памяти или по системным вызовам за меня сделает интерпретатор, мне нужно лишь знать алгоритмы и то, какие функции/методы/классы выполняются относительно друг друга по времени быстрее или медленнее.
>С++ это "Си на стероидах".
С++ это язык с Си синтаксисом, все.
>В общем случае корректную программу на Си, можно собрать С++ компилятором и в 90% случаев она соберётся. Даже без warnings.
Зачем собирать программу чужим компилятором? Можно статистику про 90%?
>ТЫ МОЖЕШЬ НЕ ЛЮБИТЬ ЯЗЫК СИ, НО ЗНАТЬ ЕГО ОБЯЗАН.
Нет.
>Нельзя, не братья, не близнецы.
Абсолютные близнецы. За исключением множеств, оператора with и пары других мелочей.
>Не всегда и не каждый, зачем мне знать С, если я пишу логику для какого-либо сайта, на JS?
Тогда ты не программист. Кто угодно, но не программист. Отключи тебя от Сети и твои знания и умения бесполезны.
>Зачем собирать программу чужим компилятором? Можно статистику про 90%?
Даже больше 90%. Обратная совсестимость С++ с Си весьма и весьма хороша. Не используй K&R стиль объявления функции и будет тебе счастье.
Пашу на эпичном
Вот именно. Без понимаюния как это работает программы жрут память как не в себя, жрут процессорное время, постоянно переписывая сктроки по памяти. Они (программы) ещё бы и падали на каждом шагу, но современные языки неплохо защищены от этого - концепция и хорошая ранняя диагностика. Поэтому современные программы просто тупо жрут дешёвые нынче вычислительнык ресурсы, электроэнерги. и худо-бедно выполняют своё предназначение, попутно обогревая окружающую среду.
А всё это покрывается волшебной аббревиатурой TTM - Time To Market. Главное вывести своё говно на рынок, а там уже техподдержка разрулит инциденты. Вот в таком мире нынче живём.
>Абсолютные близнецы. За исключением множеств, оператора with и пары других мелочей.
Что у них общего, кроме простых типов?
>Тогда ты не программист. Кто угодно, но не программист. Отключи тебя от Сети и твои знания и умения бесполезны.
Отключи сетевого программиста от сети, его знания станут бесполезны, отключи системного программиста от системы, его знания станут бесполезны. При этом, они оба пишут на C, удивительно, 2 программиста на C, стали не программистами, исходя из твоей логики.
>Даже больше 90%.
Ты можешь писать, что хочешь, но без статистики - это пустые слова.
>Обратная совсестимость С++ с Си весьма и весьма хороша.
Ты так и не ответил, зачем компилировать C код, C++ компилятором, кроме, как перенос всей программы на C++, без переписывания легаси, но даже в таких случаях, C код компилируется C компилятором, а потом линкуется, как объектный файл.
>Не используй K&R стиль объявления функции и будет тебе счастье.
К чем это?
Иногда мне кажется, что тут работают боты, которых проверяют студенты, вроде они тебе отвечают, но смысла в их ответах нет. Сообщения выглядят, как склейка сообщений с каких-то форумов.
>Что у них общего, кроме простых типов?
Ну как тебе объяснить, если ты на обеих не программируешь?
Перечисления, циклы, указатели, указатели на функции, структуры/рекорды. Всё, что есть в одном, есть и в другом.
Тип String?
#define DEFINE_PSTRING(var,str) const struct {unsigned char len; char content[sizeof(str)];} (var) = {sizeof(str)-1, (str)}
Это для константных строк, а для динамических будет чуть иначе.
Сишные строки в Паскале - используй PChar и не забывай '\0'.
Вот чего нет в Паскале, так это битовых полей. Но это же проблема для программиста, да?
>Ты так и не ответил, зачем компилировать C код, C++ компилятором, кроме, как перенос всей программы на C++, без переписывания легаси
Ты сам ответил. Ну или просто по желанию. Запретишь?
>>Не используй K&R стиль объявления функции и будет тебе счастье.
>К чем это?
Чтобы не ебацца в будущем. Вот на картинке не скопилится в С++.
Но за последние 20 лет ни разу не видел сырцов в таком стиле.
g++ (GCC) 11.1.0
>Ты сам ответил. Ну или просто по желанию. Запретишь?
>g++ example-1.c
>example-1.c:9:19: error: invalid conversion from 'void' to 'char'
https://pastebin.com/LKtUYERf
>g++ example-2.c
>example-2.c:5:1: error: ISO C++ forbids declaration of 'function' with no type
https://pastebin.com/cd4w99GR
>g++ example-3.c
>example-3.c:4:36: error: expected ',' or '...' before 'a'
https://pastebin.com/ah27sAC3
3 программы, которые C++ компилятор не может собрать, без флагов и модификации исходников, но можешь ли ты быть уверен, что с флагами не будет вызван C компилятор?
>Перечисления, циклы, указатели, указатели на функции, структуры/рекорды. Всё, что есть в одном, есть и в другом.
C# и C - это братья языки близнецы, все что есть в одном есть и в другом, ну кроме классов, пространств имен, синтаксис немного другой, кросс компиляция в C, получше, а так да, один язык можно сказать.
>
>>example-1.c:9:19: error: invalid conversion from 'void' to 'char'
Ну так строгое приведение типов. Всё нормально. Так и должно быть. Ты, кстати, там ошибку допустил
sizeof * a
>>297992
>>example-2.c:5:1: error: ISO C++ forbids declaration of 'function' with no type
Стандарт такое позволяет, да. Но так объявляют функции уёбки. Уёбков мало.
t2.c:2:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
>>example-3.c:4:36: error: expected ',' or '...' before 'a'
grep -rnw '/mnt/src/linux-5.16.2' -e 'restrict' > log
Как думаешь, много нашлось слов restrict вне комментариев?
А теперь напомню изначальный посыл:
>>>> Исключения из этого правила есть, но их ничтожно мало и в большинстве случаев они легко обходятся.
>sizeof a
sizeof a == sizeof(a), но если ты про выделение памяти, то да там памяти выделяется в sizeof a раз больше.
>А теперь напомню изначальный посыл:
А я думал такой >>297537
>Итак, суть этого поста - ТЫ МОЖЕШЬ НЕ ЛЮБИТЬ ЯЗЫК СИ, НО ЗНАТЬ ЕГО ОБЯЗАН. Ты даже можешь его ненавидеть, но знать обязан. Иначе ты не программист, а приживала, зря едящий свой хлеб.
Да и похуй. Кого это волновать должно вообще? Айти-индустрия – в основном – гигантский распил бабла государствами и корпорациями.
Чтобы не превратиться в дикарей, поклоняющихся чудо-машине, использующих её, но не понимающих как она работает.
Чтобы писать оптимальные программы.
Чтобы знать алгоритмы, а не тупо использовать очередной 100500-й модный фремворк, который через полгода устареет и будет заменён ещё более модным фреймворком.
>Кого это волновать должно вообще?
Меня, "деда", волнует. Я начинал с восьмибытных компьютеров.
>Чтобы не превратиться в дикарей, поклоняющихся чудо-машине, использующих её, но не понимающих как она работает.
Знание C, никак не помогает в понимании, как работает вычислительная машина.
>Чтобы писать оптимальные программы.
Для написания оптимальных программ, на высокоуровневом языке, тебе нужно понимать алгоритмы, а не, как работает машина, потому что уровень абстракции слишком большой от железа.
>Чтобы знать алгоритмы, а не тупо использовать очередной 100500-й модный фремворк, который через полгода устареет и будет заменён ещё более модным фреймворком.
Хорошие разработчики понимают алгоритмы, не важно на каком языке они пишут, если программист не может в алгоритмы в сфере, в которой он работает - это хуевый программист.
>Знание C, никак не помогает в понимании, как работает вычислительная машина.
Си это в некотором роде высокоуровневый ассемблер. Хорошо помогает. Картинка в подтверждение.
Сейчас меня студенты спалят. На картинке, разумеется, просто кусок учебного материала из лекции. А то ещё подумаете что в рабочих проектах так называю переменные.
Игорь, ты?
>Си это в некотором роде высокоуровневый ассемблер. Хорошо помогает. Картинка в подтверждение.
Я с этим и не спорил, но C и близко не дает понимание того, как работают вычислительные машины. Он дает базовые понимания того, как работать с памятью и операционной системой, сама стандартная библиотека C, заканчивается на моменте, когда нужно сделать что-то большее, чем чтение и запись памяти. Все остальное реализуется через системные вызовы.
>example-2.c
Ну так-то implicit int ещё с C99 запрещён, это тебе повезло, что твой компилятор тебя с ним нахуй не шлёт.
Если бы послал, я бы собирал с -std=c89, никаких проблем.
>Чтобы не превратиться в дикарей, поклоняющихся чудо-машине, использующих её, но не понимающих как она работает.
Ты чтоль понимаешь, если ебешься с сями?) ебло бля) Ты давно смотрел как там и что проектируют и собирают в проце и памяти, чтоб уверенно заявлять как оно там все на самом деле работает. Тоже мне не каргокультист епта)) пхах
Красиво написал, так я подумал. А потом увидел что это трипл и все понял.
Мне кажется уже ни кто этого достоверно не знает. Только эмпирическим путем можно установить производительность того или иного кода. Даже ассемблерного.
Мыслишь верно, но выводу >>298173 неверные.
Дело в том, что нельзя превратиться в дикарей, так же как нельзя перестать быть дикарями. Человек не меняется. кем родился, тем и помрет. Личность фиксирована как минимум с момента рождения.
Далее, если отбросить политику (система образования служит властям, воспитывать болванчиков, каких им нужно, т.е. программа обучения определяется правительством), оставив только чистые благие намерения, то учить никаким реальным языкам нельзя, потому что люди разные, а образование это не учитывает.
Нужно давать представление об программировпании на практике искусственного учебного языка. Например, был такой "Исполнитель Робот", на поле из клеток стоял "робот" в виде кружочка и написав программу его можно было передвигать по полю и закрашивать клетки. Вот что-то такое искусственное нужно дать всем, а осталдьное оставить на их усмотрение. Кто какой настоящий язык захочет, тот пусть и учит, а кто не хочет, пусть учит, скажем, Майкрософт Офис, Фотошоп, Видеоредактор, 3D Редактор, КАД какой-нибудь и т.д.
Так что, кому нужен Си, тот сам его возьмет, аналогов у него всё равно нет, дальше кресты, а потм только скриптопараша, она вся одинаковыя, хоть js, хоть c#, одна хрень. Чено нельзя допускать, это только пердольные мваня языки типа всяких хачкелов, потому что пердолинг это бегство от реальности, а такое воспитывать никому на пользу не пойдет. Если преподавать, то только вещи реально применимые на практике, потому что программирование это не философия и прочие теоретические дисциплины, где можно хуи катать разводя пустопорожнюю демагогию. Опять, воспитывать такое нельзя. Если уж настолько дегенерат, то после учебы сам скатитися в это говно, но уже как взрослый под свою ответственность.
>Чено нельзя допускать, это только пердольные мваня языки типа всяких хачкелов
В таком случае развитие языков застрянет на текущем уровне. Все инновации, виртуальная машина, сборка мусора, абстрактные типы данных, условный оператор с плечами вместо goto, итераторы, - всё это впервые появилось в, как ты выражаешься, "мваня языках".
Развитием языков занимаются профессионалы, а речь про обучаемую школоту. Вот типичный пример тупого дегенерата, которые в этом пердольном говне валяются. Не может элементарно прочитать текст, про что написано, а тупо триггерится на отдельные слова и пукает мимо кассы. Вот такое вот никак нельзя воспитывать намеренно, преподавать в школе, иначе жто уже не школа, а детсад дегенерации.
>C# и C - это братья языки близнецы, все что есть в одном есть и в другом
Ты в слове Java допустил 4 ошибки. C# близнец с Java. Хоть и имеет Си-подобный синтаксис.
>Ты в слове Java допустил 4 ошибки. C# близнец с Java. Хоть и имеет Си-подобный синтаксис.
К чему ты это?
Мимо проходил. В джаве нет и половины фич сишарпа, похожи они только принудительным ООП, LINQ и Streams и ключевыми словами, кек. Никак не близнецы
> принудительным ООП
Сссссссссука, когда уже за это расстреливать будут? Это худшее, что вообще случилось в кодинге, на одном уровне с засилием жээса.
Если тебе не нравится принудительный ООП, ты можешь просто использовать классы, как пространства имен.
>вместо меня код пишет язык
Тут сайт 18+ для самостоятельных людей. Пиздюкам не умеющим жить без мамкиной юбки и дегенератам не вырасшим из детских штанишек просьба проследовать нахуй в сишарп/джава/жс/питон тред
>>298681
>К чему ты это?
Наверное к тому, сто си и с# не имеют ничего общего от слова совсем.
>>C# и C - это братья языки близнецы
Тупорылый вброс.
Си имеет общее только с C++, и то потому что это один язык. А с# же это уже скрипты, хоть какие бери, начиная с VBS, JS и заканчивая чем угодно вроде Java и Питона, одного поля ягоды. Просто потому что это уже не программирование, а гадание на кофейной гуще на авось.
Вдумайся в значение слова "программирование". Это не самостоятельное явление, а процесс прилгагаемый к определенному объекту (компьютеру), который и программируется на выполнение действий. Свойства объекта и языка должны быть однозначны и предсказуемы, иначе программировать нельзя.
Скрипты же - не такие, там пишут магические слова на авоь, сработает или нет. Там тонны неопределенности, в которых тонут крохи определенности. И мало того, эти помои еще и прогрессивно деградируют прям на глазах. Короче, если си это программирование, четко написание команд для четкого получения результата, то скриптование это скорее общение с компьютером уровня "Слыш, дарагой, сделай заебись, а, мне очень нада". Для скриптера компьютер это не механизм, которым он управляет, а черный ящик исполняющий желания, вроде лампы алладина.
Как омега-самцу-программисту стать альфа-самцом?
https://2ch.hk/sex/res/8141622.html (М)
Есть предположение, что типичный двачер — это сочетание шизоидного и тревожного расстройства личности. Экономика усложняется с каждым годом. Мир усложняется. Если много лет назад мужчины в основном рычали, двигали тазобедренным суставом и охотились, то сейчас появилось много сидячей, компьютерной, удалённой работы. Для успеха нужно много лет потратить на образование и самообразование, убить молодость и социализацию, чтобы потом ты стал хорошим специалистом, хорошо владел английским, ковырял баги в дебаггере, месил мьютексы и семафоры, обмазываясь многопоточностью и асинхронностью, мигал лампочками на STM32, каждый день самостоятельно учился чему-то новому и загребал доллары, вписался в экономику XXI века. Что в итоге?
У инцела шизоидное расстройство. Он — церебротоник ("мозговитый"). Высокий IQ, интроверт, линуксоид. Много ресурсов тратит на мышление, калории сжигаются, он всегда уставший, апатичный. Ускоренный обмен веществ. Логик. Рационал. Не развита эмоциональность. Сух, зануден. Душнила (душный человек). Не способен адекватно рассказать о своих хобби, интересах, потому что они сложные наподобие "запилить свой процессор на FPGA своей архитектуры и микроархитектуры, а потом для него компилятор написать". Когда начинает рассуждать про монады и моноиды, Haskell и Erlang, тянки разбегаются, затыкая уши.
У инцела тревожное расстройство вследствие воспитания в однополой семье "мать плюс бабушка". У Дениса Бурхаева было ещё хуже: мать + бабка + сестра матери, они втроём пытались его воспитать даже не образцовым пионером, а образцовой пионеркой. Поскольку двачер потратил молодость на умственное, а не физическое развитие, да ещё и мать с бабкой стращали его, дрессировали и запугивали, то получился результат, как на картинке 1. Рост — средний по популяции, астеник, есть дефицит массы тела, одна кожа да кости. Драться не умеет
>Наверное к тому, сто си и с# не имеют ничего общего от слова совсем.
Наверное, ты один из ботов, которых пишут студенты и проверяют тут, да? Все еще не можете в анализ естественных языков? Прочитай ветку и пойми, что это была ирония о том, что другой анон писал, что C и паскаль - это языки близнецы, только потому что в них есть перечисления и простые типы.
Какие-то стереотипы миллионлетней давности, что программист - это нерд-аутист-скряга, хотя еще с 90х эта профессия для всех желающих, и среди прогораммистов можно встретить кого угодно от нерда, до гопника, от кочки до богемного хипстора, хотя 90% - обычные офисные васяны.
>да ещё и мать с бабкой стращали его, дрессировали и запугивали
Лолшто? Обычно в таких семьях сынуличке жопу вытирают и сюсюкают аж до свадьбы, пока овоща не передадут на сохранение другой бабе, и пусть только попробует ему жопу неправильно подтирать нашему золотцу, тупая блядина.
А профессионалы, едва им после рождения перерезают пуповину, сразу начинают пейперы хуячить в научные журналы, так тебя надо понимать, максималистичный юноша?
Профессионалов не лепят как говно из глины в школе, они ими сами становятся, и уже далеко не в школе, а во взрослой жизни. А лепят только тупорылое пердольное говно, потому что само по себе говно безмозглое и бесполезное, ничего не иожет. Поэтому и не нужно лепить, пердосрани нет места в школе, если нет цели наплодить выродков.
Си и Паскаль это близнецы, тут нет никакой иронии. Разве что Паскать дубовый, т.к. предназначен для учебы, типа строго воспитывать стиль кода. Но функционирует от точно так же как Си и С++, т.е. является их прямым эквивалентом, просто он неактуален по причине дурацких идей в его дизайне озвученных выше.
Такие близнецы, что на момент появления первой, во второй не было ни динамических массивов, ни управления динамической памятью, ни нетипизированных указателей и тд. Покормил.
То что ноги растут у обоих из алгола, не делает их близнецами.
На момент появление на свет, ты не мог ни башкой думать, ни разговаривать, а мог только орать и пачкать пеленки. Так зачем рот тут открываешь? Покормил.
Всех переиграл, как конем по нотам - сразу верб, близнецы.
>нетипизированных указателей
Ну хоть в чем-то паскаль был лучше. Не знаю как сейчас, но искренне надеюсь что они их вводить не стали.
Что-то на уровне полезности NULL. И множественного наследования.
Не напоминай. Вот же годная вещь была - компиляция в памяти это нечто божественное. И хоть я приверженец Си, но Турбо Паскаль вспоминаю с любовью. Годнота была.
>Профессионалов не лепят как говно из глины в школе, они ими сами становятся
А становятся они таковыми по двадцать лет хуяча на языках, "реально применимых на практике", правильно я тебя понял?
Доброго вечера, си боги. Хочу адски въебать computer science, и я так понимаю мне нужен си. Есть какая нибудь книжка совсем для грудничков? Что бы параллельно учить both hardware & software части
>компиляция в памяти это нечто божественное
Имеешь ввиду компиляция сразу в бинарник, без этапа создания объектных файлов? Если да, то можно вспомнить что объектные файлы могут пригодиться для инкрементальной компиляции.
>Имеешь ввиду компиляция сразу в бинарник, без этапа создания объектных файлов?
Нет. Имеется в виду компиляция в память, без создания исполняемого файла. Т.е. это было похоже на интерпретатор, с отличием в том, что программа всё же компилировалась, но только исполняемый код был в оперативной памяти и не писался на диск.
Это имело смысл, посколько IDE HDD были очень очень очень очень очень медленными.
Спросите меня: "А почему он тупой?" Да потому что не ведает вырожденец о чём толкует. Дядя этому хуйлу и адекватным анонампринёс картинку, чтобы оно, хуйло, посмотрело своими мутными красными глазами на пункт меню "Destination Memory", но вонючая субстанция в его наплечной параше неспособна осознать очевидные вещи, оно увидело первый раз в жизни Turbo Pascal на этой картинке и нихуя не поняло.
Поридж даже не понял о чем речь. Пытается махать незначительной фигней, не замечая что штаны спили и на самом деле размахивает своим достоинством на потеху публике.
>была - компиляция в памяти это нечто божественное.
Это архаизм на самом деле: так работали первые поколения компов без ОС и релоцируемых программ, с однопроходным ассемблером. Подозреваю ТурбоПаскаль выдавал что то типа досовского com файла - там простейший формат, по сути дамп памяти, который грузится всегда в одно место.
Это не джит.
Это всё понятно, но это работало охуительно. И приятно.
И в то же время была возможность скомпилировать с противополжной крайностью - оверлеями. Такое в голову могло прийти только богатырям - программы, размером больше имеющегося ОЗУ в то время, когда виртуальная память была только у суперкомпьютеров.
>hardware & software
>для грудничков
Ну попробуй Таненбаум "Архитектура компьютера" и потом Керриска "Linux api. Исчерпывающее руководство"
Ну так сходить в магазин заказать онлайн и открыть дверь курьеру не было возможности, вот и крутились как могли.
>Таненбаум "Архитектура компьютера"
Я сам не читал, но вот тут ее не очень любят видимо. Говорят она башню из слоновой кости строит.
https://habr.com/ru/post/589091/
https://youtu.be/GPv8coYl3cE
А дальше любой учебник по Си и пробуешь примеры. Тупо пробуешь примеры. Ну, не совсем тупо - читаешь, думаешь, пробуешь.
Без практики, без реального компилятора изучать нет смысла.
>атомарен ли инкремент на x64 архитектуре?
Нет, инкремент (х++) в С/С++ не атомарен.
> Есть ли а С11 атомарные типы
https://en.cppreference.com/w/c/language/atomic
Спасибо.
Я до сих пор не могу сделать массив (VLA запрещены)
int arr[N], где N это не макрохуйня и не литерал
да?
Я конечно извиняюсь, а что такого особенного в 2022, что такие фундаментальные вещи должны ломать?
Вангую потому что она не тру конст, у нее есть локация в памяти, теоретически ее может переписать (да это UB и надо что-то типа снятия защиты записи на страницу памяти?)
const int a = 12;
intp = &a;
p = 42;
В отличии от тру конст, которая сразу пойдет операндом в машинную инструкцию (хотя, конечно, ее тоже можно перезаписать, лол)
Записывай:
int ⚹ arr = (int⚹) alloca( sizeof(int) ⚹ N );
Пользоваться как и обычным массивом:
arr[0] = 100;
arr[1] = 100;
а епт, глаза ебуться, чет показалось что там обычный malloc
я знаю что некоторые собирают, мне интересно почему именно тут так
Так какая разница, вмещается же. Я его как знаковое вывожу.
>>303498
https://docs.microsoft.com/ru-ru/cpp/c-language/type-char
Хотя сейчас погуглил, как я понял знаковость изменяется флагом комплиятора, но насколько я помню по умолчанию он стоит всегда на беззнаковые, а проект называется Project1, поэтому я думаю, что там используется беззнаковый.
У тебя "c" русская или английская? Вроде студийный компилятор должен уметь в кириллицу в коде.
Где вообще можно об этом почитать?
Видеть количество байт нужно только во всяких криптографических и прочих алгоритмах. В остальном достаточно базовых типов, главное для размеров использовать size_t, а для разницы указателей ptrdiff_t.
>Аноны, а как вы указываете тип переменной?
В зависимости от проекта по желанию левой пятки.
А если серьёзно, то действительно в завсимости от проекта - под Виндой одно, под Фрюниксами другое. Как в хидерах объявлено, так стараюсь и в проекте.
Но если проект подразумевается быть кроссплатформенным, то
#include <stdint.h>
Тут как раз никаких вопросов.
Переменная хранится на стеке, там же где адрес возврата и прочее.
Ты пишешь в память ЗА переменную. Просто тупо ее портишь.
А какой смысл у этого кода? Ты к адресу переменной C прибавляешь единицу, а зачем разыменовываешь получившийся указатель. Что за эффект должен получиться?
неофит
Натрави на исходник gcc с ключом -S. Посмотри получившийся ассемблерный файл. Может быть поймешь где косяк push/pop rbp не спроста.
Адресная арифметика, например как альтернативный способ работы с массивами. Но не в его случае.
мимопроходил
Твоя программа объявляет только одну переменную
То есть память выглядит так
что-то системное
1 байт: переменная C
что-то системное <ты пишешь сюда
А хотя да, сейчас вчитался получше в ошибку, стало понятнее.
>>303557
Если буквально то я хочу прочитать следующий за переменной байт. А вообще всё началось с того что я попробовал вывести чар как инт, то есть через %d и ожидал увидеть там число отличное от 129 которое присвоено, но выводилось всё так же 129. Потом я решил посмотреть стоят ли после этого числа нули в памяти - оказалось что нет. И только потом я вспомнил что аргументы передаются через стек и он ложит туда 1 байт как и полагается, а остальные байты видимо заполняет нулями это не точно
Ты не выкупил, забей
И в них тоже.
Я так понял что я рушу стек. Но то в каком виде студия изначально выдала ошибку это всё равно странно.
Я не знаю почему так. Мое предположение - студия видит что ты обращаешься по адресу вне переменных, считает это UB (Undefined Behavior), в этот момент считает, угу, значит это бред написан, переменная c реально не используется, выкидываю вместе с инициализацией.
всё то же самое, но справедливо, стек реально ломается. Но я тут в процессе задался фундаментальным вопросом, а что вообще переменные забыли в стеке...
Можно.
У тебя локальная переменная функции. Если ты вызовешь ее рекурсивно, то у каждого вызова должно быть место для своей переменной.
Естественно если ты объявишь переменную вне функции, она будет не на стеке.
Еще забыл написать, при возврате из функции вместо очистки памяти стек просто уменьшается на нужное количество байт.
На этом часто уязвимости и основаны. С этим пытаются бороться (силами операционной системы и компилятора) разбрасывая память по рандомным адресам - ASLR
Там же документация есть.
https://docs.microsoft.com/ru-ru/windows/win32/memory/creating-a-file-mapping-object
есть, но не описано где на практике это используют, а еще всякие VirtualAlloc есть
Есть ли какой-то способ имплементировать this-> в С?
Пишу для микроконтроллеров, не хочу полностью переходить на С++ и менять корпинятор.
Да, про передачу указателя на функцию первым аргументом знаю.
int32_t class(dev_ctx_t *ctx, uint8_t val)
Нельзя, только через указатель на структуру первым аргументом, потому что именно такой код и генерируется из классов в C++.
>>304449
Хотя, сейчас подумал, можно реализовать как-то так, но переносимость никакая будет. Собирается GCC 11.2.0.
https://pastebin.com/gYT1vPfk
Ничего так, лихо ты. В VS уже не работает, не то что между архитектурами. Но можно перекрыть кучей дефайнов и, собственно, сделать свой компилятор.
Смотрю как в VS вообще с asm вствками работать, не разу не работал. В x64 вроде вообще не работает.
> В x64 вроде вообще не работает.
Режиме сборке, в смысле. Нужно специальный файл городить, если я правильно понимаю.
Да я на VS просто так пробовал, попробую на ARM своем, может там будет все ок и легче его перенести.
(Я ж изначально на него хотел.)
Но конечно такие вещи опасны, если не поддерживаемы, раз-два и код скопировали в другой проект - а он там не пашет.
>Но конечно такие вещи опасны
>как сделать из си кресты, но без крестов, кресты не нужны, но нужно как в крестах
Да, дебилы опасны, я бы такого хуесоса мгновенно уволил с занесением в черный список. Если так любит играть со своим анусом, пусть это делает дома наедине с собой.
написал же, чтобы юзеры всяких либ не забывали FreeMyLib() вызывать и тому подобное
потому что штука, которая может вызвать событие на выход переменной из скоупа, очень нужна
Никто не будет использовать, многие проекты вообще С99 собираются. И расходы у defer функций огромные.
скажу больше, что многие C89 собираются, на C99 переходят, только очень низкоуровневые, когда нужна уверенность в целых, 64битный да вариативный макрос
> И расходы у defer функций огромные
накладных расходов вообще нет, компилятор просто вставляет кусок кода в место, где переменная выходит из скоупа
>накладных расходов вообще нет, компилятор просто вставляет кусок кода в место, где переменная выходит из скоупа
https://pastebin.com/JrH980Cu
Как он будет обрабатывать некорректные выходы из области видимости?
Как он будет оптимизировать количество вызовов defer функций?
> Как он будет обрабатывать некорректные выходы из области видимости?
ну так перед строчкой abort(); // critical error, exit, pthread_exit, ExitProcess, ExitThread etc
вставит
free(a); free(b); free(c);
т.к. компилятор видит, что в этом месте точно такой же выход из скоупа
> Как он будет оптимизировать количество вызовов defer функций?
что значит количество? Один вызов к одной закрепленной переменной.
var x;
defer(x){ /code / }
теперь в месте выхода переменной X из области видимости вставляется code
>ну так перед строчкой abort(); // critical error, exit, pthread_exit, ExitProcess, ExitThread etc
Компилятор не знает, какая функция завершает работу программы, pthread_exit, ExiitProcess, ExitThread функций нет в стандартной библиотеке.
>т.к. компилятор видит, что в этом месте точно такой же выход из скоупа
Не видит.
>Один вызов к одной закрепленной переменной.
Это назвается деструкторы, мы же говорим о defer функциях.
>что значит количество?
Для каждого выхода области видимости, необходимо продублировать код вызова defer функций или придумать гениальный способ оптимизации машинных кодов создаваемых компилятором, только зачем?
ЗАЧЕМ ТЕБЕ C++/Go В C?
> Это назвается деструкторы, мы же говорим о defer функциях.
изначально мы говорим о механизме, который будет вызывать некий код при выходе переменной из области видимости, а каким словом это обозвать дело десятое
> ЗАЧЕМ ТЕБЕ C++/Go В C?
тоже выше написано, чтобы создавая библиотеку я бы давал гарантии пользователям, что им нужно только создать структуру из этой либы в нужном им месте, а об освобождении ресурсов уже подумал я и компилятор мне помог
>изначально мы говорим о механизме, который будет вызывать некий код при выходе переменной из области видимости, а каким словом это обозвать дело десятое
>>304708
>скорее бы уже C23, может будет defer или любой другой деструктор
Ты путаешь понятия, но пытаешься в расширение стандартов языка.
>я бы давал гарантии пользователям, что им нужно только создать структуру из этой либы в нужном им месте, а об освобождении ресурсов уже подумал я и компилятор мне помог
Пиши на C++.
> Ты путаешь понятия
я написал суть, а слова привел для тех, кто в теме не очень шарит, а кто шарит и так понял смысл из фразы > штука, которая может вызвать событие на выход переменной из скоупа, очень нужна
> Пиши на C++
сиди на C89, никто обратную совместимость пока не ломает
ладно, ты решил в срач скатываться, вместо обсуждения, поэтому бывай
>я написал суть, а слова привел для тех, кто в теме не очень шарит, а кто шарит и так понял смысл из фразы > штука, которая может вызвать событие на выход переменной из скоупа, очень нужна
Ты хочешь деструктор в С, зачем? Возьми и пиши на C++, где эти деструкторы есть.
>сиди на C89, никто обратную совместимость пока не ломает
Я сказал тебе решение, твоей же задачи.
>ладно, ты решил в срач скатываться, вместо обсуждения, поэтому бывай
Сказал по фактам, но ты не можешь в обсуждение.
>как сделать из си кресты, но без крестов, кресты не нужны, но нужно как в крестах
Я против крестов ничего не имею, так что утверждение не к месту.
Но я не могу просто использовать кресты, играть с разными компиляторами, потому что их попросту нет во многих контроллерах, которые используем. Как и многих стандартов Си, хотя это вообще меньшее из зол.
А переносимость кода важна. Хотя бы портирование между архитектурами. Где-то FIFO и LIFO; где-то 8, 16, 32 бит; а где-то Big\Little Endian.
Так что, то что ты говоришь - "играть со своим анусом", так такое бывает, да. Даже в крупных компаниях и никого не увольняют. Иногда свои ебанутые SDK пишут, которые на других работах нахуй не нужны потом.
Как пример: работал в конторе где делали виртуалки, и чтобы передать данные в гостя нужно было, если вкратце:
1. Приостановить виртуалку на один такт (код Си)
2. Подменить значение CPUID (asm вставка)
3. Продолжить виртуалку и подтянуть значение в госте (код Си)
4. Приостановить виртуалку на один такт (код Си)
4. Вернуть значение CPUID (asm вставка)
5. При необходимости повторить
......
x. Продолжить виртуалку при завершении (код Си)
Так там такой ебейший дефайн был нагроможден ради пяти строк со всеми проверками компиляторов, ОС хостовых машин, и прочего говна.
просто многие не понимают, что от C тоже хотят нормального человеческого развития или запила его альтернативы, чтобы был такой же легкий в освоении и простой, но при этом учитывал знания, полученные в IT за последние 40 лет
Не о том речь. В твоем примере поставлена задача и она решена, не важно дефайнами или нет, это продуктивная работа. Ты же, изобретая кресты в сях, не решаешь никаких задач, а тупо играешься, балуешься, причем знаешь как надо делать (передавать параметр), но сознательно откладываешь решение. Косишь от работы бессмысленным пердолингом. Поэтому я и сказать "играть со своим анусом", потому что это и есть маструбация, бесполезное занятие только ради личного удовлетворения, т.е. вред работе. И особенно если впердолишь нестабильное решение, это уже не просто вред от бездействия, а активное вредительство.
не угадал
Для того же, для чего в нормальных ОСях исползуют mmap(2).
Не определяет, асм вставки вроде вообще не стандартизированы нормально, в каждом компиляторе синтаксис у них отличается.
Для каждой архитектуры тоже свой асм.
Возможно это связано с тем, что компилятор неявно приводит fn_b, к указателю на функцию, после чего ты его разыменовываешь и он снова приводится к указателю.
Смотри в сторону макроса __COUNTER__ (в стандарт не входит, но во всех компиляторах есть) и конкатенации через ##.
я в своих либах просто ## использую для той же генерации по типам
В военке программирование на срочниках популярно.
Так не военка же. Сейчас свои заводы и производство подниматься начнут. А веб-макаки пойдут дворы мести.
для ЧПУ на Си только API пишут, основная работа на скриптухе типа Lua, так что сишников больше не понадобится
Хочу освоить C и Lua. С чего лучше начать?
Что значит сделать форк? Внести какие-то изменения в репозиторий или что? А как обычный рядовой чел внесёт какие-то нормальные изменения в репозриторий с операционкой чтобы это ещё и можно было бы использовать в курсовой? мне просто интересно, я даже не представляю что там сделать такого можно.
Тебе нужен курсовой и код, или просто курсовой? Какая ОС? Какие-то ограничения, задачи на курсовой были от преподавателей? Если код, то под окнами, я бы порекомендовал написать логгер для обращений программ в реестр, чтобы удалить созданные ими ключи, после их деинсталяции. Под пингвином, попробуй написать ... Не знаю, под него все системное уже написано.
Курсовая заключается в написании кода + записки к нему. Ограничений вроде нет, я думал взять что-то про линух, тк наверное по нему больше всего инфы в инете. Была идея на ncurses написать gui который показывает различные датчики температуры в компе, и как-то встроить в виде виджета на рабочий стол. Насколько реализуемо? Сам я пользуюсь убунтой
Можешь сделать аплет, который показывает информацию о сети, например, куда и какие пакеты идут, сколько байт передано и т. д..
В общем научруку понравилась тема с логгированием, сейчас буду разбираться. Спасибо, анон
Мнение?
>>303601
MinGW
>>304738
>И расходы у defer функций огромные
Смотря как его реализуют. Если вполне возможно реализовать его как заменитель goto.
> Мнение?
Хочу, чтобы перевел и оформил в виде статьи на каком-нибудь хабре, чтобы с большим числом народу перетереть
Ну а по сути - все как всегда: комитетчики - старые пердуны, которые уже не умеют в развитие, а только используют то, к чему привыкли, поэтому тормозят развитие. Есть кучи направлений, где можно улучшать эффективность языка, чтобы он делал более совершенный код, чтобы удобнее было писать, но ..
>которые уже не умеют в развитие, а только используют то, к чему привыкли, поэтому тормозят развитие.
Как им развиваться?
Если проекты (1. программа+мьютекс_либа и 2. либа+мьютекс_либа) разные, то очевидно что глобальные переменные у обоих проектов будут разные. Надо подключать мьютекс-либу динамически к программе и либе.
>Если код, то под окнами, я бы порекомендовал написать логгер для обращений программ в реестр, чтобы удалить созданные ими ключи, после их деинсталяции.
- Звучит как глобальный хук (|| другой способ инжекта либы) с перехватом функций обращения к реестру.
- Также похоже на снэпшотер всего реестра, до и после установки программы. Но там еще и другие программы могут в этот момент писать что-то в реестр. Может случиться бяка.
>Звучит как глобальный хук (|| другой способ инжекта либы) с перехватом функций обращения к реестру.
Да, но если права позволяют и система тестовая, то можно реализовать через патч системной Advapi32.dll, но я не помню, как связываются системные библиотеки, в смысле только динамически или статически тоже. Ну, а способов глобальной подгрузки dll, в интернете миллионы, к тому же прав администратора будет достаточно, потому что следить за процессами, у которых права выше администратора, бессмысленно.
Почему у тебя stdio.h расположен в /usr/include, а stdarg.h хуй знает где?
>И откуда va_list в стдио ?
#if defined __USE_XOPEN || defined __USE_XOPEN2K8
# ifdef __GNUC__
# ifndef _VA_LIST_DEFINED
typedef __gnuc_va_list va_list;
# define _VA_LIST_DEFINED
# endif
# else
# include <stdarg.h>
# endif
#endif
> можно ли использовать функцию fprintf для записи в сокет
Почему бы и нет, зовёшь close(0), открываешь сокет и похуячил.
> насколько это легально?
Настолько же, насколько отсылка на текущую ситуацию в мире.
>Чтобы твой сокет получил дескриптор 0.
Почему он должен его получить? И зачем мне именно этот дескриптор?
Если мне нужно часть либ статически, а часть динамически, то мне перед одними нужно поставить -Wl,-Bstatic потом их перечислить, потом -Wl,-Bdinamic и уж их перечислить?
Да.
> где можно найти готовые реализации в .h файлах?
github, за последние лет 50 написали уже все, что только может тебе прийти в голову
> почему так мало?
потому что в стандартной либе должен быть минимум элементарных кирпичиков, чтобы на любой ОС можно было запустить, а не засирать и тащить в нее все подряд
Для деревьев и прочей лабуды используют другие языки вроде питона. Ты не туда зашел, петушок, со своим говном.
Ну гитхаб понятно, но почему нет какого-то централизованного и стандартизированного менеджера пакетов вроде pip'a, где можно скачать готовую и отлаженную реализацию и включать её в код через include. Разве удобнее самому копаться в гитхаб-помоях, где половина функций либо вообще не будет работать, либо будет работать так плохо, что придётся переписывать самостоятельно?
>>313155
Деревья вообще-то даже в файловых системах используются. Давай, напиши ФС на Питоне, клован.
> Для деревьев и прочей лабуды используют другие языки вроде питона. Ты не туда зашел, петушок, со своим говном.
Какой еще петухон. Ты не туда зашел, петушок, со своим говном.
> но почему нет какого-то централизованного и стандартизированного менеджера пакетов
потому что тогда нужен какой-то дядя или много дяд, кто будет определять что такое хорошо по своему вкусу, все либы в своих областях чаще всего итак в одном самом популярном и отлаженном экземпляре, та же ssl, ну а что попроще вроде там png - набираешь также в гитхабе и смотришь по количеству звезд, времени обновления и прочему, если подходит - берешь, для простых либ давно есть стандарт вроде того, что создается one_header_library под свою задачу, а потом их просто накидываешь в свой проект и прописываешь один инклуд, яркий пример сборник таких либ stb
Потому что язык разработали в семидесятых, алло.
За легко подключаемыми либами с гитхаба тебе в голенг.
Unix тоже разработали в 70. По-моему, скачать файл через wget и переместить его в каталог библиотек не так уж и сложно.
>почему нет какого-то централизованного и стандартизированного менеджера пакетов
Вот возьми и напиши, на курсач сойдёт.
>Unix тоже разработали в 70. По-моему, скачать файл через wget и переместить его в каталог библиотек не так уж и сложно.
https://ru.wikipedia.org/wiki/Unix
https://ru.wikipedia.org/wiki/WGet
https://ru.wikipedia.org/wiki/Интернет
Какую же ты хуйню несешь.
> Почему он должен его получить?
Потому что ОС раздаёт свободные дескрипторы по порядку.
> И зачем мне именно этот дескриптор?
Чтобы функцию printf можно было использовать для записи в сокет.
Пиздец, у зумеров attention span как у землеройки.
Потому что ты не понимаешь разницы между системой сборки и мета-системой сборки.
>Ну гитхаб понятно, но почему нет какого-то централизованного и стандартизированного менеджера пакетов вроде pip'a, где можно скачать готовую и отлаженную реализацию и включать её в код через include.
Все есть. См. msys2, vcpkg под винду. С линухом вообще никаких проблем нет, там в каждом дистре свой пакетный менеджер.
>стандартизированного
Как ты себе это представляешь? Си это не только х86/64. Существуют десятки сишных компиляторов под хуеву кучу платформ, которые не то что бинарно, а даже программно не совместимы.
пиши тут, няша
долго, да и тред засрётся. Ну ладно, похуй.
Просто интересно потрогать их и посмотреть плюсы или минусы.
Да.
А что, это идея. Кто-нибудь хочет присоединиться?
раскопал, что это
typedef int (FAR __stdcall *FARPROC)();
но что такое FAR, судя по коду просто какой-то флаг или что
Ошмётки легаси, когда на ранних 32-битных машинах были ближние (NEAR) и дальние (FAR) процедуры. Привыкай, в виндусе всё так.
Нагуглить fdopen и включить мозг на пару секунд религия не позволяет или таки возраст?
Спасибо, а не знаешь как этот FARPROC правильно в функцию прокинуть и через GetProcAddress получить, потому что func_1 остается NULL, а func_2 все нормально работает?
Но нужно именно без хардкодного описания параметров функции через typedef, чтобы перед GetProcAddress ее тип проставить или без этого он совсем никак не сможет в данном случае сопоставить func внутри функции load_func и передаваемую туда func_1
Ты же понимаешь, что ты обосрался и пытаешься в маневры? Зачем ты продолжшаешь общение? Смирись с тем, что ты не прав, у тебя нет никаких оправданий, а лишь попытки оскорблений, скорее всего ты бездарное существо, которое живет на бабушкину пенсию и дрочит Си-код.
Ты передаешь указатель в функцию и его изменяешь, передавай указатель на указатель для его именения или взаимодействуй с глобальной переменной.
Блин, я уже слепой.. Спасибо, нужно спать хоть раз в пару дней
> ты бездарное существо, которое живет на бабушкину пенсию и дрочит Си-код
Проекции уровня /pr/
Да я хз, я их не проходил ещё даже, просто книгу читаю, а там вещи непонятные, приходится наперёд смотреть
среди простых целых типов - да, int64_t/uint64_t ака long long/unsigned long long - самые большие
Но тогда почему там написано "на помощь и приходит uintmax_t", ведь этого всего лишь машинное слово (или я чет не понял), а структуры могут быть любой длины?
Ну дальше там написано что есть какой-то __int128 (че) которым внезапно может оказаться переменная, но следом же сказано что компилятор не считает его за расширенный целочисленный тип, поэтому максинт это в любом случае лонг лонг. Непонятно зачем вообще нужен этот максинт если есть лонг лонг. В статье сначала говорится типа "вот можем захотеть написать так, но вдруг размер больше? поэтому надо юзать максинт" а потом оказывается что больше-то ничего и не бывает.
>Но есть один нюанс. Некоторые читатели, использующие __int128 или его беззнаковый аналог, могут задаться вопросом: почему в моем компиляторе clang или gcc intmax_t определен как long long, тогда как его размер меньше, чем у __int128? Все дело в том, что clang и gcc не рассматривают __int128 как расширенный целочисленный тип, так как это влечет за собой изменение intmax_t, а это уже нарушает ABI-совместимость с другими приложениями.
>Представьте, что у вас есть программа, которая использует функцию с параметром intmax_t в динамической библиотеке. Если компилятор изменит значение intmax_t и перекомпилирует программу, то она и библиотека будут ссылаться на разные типы, нарушая бинарную совместимость.
>В конечном итоге intmax_t/uintmax_t немного не соответствуют целям, описанным для них в стандарте.
Так а каким в итоге целям они соответствуют? Или никаким и можно забить на них хуй?
>Я погугли и кажется нашёл кое-что получше
Выглядит, как говно без задач с парой пакетов в репозитории, которые не понятно еще в каком виде предоставляются.
Целям не ломания совместимости.
Школьникам-максималистам-бунтарям-старье-нинужно-весь-мир-разрушим-до-основанья-а-затем-новый-мир-построим осмыслить подобное трудно, но это важно.
>>314215
>The following type designates a signed integer type capable of representing any value of any signed integer type: intmax_t
>The following type designates an unsigned integer type capable of representing any value of any unsigned integer type: uintmax_t
__int128 int_128 = __INT128_MAX;
intmax_t int_max = int_128;
Чему должен быть равен int_max?
Приведи пример несовместимости когда эти типы спасают
>__int128 int_128 = __INT128_MAX;
Эта залупа вообще хоть в чем-то скомпилируется? Ни разу не видел 128-битных литералов.
если конечно __INT128_MAX это дефайн, а не хитровыебанное прибитое гвоздями расширение конпелятора
>__INT128_MAX
Это просто условное максимальное значение int128.
https://godbolt.org/z/4s9Y6afcK
Я не про это вообще. Уже сам нашел.
If the value of the integer constant is too big to fit in any of the types allowed by suffix/base combination and the compiler supports extended integer types (such as __int128), the constant may be given the extended integer type;
Собственно, вопрос, так ли это? На си ни одной строчки кода не написал в жизни. Да и на самих плюсах в каких то низкоуровневых дебрях не копался. Понимаю, что логика языков должно быть практически идентична, но все равно наверняка отличается в некоторых моментах + синтаксис + всякие внутренние инструменты типа stl, я даже не ебу есть ли что то типа этого в си. Что скажете?
Алсо, посоветуйте плз хороший учебник по си, по которому можно относительно быстро вкатиться. Книги в шапке вижу, может есть какие-то комментарии по ним, что лучше, или еще какие-то годные варианты?
>Собственно, вопрос, так ли это?
Да.
>Понимаю, что логика языков должно быть практически идентична
Не во всех задачах.
>всякие внутренние инструменты типа stl
Их нет.
>или еще какие-то годные варианты?
Из-за особенностей языка, для 2022 года, а именно минимальный функционал стандартной библиотеки и простой синтаксис, тебе не нужно знать Си, тебе нужно знать то, как решать задачи, например, если ты решишь написать HTTP-сервер на Си, то тебе нужно знать устройство HTTP протокола и то, как работать с сокетами, знания языка тебе пригодятся минимальные.
Так, что тебе нужно знать, как работают указатели и знать, как заставить платформу сделать то, что ты хочешь, дальше твоих знаний C++ должно хватить.
Я пишу свой говноязык и реализую встроенные функции/методы объектов, которые описаны структурами, содержащими имя функции/метода, кол-во аргументов, флаг наличия возвращаемого значения и указатель на C-функцию.
Например, в моём говноязыке есть функция int max(int, int), которую описывает структура {"max", 2, true, builtin_max}, где builtin_max - void указатель на функцию с сигнатурой Object ж builtin_max(Object ж, Object ж). При этом аргумент/возвращаемое значение всегда имеют тип указателя на Object, т. е. структура описывает функцию полностью.
>Есть ли возможность кастануть во время выполнения void указатель в указатель на функцию
Да.
>мб каким-либо образом где-то упаковав информацию о количестве/типах аргументов и типе возвращаемого значения?
typedef return_type function_type_name(parameters);
>Зойчем структуры как-то ебануто выравнивают содержимое? Нахуя это сделано?
Производительность.
>Как ими пользоваться нормально, если они такие непослушные?
Правила выравнивания изучи.
>Хотел структурой описать содержимое одного файла, так она все переговняла, посмещала. Хуйня получилась. Пришлось ебаться, описывая содержимое массивом с указателями.
Проблема в тебе, а не в выравнивании.
гугли упаковка/распаковка структур для бинарного хранения или передачи и не выдумывай велосипедов
надеюсь ты еще студентик, а не зарабатываешь этим деньги, а то заебался переделывать за таким говном как ты
Окей, спасибо, анончик!
А по учебникам че то годное можешь посоветовать? Чтобы вот быстро освоить как то хотя бы базовые вещи, чтобы потом уже проще было. А то этих талмудов на 1000 страниц много, но что именно из этого годнота на берегу определить очень сложно.
Сурово.
Спасибо. В результате поступил средне - передаю содержащий аргументы объект в случае функции, а в случае метода ещё и соответствующий инстанс. Свой подход всё ещё собираюсь использовать для различения функции с аргументами/функции без аргументов/метода, но это будет уже проще сделать.
>>315707
Спасибо, что-то вообще в голову это не пришло. Жаль только, что придётся условиями всё это дело обложить а-ля "if (nargs == 2 && has_return) { return (func_type_2args_has_return)(args) }. И в макрос никак красиво не оформить.
>Спасибо, что-то вообще в голову это не пришло. Жаль только, что придётся условиями всё это дело обложить а-ля "if (nargs == 2 && has_return) { return (func_type_2args_has_return)(args) }. И в макрос никак красиво не оформить.
https://github.com/bminor/glibc/blob/b92a49359f33a461db080a33940d73f47c756126/sysdeps/unix/sysdep.h
Надо подчеркнуть чтобы вы быстрее поняли. Вот видите первый разедл и у него offset 1024кб от начала диска, почем первые 1024кб диска не используются? А? А? А? Причём они не размечены так как на диске отображаются как фри.
>>317067
Зачем ты пишешь в Си треде это? Почему ты не можешь просто посмотреть на картинку, которую выдает википедия и понять это?
https://en.wikipedia.org/wiki/GUID_Partition_Table
Потому что здесь ситемщики сидят больше шансов что ответят.
Да я уже разобрался потому что lba 0 это резерв для mbr защищаюй gpt от изменения старыми программами. Ну и до меня сразу не доходило по картинке
Правда вопрос в том что mbr запись 512 байт занимает а не 1024 килобайта но это видимо размера кластера то есть весь lba0 адресует 1024килобайта потому что такой размер блока, ведь lba1 это уже заголовок gpt
Ясн.
Не совсем так, он начинает работу с места форка, но возвращает результат в зависимости от того, является ли процесс дочерним или родительским. Таким образом, можно сделать различную логику у дочернего и родительского процесса, после форка.
https://opennet.ru/man.shtml?topic=fork
>При успешном завершении родителю возвращается PID процесса-потомка, а процессу-потомку возвращается 0. При неудаче родительскому процессу возвращается -1, процесс-потомок не создается, а значение errno устанавливается должным образом.
Похоже на гопников: "форкни мне бабла. чел"
ничем. всем устраивает просто навсякий случай спросил мало ли есть какой-то более простой\альтернативный способ. всегда так делаю. так я уже копаю во всю в его сторону
Он выдаёт постоянно одно и тоже значение которое не меняется.
Я использую класс MsAcpi_ThermalZoneTemperature и объект CurrentTemperature постоянно выдаёт одно и тоже 2982.
CurrentTemperature выдаёт не температуру проца, а температуру с датчикам расположенного на материнской плате.
Можно например вытащить комп на балкон и через 10 мин опять запустить её и увидеть что темпера просела.
>перенаправляют на сторонние сайты, не gnu.org
Ты бы ещё посетовал, что за установкой линупса тебя отправляют не на kernel.org
Можно ли сделать это лучше, оптимизировать/рефакторить?
(сам заметил, что strcmp неправильно использовал)
Почему его считают плохим выбором начинающего для изучения программирования?
Кто считает? Си первым делом изучают например в cs50 или в школе21. Мой препод в универе говорил, что си хороший первый язык.
Из аргументов: учишься работать с памятью, простой синтаксис.
Зачем ты написать свой велосипед, с использованием системного вызова и побайтовым чтением?
scanf("%ms", &string); // POSIX 2013
у вас слишком сложно
уже попердолился и написал типа
gcc -o $(NAME) $(OBJ_FILES) $(LIBA)
вроде работает.
Мне говорили что книжка по мейкфайлам около 700 страниц, так и живу на основе ранее написанного
400x720, 0:14
А чем он проще? Просто извини мне мало да, потому что мне придётся ставить его дуалбутом щас в uefi а это геморрой тот ещё.
Чем винда.
Вчера оставлял тред, никто туда не зашёл и его снесло, потому что я забыл бампнуть. Собственно, вопрос с треда: Насколько распространено использование wm_keyboard_LL для отслеживания нажатий клавиш, и как сильно на это могут триггерится антивирусы / античиторы / антипидоры?
Думаю, что как минимум тем, что у него открыт исходный код; в репозитории ядра много примеров драйверов для разных устройств, в которых можно покопаться (предварительно разобравшись, как ядро с ними взаимодействует).
А в чём геморрой? На моём личном опыте линуксовский GRUB рядом с виндусовским загрузчиком хорошо рядом встаёт; слышал о проблемах с какими-то моделями efi, но сам не встречался. Плюс, если тебе просто дрова писать и тестировать, то и места свободного на диске много выделять не надо.
>а что?
Это сломанная логика или малварь 2002 года? Глобальный перехват клавиш не нужен в полезном ПО.
Пилю хуйню исключительно для себя, да и о полезности своей хуйни я не заявлял.
>не нужен
Кто сказал?
Берёшь и реагируешь на нажатие клавиатуры по всему кудахтеру.
Если самому додумать слишком сложно, то можешь сразу сливаться
>Берёшь и реагируешь на нажатие клавиатуры по всему кудахтеру.
Маневры от мамкиного хакера по статьям нулевых.
>>319440
спасибо, что пояснил, анон.
да я так сказал про дуал потому что как-то хотел вторую винду поставить и она выёбываться начала что диск размечен не в рекомендуемом порядке и в итоге крашилась при установке. сами микрпософты не рекомендуют в двуал бут в ефи 2 винды пилить.
спасибо, анон. тогда будем в linux стремиться для начала
>wm_keyboard_LL
Эти хуки хороши только если тебе нужен доскональный контроль клавы/мыши, включая блокировку. Например есть НЕАКТИВНОЕ окно которое тебе нужно скроллить и кликать в нём, но БЕЗ АКТИВАЦИИ этого окна. С помощью хука перехватываешь все события, реагируешь на них как хочешь, при этом можешь блокировать какие надо от дальшейшей обработки системой по умолчанию.
Звучит красиво, но - ненадежно. Хуки работают по принципу цепи - передачи сообщений от одного приложения к другому. Это значит, если хук используют два и более приложения, и одно из них обрабатывает сообщения некорректно или блокирует от передачи дальше, остальные приложения в цепи больше сообщения не получают и висят мертвые, не реагируют. Есть достаточно софта, даже от больших серьезных компаний, страдающего подобным говнокодом. Будь готов к тому, что твоя прога в любой момент отвалится "просто так".
Надежно работает GetAsyncKeyState(), но эту байду нужно дергать по таймеру, что зашквар, и быстрые нажатия таким образом можно пропустить. Еще есть RegisterHotKey(). Сам не пользовался, но для своей задачи выглядит наилучшим выбором. Шлёт сообщения как положено, и вряд ли будет отваливаться как хук.
Вообще, я думаю, есль же всякие кейлоггеры, где реализовано всё как надо, но эти хацкеры мамкины жлобы код скрывают.
>мб есть какой способ намутить темплейты как в плюсах используя какой-нибудь не сишный препроцессор?
Чем тебя сишный не устраивает?
1) Зачем они тебе?
2) Что ты понимаешь под темплейтами?
3) Зачем шаблоны в Си?
От твоих ответов зависит возможно или нет.
> 1) Зачем они тебе?
чтобы не писать вручную миллион одинаковых функций и структур типо
int func_int(int arg1, int arg2)
float func_float(float arg1, float arg2)
и т.д.
>> 2) Что ты понимаешь под темплейтами?
то что в плюсах понимается под темплейтами
>> 3) Зачем шаблоны в Си?
а зачем спрашивать один и тот же вопрос 2 раза?
>а что, можно темплейты намутить на сишном препроцессоре?
Да, только выглядят они несколько говняно. Посмотри sglib, например.
Auxiliary
>2297526
По какой причине make может не печатать выполняемые команды в процессе сборки? Запускаю с ключом --no-silent, но выхлопа нет.
Сама сборка вроде идет, но гдет в середине процесса вываливается нихуя неинформативная ошибка с вызовом bzip2 откудато из глубин мейкфайла.
компилятор можно написать на чем угодно: на жаваскрипте, питоне, сишарпе и даже авке, только на штмл и цсс не получится наверное
Хочу сделать проверку допустимости ввода только чисел, которые при соблюдении условия будут записываться в массив.
Если ввожу только числа, то программка работает, а если ввожу другой символ, то консолька зависает. Объясните пожалуйста
Считывай в строку, а после пройдись по ней функцей isdigit, дальше через atoi преобразуй строку в int, размер буфера (для строки) будет равен `sizeof(#__INT_MAX__) + 1`.
>`sizeof(#__INT_MAX__) + 1`
__INT_MAX__ - максимальное значение int в десятичной системе, в строковом представлении, + 1 для знака и еще + 1 для терминального нуля.
А можно ли как-то сделать без функций атой, сайзоф и т.п.? Я пока что ещё не дошел до этих тем с работами со строками, пока хочу разобраться как циклы сделать с помощью простых отношений
Похоже у меня нет случая для while(0)?
Поэтому консолька не знает что делать в такой ситуации, когда вводится не число
https://0bin.net/paste/vfkSDtUL#BeLJo4RejCVmredhUpfJ26xXZQ-KeXEkbbO32Kh7FQg
Тебе нужно очищать stdin после неправильных данных, иначе scanf будет вечно считывать неправильные данные.
Но в примере все равно происходит неправильная обработка строк вида "1000qwerty", потому что scanf считывает только 1000, а последующее чтение возвращает "qwerty", поэтому очистку stdin надо сделать общей для 2 случаев, то есть вынести за проверку.
Ответ, как всегда, один - а хули нет?
Почему-то иногда при запуска кода на Си(1 раз из 5), в переменные записывается какая-то дрянь, работал с указателями, сначала думал, что может неправильно память выделял, но после перепроверки и просмотра кода построчно понял, что все нормально, проблема в том, что только в некоторых ячейках памяти матрицы какая-то ерунда, в остальных все нормально, выделял память под матрицу char.
операционная система Windows 10, процессор AMD, работал на ноуте, был разряжен до 15 процентов
/
Назначение: выводит на консоль интерпритации, где формула принимает 1 и 0, в массиве r размером K
содержаться значения функции на всех двоичных векторах, Kset - количество переменных в формуле
Входные данные: r, K, Kset
/
void falseAndTrue(int r, int K, unsigned Kset){
int count = K - 1;
char bits = (char )malloc(sizeof(char) K);
for (int i = 0; count > -1; i++, count--){
bits = (char )malloc(Kset sizeof(char));
for (int k = 1 << (Kset - 1), j = 0; k; k >>= 1, j++)
bits[j] = (count & k) >> (Kset - 1 - j);
}
printf("Формула принимает 0 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 0){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("\nФормула принимает 1 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 1){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("Дошел сюда\n");
for (int i = 0; i < K; i++)
free(bits);
free(bits);
printf("Освободил битс\n");
}
/
Назначение: выводит на консоль интерпритации, где формула принимает 1 и 0, в массиве r размером K
содержаться значения функции на всех двоичных векторах, Kset - количество переменных в формуле
Входные данные: r, K, Kset
/
void falseAndTrue(int r, int K, unsigned Kset){
int count = K - 1;
char bits = (char )malloc(sizeof(char) K);
for (int i = 0; count > -1; i++, count--){
bits = (char )malloc(Kset sizeof(char));
for (int k = 1 << (Kset - 1), j = 0; k; k >>= 1, j++)
bits[j] = (count & k) >> (Kset - 1 - j);
}
printf("Формула принимает 0 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 0){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("\nФормула принимает 1 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 1){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("Дошел сюда\n");
for (int i = 0; i < K; i++)
free(bits);
free(bits);
printf("Освободил битс\n");
}
Назначение: выводит на консоль интерпритации, где формула принимает 1 и 0, в массиве r размером K
содержаться значения функции на всех двоичных векторах, Kset - количество переменных в формуле
Входные данные: r, K, Kset
/
void falseAndTrue(int r, int K, unsigned Kset){
int count = K - 1;
char bits = (char )malloc(sizeof(char) K);
for (int i = 0; count > -1; i++, count--){
bits = (char )malloc(Kset sizeof(char));
for (int k = 1 « (Kset - 1), j = 0; k; k »= 1, j++)
bits[j] = (count & k) » (Kset - 1 - j);
}
printf("Формула принимает 0 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 0){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("\nФормула принимает 1 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 1){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("Дошел сюда\n");
for (int i = 0; i < K; i++)
free(bits);
free(bits);
printf("Освободил битс\n");
}
Назначение: выводит на консоль интерпритации, где формула принимает 1 и 0, в массиве r размером K
содержаться значения функции на всех двоичных векторах, Kset - количество переменных в формуле
Входные данные: r, K, Kset
/
void falseAndTrue(int r, int K, unsigned Kset){
int count = K - 1;
char bits = (char )malloc(sizeof(char) K);
for (int i = 0; count > -1; i++, count--){
bits = (char )malloc(Kset sizeof(char));
for (int k = 1 « (Kset - 1), j = 0; k; k »= 1, j++)
bits[j] = (count & k) » (Kset - 1 - j);
}
printf("Формула принимает 0 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 0){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("\nФормула принимает 1 на значениях:\n");
for (int i = 0; i < K; i++){
if (r == 1){
for (int j = 0; j < Kset; j++)
printf("%d ", bits[j]);
putchar('\n');
}
}
printf("Дошел сюда\n");
for (int i = 0; i < K; i++)
free(bits);
free(bits);
printf("Освободил битс\n");
}
Указатели проебались, ибо текст интерпритировал как разметку
А блять, я понял почему, потому что я выделил память не под char*(указатель на char), а просто на char, пиздец, бля
Ебался три часа из-за одной строчки
Есть массив, и в нем надо найти символ, когда он встречается в первый раз.
Я создал массив, сохраняю символ в переменную и передаю массив и символ в функцию, которая должна вернуть мне адрес ячейки, где символ встречается в первый раз.
Но я запутался с этими типами и указателями. Максимум что получается это вернуть значение по адресу, но не сам адрес.
Помогите, прошу...
>return &text
Ты возвращаешь адрес указателя, а не адрес, на который он указывает. Возвращай сам указатель: return text
Я уж пробовал и так, но не работает, он ругается говорит
error: returning 'char *' from a function with return type 'char' makes integer from pointer without a cast [-Wint-conversion]
40 | return text;
В объявление функции ты должен указать возвращаемый тип данных. Вместо "char searh(...)", "char* search", так как при возврате переменной text, из функции возвращается адрес на char, а не char
Спасибо, только что додумался. до этого так не делал ни разу. Объявлял функцию как функцию, а не указатель
Но что-то мне подсказывает, что можно как-то сделать так чтобы вернуть адрес ячейки можно было бы вернуть из функции объявленной без звездочки.
Можно ли так?
Нет, так нельзя, потому что возвращаемый тип данных должен соответствовать объявлению функции. Возвращаешься указатель -- функций объявлена, как указатель, возвращаешь char -- функция объявлена, как char, и т.д.
Понял. Большое спасибо. В книге видимо упустил такое
(void *a,b; вылетит с ошибкой "нельзя переменную void")
Из за этого для объявления указателя на функцию нужно лишние скобочки писать, а профит в чем?
>а профит в чем?
Я так понимаю, что можно объявить и переменную и указатель на неё
int a, pa, b, pb;
>Объясните нубу, почему звездочка указателя должна являться частью имени переменной, а не типа данных
Указатель не является типом.
>Из за этого для объявления указателя на функцию нужно лишние скобочки писать
Не нужно.
В GCC вырождается в movzbl, а это, если я верно знаю, загружает 1 байт и дополняет нулями до размера регистра.
>Стоит проходить cs50?
Если хочешь.
>Почему надо учить си, а не сразу c++?
Понимание реализаций C++ кода.
С++ убивает.
Пидора вопрос.
Вот это скомпилируется в 2 команды:
static float f(float x)
{
return sin(x);
}
float g(void)
{
return f(1.25);
}
Мне не оптимизация нужна, а аналог constexpr из C++, сотни строк макросов идут нахуй.
А, ну ищи.
const (костанта) == "неизменяемое". И тут ты такой int в char[] превращаешь. Тут даже Java спросит "а не сделать ли get(), set() и cast"?
>по стандарту 99.
То есть в стандарте константа не константа.
Нет, не верю. Комитет те еще пидорасины, но не до такой степени.
Это прыщавые дебилы обосрались.
По умолчанию в стеке тебе делать нечего, тем более тупой индусской макаке.
>>323427
Это была хуевая идея. Если так надо насрать в стеке, есть alloca(), однако давать срать по умолчанию даже без осознания этого факта программистом, ну это дно. Или же это показатель, что именно язык "С" не предназначен для обычных людей, а строго инструмент специалистов досконально понимающих такое подъебки.
>По умолчанию в стеке тебе делать нечего
Что значит "по умолчанию"?
>тем более тупой индусской макаке
Как ты определил, что он макака?
>Если так надо насрать в стеке, есть alloca()
Нет. https://www.opennet.ru/man.shtml?topic=alloca
>однако давать срать по умолчанию даже без осознания этого факта программистом
Что значит "по умолчанию"?
Значит что я мать твою ебал.
>Что значит "по умолчанию"?
Без специальных действие с твоей стороны для получения доступа, что будет означать ты понимаешь что делаешь и лезешь туда намеренно. А по-умолчанию, когда просто пишешь обычный код, но он лезет куда не надо без твоего разумения. Последствия такой хуйни "я пишу сам не знаю что" самые печальные. Однако, последнее - естественное положение вещей в говномакакинге. Эти ввыродки думают, что так и надо, что это и етсь программирование, не осознавая, что в си это не работает, так нельзя тут.
>Как ты определил, что он макака?
В си, не знать про стек. Залетная макака, ну или серь тролит тупостью.
VLA, мамоёб, ты в него умеешь?
Тебе расписать, что в нем говно?
https://0bin.net/paste/1I+D6VCP#84l06XwJDrEtncfUk0JkfU6CZ-cqqf4LxqnEpIkwXGe
Ошибки одни и те же, результаты не проверял, примерно по коду написал какие проблемы есть.
Варнинги и ошибки компиляции, если я захочу передать const char X в функцию, которая принимает char X, но при этом работает с ним, как с const char X, то мне придется отключать варнинги и ошибки.
>код я писал в виме из за чего форматирование код машет быть хуёвой
Хуевое оправдание.
>Скинь тогда плагин для форматирования кода в виме
clang-format (не плагин), но не рекомендую использовать версии до 15, мало функционала может оказаться.
>>322086
Спасибо, хотя все еще кажется что не перевешивает
>>322121
> Указатель не является типом.
Передай в функцию, требующую указатель на int целочисленное значение и почитай что напишет компилятор
> Не нужно.
int foo(int a, double b) создаст функцию с возвращаемым типом int, единственный способ создать указатель - добавить скобки
int (*foo)(int a, double b);
Попробуй разобраться в вопросе прежде чем щитпостить
Во всех подобных случаях смотри асм-выхлоп, это многое прояснит. Вангую следующее: поскольку printf принимает любое количество параметров, они идут по cdecl конвенции, т.е. ты кладешь на стек один байт char и следом четыре байта int, а printf читает два раза по четыре байта unsigned, поэтому и распидорашивает все. Но если такого уровня ответ тебя не устраивает, то кастуй char в unsigned.
>смотри асм-выхлоп
так там же вся суть происходит в принтфе, в котором много вложенных вызовов всяких других функций, такое я хз как смотреть
>ты кладешь на стек один байт
вот кстати что видно из асма, так это то что кладётся именно 4 байта, и вообще не видел чтоб когда-нибудь было по-другому
>кастуй char в unsigned
так оно же в памяти будет в таком же виде храниться, не?
вот просто можно даже абстрагироваться от сканфа, как так получается что чар по модулю больше 255
> кладётся именно 4 байта
Я почему-то подумал, что идет именно один байт. Но вообще это логично, что это не так, стек выгодно выровненным держать.
> так там же вся суть происходит в принтфе
Ну почему, у тебя уже видно как минимум то, что movsx по своему определению пробрасывает знаковый бит, а т.к. пишется unsigned, то он в 31 разряде и дает тебе твои 4 миллиарда.
> так оно же в памяти будет в таком же виде храниться, не?
Не, в памяти char хранится именно как один байт. Но это без учета возможного выравнивания полей в структурах, ну или, как видно, на стеке.
>movsx по своему определению пробрасывает знаковый бит, а т.к. пишется unsigned, то он в 31 разряде и дает тебе твои 4 миллиарда.
а вот этого я почему-то не заметил... тогда вопрос решен, спасибо
>Не, в памяти char хранится именно как один байт
Я знаю что один байт, я про то что signed и unsigned это одно и то же значение
> я про то что signed и unsigned это одно и то же значение
Ну как бы да, нужно только не забывать, что там UB дохуя где на операциях на знаковых. Но отметить хотел бы немного ебанутую терминологию, которая ввела тебя в заблуждение: unsigned сам по себе в сишке это сокращение от unsigned long, он 4 байта на большинстве платформ.
>unsigned long
Вроде unsigned int. Ну да, я знаю, просто мы говорили про чар и я подумал что ты имеешь в виду unsigned char.
>Попробуй разобраться в вопросе прежде чем щитпостить
https://godbolt.org/z/Yq1GGxKsY
Где скобочки?
Ты вводишь 2 символа, а scanf ожидает у тебя 2 строки, которые можно преобразовать в целочисленные типы, в итоге получается, что ты просто выводишь неинициализированные значения, которые приводишь со знакового и более короткого к unsigned.
>Что должен сегодня знать и уметь
Все.
>C junior
Их нет.
>Какие программы,
Отладчики.
>фреймворки?
Их нет.
Как они должны ускорять его?
ООП помогает поддерживать код в больших проектах. С ним проще ориентироваться в коде. Ускоряют написание -- хз, что ты имеешь в виду -- какой-нибудь костыль или маленькое приложение быстрее напишешь без ооп, но потом будешь страдать при дебаге.
>ООП помогает поддерживать код в больших проектах
Поправка: поддерживать код в больших проектах, силами большой команды. Если ты делаешь в одно рыло, но в принципе тоже приятнее будет, но не так остро, когда рыл много
>какой-нибудь костыль или маленькое приложение быстрее напишешь без ооп, но потом будешь страдать при дебаге.
Нет. Меньше кода - меньше ебли с отладкой.
>в больших проектах, силами большой команды
Тащемто достаточно модульности кода + распределения ответственности.
>Да даже ассемблер -- абстракция над схемами из транзисторов.
Нет.
>ООП помогает поддерживать код в больших проектах.
Нет.
>С ним проще ориентироваться в коде.
Вкусовщина.
>но потом будешь страдать при дебаге.
Нет.
>Да даже ассемблер -- абстракция над схемами из транзисторов.
Но ассемблер это всего-лишь язык. Вот архитектура это непосредственная абстракция над микроархитектурой, а ОС - над архитектурами. Где тут место языкам и в частности ассемблеру?
почему сравнение при высчитывании второй функции не работает, а с первой всё нормально?
Какое описание задачи? По коду нельзя понять, что ты хотел сделать и где ошибка, что такое первая и вторая функция, какая проверка не работает?
Возможно проблема в том, что ты переопределяешь переменные `min` и `max` внутри блоков проверок.
>Какое описание задачи?
Больше интересно, в какой тупорылой шараге задают математические задачки на си, самом непригодном для математики языке.
Любой с удобной реализацией длинной арифметикой из коробки.
Для домашней махарайки хотел бы реализовать эффект из программы Jinx! для LED табло 5х5.
Есть шрифт 5х5 точек, который хранится в виде строк двумерного массива.
Ссылка на образец шрифта: https://pastebin.com/htDxc92r
Последовательность действий:
1) получили строку символов
2) нашли первый символ в массиве шрифта и вывели его на табло без сдвига
3) начинаем сдвигать точки первого символа влево
3.1) между символами необходим промежуток в 1-2 пикселя
4) сдвигаем точки символов влево, пока последний символ не будет отрисован полностью
5) начинаем сдвигать последний выведенный символ вправо с соблюдением п. 3.1
Matrix:
4 5 14 15 24
3 6 13 16 23
2 7 12 17 22
1 8 11 18 21
0 9 10 19 20
"Матрица", 5 строк на 5 столбцов - индексы массива светодиодов, где 0 - соответствует первому светодиоду и 0-ому индексу в массиве
Начало точки отсчёта координат ХУ в моём случае - верхний левый угол (индекс 4 матрицы).
Проблема вот в чём: произвели сдвиг первого символа на 3 столбца влево -> тут же надо вставить промежуток в 1-2 пикселя -> и подвязать первый столбец второго символа. И так далее.
Вот именно на этом алгоритме у меня мозг и закипел.
Могу скинуть говнокод для вывода символа на табло (он не слишком опрятный). Сдвиг тоже есть, но крайне хуёвый. Есть спизженная функция, которая транслирует координаты Х У в индексы массива светодиодов.
Есть сомнительная идея - динамически выделять память под двумерный массив uint64_t, и попытатсья пихать туда побитово символы - по аналогии с массивом шрифта: 8 символов полученной строки на каждый элемент массива. А потом сдвигать всё это дело.
Идея крайне говёная и плохо подходит для эмбед. Но это вобще крайний вариант, прежде чем застрелиться.
П.С. Тем, кому влом помочь - пожалуйста, просто пройдите мимо. Вам не впервой.
Для домашней махарайки хотел бы реализовать эффект из программы Jinx! для LED табло 5х5.
Есть шрифт 5х5 точек, который хранится в виде строк двумерного массива.
Ссылка на образец шрифта: https://pastebin.com/htDxc92r
Последовательность действий:
1) получили строку символов
2) нашли первый символ в массиве шрифта и вывели его на табло без сдвига
3) начинаем сдвигать точки первого символа влево
3.1) между символами необходим промежуток в 1-2 пикселя
4) сдвигаем точки символов влево, пока последний символ не будет отрисован полностью
5) начинаем сдвигать последний выведенный символ вправо с соблюдением п. 3.1
Matrix:
4 5 14 15 24
3 6 13 16 23
2 7 12 17 22
1 8 11 18 21
0 9 10 19 20
"Матрица", 5 строк на 5 столбцов - индексы массива светодиодов, где 0 - соответствует первому светодиоду и 0-ому индексу в массиве
Начало точки отсчёта координат ХУ в моём случае - верхний левый угол (индекс 4 матрицы).
Проблема вот в чём: произвели сдвиг первого символа на 3 столбца влево -> тут же надо вставить промежуток в 1-2 пикселя -> и подвязать первый столбец второго символа. И так далее.
Вот именно на этом алгоритме у меня мозг и закипел.
Могу скинуть говнокод для вывода символа на табло (он не слишком опрятный). Сдвиг тоже есть, но крайне хуёвый. Есть спизженная функция, которая транслирует координаты Х У в индексы массива светодиодов.
Есть сомнительная идея - динамически выделять память под двумерный массив uint64_t, и попытатсья пихать туда побитово символы - по аналогии с массивом шрифта: 8 символов полученной строки на каждый элемент массива. А потом сдвигать всё это дело.
Идея крайне говёная и плохо подходит для эмбед. Но это вобще крайний вариант, прежде чем застрелиться.
П.С. Тем, кому влом помочь - пожалуйста, просто пройдите мимо. Вам не впервой.
Если я правильно понял, то ты хочешь вот это. Алгоритм хуевый, можно легче, но это первое, что придумал.
https://0bin.net/paste/mIdB9VIW#zHzsMwIDGAVCSPmSAjOiaxmW1AlOwBv9mfjfJ1kz2Dh
Под виндой не соберется, потому что пошли нахуй виндобляди.
Не хватает прокрутки вправо при достижении последнего символа строки.
Эффект в программе называется: "эффект внутренней прокрутки текста" (текст влево <-> вправо, т.е. от первого символа до последнего влево, а по достижении последнего символа - вправо до достижения первого символа; и всё по циклу снова, влево <-> вправо).
Анончик, доделай плез. Если не слишком занят.
Я пока пойду вкуривать что к чему в том, что ты скинул. У меня это много времени займёт.
Не совсем понял, что ты хочешь сделать. Обычно текст отрисовывают в видеобуфер(массив, который содержит состояния точек-пикселей), откуда уже последовательно столбец-за столбцом выводится на матрицу. Сдвиги и промежутки делаются элементарно изменением индекса при чтении этого буфера.
>Смещения и рывки сам исправляй, мне лень офсеты считать.
Окей, попробую. Спасибо за помощь и уделённое время.
Ты это, в тред иногда заходи - если разберусь с кодом и он взлетит, то хотел бы отблагодарить. Хотя бы пополнением абонентки на телефон любым способом.
>>327259
>Не совсем понял, что ты хочешь сделать.
Хотелось бы избежать использование промежуточного буфера и транслировать на лету текстовые символы + эффекты напрямую в массив, который отображает текущее состояние светодиодов на матрице. Памяти на устройстве очень мало.
Такие же вопросы касаются всех имен в стандартной библиотеке, почему они выглядят, как не читаемое говно? Ебанные деды.
У дедов было мало памяти и скорости, дурачок, не более шести символов в идентификаторе гарантировалось. Ты ещё про линуксовые команды пожалуйся, ls cp и т.д.
>У дедов было мало памяти и скорости, дурачок, не более шести символов в идентификаторе гарантировалось.
Использовать хэши?
Анончик, спасибо за старание. Но, кажется, твой код мимо кассы. У тебя завязка на шрифт и консольку. Ну или, скорее всего, я не догоняю, как адаптировать код под свои нужды.
Прилагаю код вывода символов из строки на светодиодную матриуцу, который работает у меня.
Может это внесёт ясность.
https://0bin.net/paste/DYrrjfhX#MEaLqlKjeyv668pVllW5ejCXBLYXQ99u9XZkbLIigxw
Сдвиг влево или право добавляется к xpos: + вправо, - влево.
Чтобы твои труда не пропали даром - напиши, как тебя отблагодарить.
Спасибо тебе, добрый человек.
Это пример алгоритма без дополнительных буферов, просто адаптируй вывод на матрицу, сделай абстрактную функцию print_matrix, которая будет преобразовывать смещения под твои данные, у тебя вроде координаты на ней какие-то ебанутые, на вход которой будет подаваться массив значений, типа "10001", где 1 - это включение светодиода, 0 - это выключение. В итоге, сигнал должен будет подаваться на "линию" светодиодов. После чего замени в алгоритме printf на свой print_matrix и подправь остальные данные, как тебе надо. Обнуление состояний светодиодов в таком случае не нужно будет, потому что я же не перезаписываю руками символы в терминале, их перезаписывает следующее число.
Если ты не слишком занят, то напиши, плез, на мыло
Честно - я не очень понимаю, что творится в твоём коде и смог выделить только некоторые части.
П.С. Мыло фейковое, для связи.
Аноны напишите годных, заковыристых а так же уебанских вопросов, которые задавали вам на собесе Си. Особенно в эмбеддед.
На последнем собесе мне задавали вопросы самой разной группы инвалидности, например, но среди них можно найти годноту:
1. Назовите отличия стандартов с89 и с99 - справочная информация задрачиванию не подлежит
2. Посмотрите на этот лист А4 кода и найдите все типы ошибок которые тут есть, вплоть до звездочек, точек с запятой, объявления переменных после оперидрования с другими переменными (привет из С89) и прочей иногда не особо очевидной хуеты.
3. Сможет ли МК заработать после первой микросекунды вклчения? - как по мне вопрос хуйня, т.к. он требует некоторых знаний в электронике, которые эмбеддер не обязан иметь.
4. С какими типами оптимизации вы работаете?
5. Как происходит прерывание? вопрос норм, полагаю
6. Что будет если, 2 ядра работающие в параллель, одновременно считывают из одной ячейки памяти и инкреентируют её? Как предотвратить такую ситуацию? - считаю достаточно хорошим вопросом
7. Мьютексы, хуютексы, volatile, static, константный указатель, указатель на константу, указатель на функцию, битовые операции - задают везде по дефолту
Пиздец, я думал хуже тюремных загадок ничего в жизни не узнаю. Уровень такой же, что и у этих вопросов.
Вот поэтому и спрашиваю, заебали валить хуетой справочной по 2-е, 3-е, как будто себе невротебаться техлида ищут толпой.
Спасибо, проверил - действительно можно.
А чому тогда во всех туторах для вкатывальщиков рассказывается о хидер-декларациях и .с-имплементациях? Это что-то вроде гуд-практис?
> 3. Сможет ли МК заработать после первой микросекунды вклчения? - как по мне вопрос хуйня, т.к. он требует некоторых знаний в электронике, которые эмбеддер не обязан иметь.
Ну, если в резюме написано, что работал с мк, то это хороший способ проверить, изучил ли чел хоть один даташит.
> 4. С какими типами оптимизации вы работаете?
Ыыы.
Мне задавали вопрос, как предельно точно синхронизировать время между двумя машинами. Надо было расписать пакеты с метками времени и расчеты, я затупил.
>Ну, если в резюме написано, что работал с мк, то это хороший способ проверить, изучил ли чел хоть один даташит.
Тут дело-то не совсем в МК, если говорить про программу - по любому нет, какой бы МК не был. Сначала микроконтроллер настраивает периферию. Это уже ассемблерная часть но пока до нее далеко, см ниже. И это почти всегда элементарный и очевидный ответ.
Но можно углубиться в стартовую логику - т.е. вшитая логика с помощью которой выставляются лог элементы для нормального запуска, т.к. некоторые элементы могут иметь неопределенное состояние от остаточных зарядов, такие как компараторы, триггеры, счетчики.
А если говорить еще и про обвязку и саму работу в целом, т.е. стартанул или нет - то совсем дргуое дело: если посмотреть осциллографом на резонатор, то он стартутет как нарастающая волна (скорее всего из-за конденсаторов возле него). Итог - МК стоит в супоре в самом начале, т.к. резонанор не запущен.
>Надо было расписать пакеты с метками времени и расчеты, я затупил.
В NTP протоколе вроде отправляются пакеты с поправкой на пинг, не?
Вот теории немного набросал, в целом должно быть понятно, если бы я еще писать нормально умел.
https://0bin.net/paste/7UT4-5qv#7FqOWgFFW9y+v-yURlC54wfaRLml4BbxVSmTAMsyICd
Да. Гугли single header library.
>>328196
>А чому тогда во всех туторах для вкатывальщиков рассказывается о хидер-декларациях и .с-имплементациях?
>Это что-то вроде гуд-практис?
Это.
Если тело функции находиться в хедере, то его нужно отделять от объявления блоками #ifdef.
//f1.h
int f1(int a);
#ifdef F1IMPL
int f1(int a)
{
return a+a;
}
#endif
А в одном из .с файлов делать define перед инклудом хедера.
//main.c
#include <stdio.h>
#include <stdlib.h>
#define F1IMPL 1
#include "f1.h"
...
Иначе при сборке из нескольких .с файлов использующих это хедер, будет ошибка линковки из-за повторного включения кода фунции.
Да. Гугли single header library.
>>328196
>А чому тогда во всех туторах для вкатывальщиков рассказывается о хидер-декларациях и .с-имплементациях?
>Это что-то вроде гуд-практис?
Это.
Если тело функции находиться в хедере, то его нужно отделять от объявления блоками #ifdef.
//f1.h
int f1(int a);
#ifdef F1IMPL
int f1(int a)
{
return a+a;
}
#endif
А в одном из .с файлов делать define перед инклудом хедера.
//main.c
#include <stdio.h>
#include <stdlib.h>
#define F1IMPL 1
#include "f1.h"
...
Иначе при сборке из нескольких .с файлов использующих это хедер, будет ошибка линковки из-за повторного включения кода фунции.
enum {
...
flag_end = 0x1000 0000
}
то как будет работать этот enum на системах, меньшей битности 16 и 8 битных, он урежет мне все флаги по 0x1000 и 0x10 соответственно?
или исходя из того, что int всегда должен быть не менее 4 байт по стандарту у меня всегда есть как минимум эти 32 бита?
> int всегда должен быть не менее 4 байт по стандарту
Не должен.
>как будет работать этот enum
Как угодно.
но в стандарте C99 и C11 написано это
6.7.2.2 Enumeration specifiers
[...]
Constraints
The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an int.
а про int написано, что
Basic signed integer type. Capable of containing at least the [−32,767, +32,767] range
т.е. получается, что можно уверенно хранить флаги до 0x8000
потому что даже на 8 битных системах, int будет не менее 2 байт
Хорошо, попробуем пойти более сложным путём...
Попытался адаптировать свой говнокод.
if (offset <= 0)
{
// printf("\033[%zu;1H", i + 1);
x = 0;
y = i;
}
else
{
// printf("\033[%zu;%uH", i + 1, offset + 1);
x = offset;
y = i;
}
Я правильно интерпретировал эту часть кода? Если этот кусок вобще нужен.
// Выводим строку с обрезанием ее конца, в зависимости от смещения.
printf("%.*s", _DIGITS_FONT_WIDGTH - offset, line);
Я парвильно понимаю, что из целой строки выводятся только первые _DIGITS_FONT_WIDGTH - offset символов?
Т.е. из битового представления строки надо считать только первые _DIGITS_FONT_WIDGTH - offset бит?
Допустим, строка 0x0F -> читаем первые 5 бит (левый бит MSB) -> будет считано 0000 1
// Выводим строку со смещением в начале.
printf("%s", line + _DIGITS_FONT_WIDGTH + offset);
По сравнению с предыдущей строкой кода - недопонял.
Надо что - сдвинуть строку на _DIGITS_FONT_WIDGTH + offset? Или пропустить первые _DIGITS_FONT_WIDGTH + offset бит в строке?
Хорошо, попробуем пойти более сложным путём...
Попытался адаптировать свой говнокод.
if (offset <= 0)
{
// printf("\033[%zu;1H", i + 1);
x = 0;
y = i;
}
else
{
// printf("\033[%zu;%uH", i + 1, offset + 1);
x = offset;
y = i;
}
Я правильно интерпретировал эту часть кода? Если этот кусок вобще нужен.
// Выводим строку с обрезанием ее конца, в зависимости от смещения.
printf("%.*s", _DIGITS_FONT_WIDGTH - offset, line);
Я парвильно понимаю, что из целой строки выводятся только первые _DIGITS_FONT_WIDGTH - offset символов?
Т.е. из битового представления строки надо считать только первые _DIGITS_FONT_WIDGTH - offset бит?
Допустим, строка 0x0F -> читаем первые 5 бит (левый бит MSB) -> будет считано 0000 1
// Выводим строку со смещением в начале.
printf("%s", line + _DIGITS_FONT_WIDGTH + offset);
По сравнению с предыдущей строкой кода - недопонял.
Надо что - сдвинуть строку на _DIGITS_FONT_WIDGTH + offset? Или пропустить первые _DIGITS_FONT_WIDGTH + offset бит в строке?
Ссылка на говнокод отвалилась: https://0bin.net/paste/muRfYxF8#T21caDIhHtobyFmOSha4y-5k7fFrrwfxA/GXVoXerLI
Скажи, если что непонятно - я прокомментирую.
>Я правильно интерпретировал эту часть кода?
Да.
>Я парвильно понимаю, что из целой строки выводятся только первые _DIGITS_FONT_WIDGTH - offset символов?
Да.
>Т.е. из битового представления строки надо считать только первые _DIGITS_FONT_WIDGTH - offset бит?
Да.
>Допустим, строка 0x0F -> читаем первые 5 бит (левый бит MSB) -> будет считано 0000 1
Да.
>Или пропустить первые _DIGITS_FONT_WIDGTH + offset бит в строке?
Да и вывести остатки, то есть 0x0F + 5 бит -> 111.
ИЩУ УЧЕБНИК
САП! Ищу учебник какого-то Русского препода, вроде в двух томах
Там он обучает программированию на С в Linux
Помогите пожалуйста найти
89: int last_i = 0;
89: int last_i = string[0]; // FIX
В остальном коде разбираться лень, но вроде все правильно, хотя выглядит вроде правильно.
>В остальном коде разбираться лень, но вроде все правильно, хотя выглядит вроде правильно.
Если бы было правильно - оно бы работало :) А судя по моей вебмке, работает как-то не очень...
>89: int last_i = string[0]; // FIX
Так это *(string + last_i) - указывает на символ в строке с индексом 0. Потому что last_i = 0.
А блин, ты же видек скинул, возможно проблема в шрифтах
(xpos < 0 || xpos > FONT_WIDTH || ypos < 0 || ypos > FONT_HEIGHT)
И еще попробуй обрезать значения, типа xpos > FONT_WIDTH, значит xpos = FONT_WIDTH и продолжать вывод, такое же и с отрицательными (меньше чем 0).
>Возможно проблема в этом.
В хедере задефайнено #define LSB_FONT false
Так что заходит в эту строку
>(font_line & (0x80 >> bit))
И это просто проверка - что в байте в конкретном бите - 0 или 1 (если 0 - пиксель погашен, если 1 - зажигаем нужным цветом), которая производится с какого-то бита или до какого-то бита в зависимости от offset.
>>328601
>И еще попробуй обрезать значения, типа xpos > FONT_WIDTH, значит xpos = FONT_WIDTH и продолжать вывод, такое же и с отрицательными (меньше чем 0).
Хорошо. Ушёл возиться.
>И это просто проверка - что в байте в конкретном бите - 0 или 1 (если 0 - пиксель погашен, если 1 - зажигаем нужным цветом), которая производится с какого-то бита или до какого-то бита в зависимости от offset.
У тебя просто `const unsigned char font_line` объявлен, без указателя, я и думаю, что это хуйня какая-то.
>объявлен, без указателя, я и думаю, что это хуйня какая-то.
Ок, как бедт правильно?
Поменял на указатель - получаю пикрелейтед.
static const unsigned char FontData[96][5] = { {}, ..., {} }; // массив со шрифтом
static void _write_font_symbol(led_strip_spi_t strip, rgb_t color, const unsigned char digit_font, int offset) // функция, принимающая конкретный символ из массива шрифта
static void _write_symbol_line(led_strip_spi_t strip, rgb_t color, int x, int y, const unsigned char font_line, int offset) // функция, принимающая строки символа
>Ок, как бедт правильно?
Все было правильно наверно, просто `const unsgined char` странно выглядит.
Да. Проверил на другой функции, которая просто отрисовывает текстовые символы из массива шрифта на матрице. Без сдвигов.
У меня матрица повёрнута на 90 градусов по часов стрелке.
Если вернуть координаты на место, то текст заваливается.
Мда, ну и жопу я себе затеял.
https://godbolt.org/z/sP9dPYj8M
>Координаты не перепутал?
Функция нужна?
Там описание есть небольшое. Замудрено пиздец с координатами.
Попробуй без цикла просто вывести 0, потом смести его на пару светодиодов, проверь, как он отображается. И логи по координатам посмотри и проверь.
for (size_t j = 0; j < FONT_WIDTH; j++)
{
_write_font_symbol(strip, color, FontData[charIndex], FONT_WIDTH - j);
ESP_ERROR_CHECK(led_strip_spi_flush(strip));
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
Недорисовывает однин столбец.
Один цикл проходит в холостую что ли?
Смотрю в книгу - вижу фигу, лол Смотрю логи: https://0bin.net/paste/KMRCKVdM#DHyG+FvQv671Q8-4HjBD7vhraHpL+//MMniTW1wNZkC
5 \n - каждый цикл в _write_font()
Вот из-за этого пропуск что ли?
FONT_WIDTH = 5
j = 0
FONT_WIDTH - j
offset = 5
if (offset >= 0)
{
// printf("%.*s", _DIGITS_FONT_WIDGTH - offset, line);
xBitsToProcess = FONT_WIDTH - offset;
}
best mp
Вот набросал, нолики отрисовывает правильно, твоя функция getPixelStripPosition была заменена на массив, потому что зачем тратить время на вычисления, которые константные. Перепиши, как тебе надо, логи вроде правильные получились.
https://0bin.net/paste/gq6uNOt5#HlGfRWLlaZ7+QwI2CrUqrmjaoIeZLh41auh1dk666b2
с божьей помощью
Вроде не будет работать: у тебя символ нуля отрисован полу-байтом. Тогда как в моём шрифте ширина символа 5 бит.
Вот тут вот символ буквы А: https://godbolt.org/z/sP9dPYj8M
А нуль будет:
static const unsigned char _FONT_TABLE[1][_FONT_ROWS] =
{
{ 0xF8, 0x18, 0x18, 0x18, 0xF8 },
};
Или такой из шрифта:
{0x70, 0x98, 0xA8, 0xC8, 0x70}
Т.е. весь шрифт пяти-битный: 5 на 5 пикселей.
Если откроешь стандартную (а не расширенную) ASCII таблицу, то там все умещается в диапазоне 0-127.
Это не отвечает на вопрос в чем преимущество перед unsigned char тем же
САП! Ищу учебник какого-то Русского препода, вроде в двух томах
Там он обучает программированию на С в Linux
Помогите пожалуйста найти
зачем тебе по С учебник еще и двухтомный, пиши, а если что не знаешь - спрашивай и ищи инфу уже по этому делу
>Для того, как ты хочешь придется менять логику, поэтому проблема в несовместимости шрифта и алгоритма.
Посыпаю голову пеплом
Видео - для демонстрации эффекта. У меня нет 4-ёх битного шрифта, да он мне и не подходит.
Сможешь переделать?
Если я что-то недоописал - спроси. А то опять забредём не в ту степь.
Просто там очень был хороший учебник, да еще и под Linux
А я как раз хотел изучать и С и Linux
Да и тем более, я для интереса ведь занимаюсь этим, как хобби
Мне на 28 лвл без ВО вряд ли удастся вкатиться в разработку на С, но, для себя изучать ОС и системное программирование - это круто
https://ru.wikipedia.org/wiki/Си_(язык_программирования)
https://ru.wikipedia.org/wiki/POSIX
https://www.opennet.ru/man.shtml
Начинай писать код, больше тебе не нужно.
Имею ввиду, что если учить с нуля, по учебникам которые пишутся для изучения основ под винду, то ведь могут быть сложности? Ведь у линух есть своя специфика. Например, отсутствие bat и exe файлов, другие среды разработки, другая файловая система и т.д. и т.п. что не будет приводится в качестве примера в учебниках по С написанных под windows
>русского препода
>С под ЛИнух
Не лучше ли подтянуть англюсик, а там - хоть KR, хоть заграницу (шутка).
>по учебникам которые пишутся для изучения основ
Я просто не понимаю, что люди хотят узнать из книг, что нельзя узнать из документации?
На pdp-11 char был знаковым, так было удобней Ричи. unsigned он добавил не сразу.
Жуки-мужики, скажите, в 29-30 лвл можно вкатиться в С без ВО?
Или для системного программирования техническое ВО необходимо?
На Русском и адаптировано под Linux
Зачем тебе на этапе обучения такие детали? Ты же будешь использовать именно С и стандартную библиотеку. Избегай системные вызовы напрямую. А компилятор скроет от тебя детали реализации. Потом когда разберешь чуть можно смотреть книги по API и ABI Linux. Про формат elf/static/shared objects в инете статьи.
Canonical (разработчик Linux-дистрибутива Ubuntu) выступил против войны в Украине и приостановил работу с российскими компаниями
Red hat так же объявили о полном прекращении работы в РФ.
Популярный open-source пакет начал заменять данные российских пользователей по IP на сердечки.
Один за другим Linux проекты уходят из РФ, open-source себя дискредитировал. Больше нельзя быть уверенным, что твои данные в безопасности. Нельзя быть уверенным, что твой любимый дистрибутив, которым ты пользуешься вскоре не прекратит поддержку пользователей из РФ и вовсе не остановит работу в РФ с закрытием репозиториев, поддержкой языка и т.д.
Вся эта философия open-source, свобода и т.д. оказались просто словами и враньем.
Что делать в такой ситуации? Какие искать альтернативы и остался ли безопасный дистрибутив в котором можно быть уверенным?
>Вся эта философия open-source, свобода и т.д. оказались просто словами и враньем.
Любая религия - враньё, однако религии не исчезают и всегда востребовваны. Подумай почему.
>Ведь у линух есть своя специфика.
Да, и что?
>ведь могут быть сложности?
Нет. Ты должен уже понимать особенности ОС, иначе ты даже даже не пользователь компьютера, а - чайник. Такому в программировании делать нечего. Сначала нужно знать основы компьютера, и только потом заниматься его программированием. Если же ты хочешь писать универсальные мультиплатформенные скрипты, то ошмбся языком и тредом.
нашел в каком треде такой вброс делать, тут у многих ядра в исходниках лежат и все нужные проги и либы к ним, ну дискредитирует кто-то себя, просто не собирать последние версии без собственной ревизии кода, что там изменили и просто вырезать все подобные сердечки
Это нереально. Я просто отложил обновления до лета.
Памахите кто помнит, Прату, 11 глава listing 11.29 sort_str.c
есть константа
#define HALT " " /нулевая строка для прекращения ввода/
в самой программе она не используется, ввод строк не прерывается идёт до 20, как пофиксить?
>есть константа
>#define HALT " " /нулевая строка для прекращения ввода/ в самой программе она не используется,
Получается неправильный комментарий и неиспользуемый дефайн.
>ввод строк не прерывается идёт до 20, как пофиксить?
Добавить выход из цикла ввода.
>>331245
Это из учебника задача
от полный вид https://github.com/svnblame/c-primer-plus-4/blob/master/sort_str.c
вот цикл
>while(ct < LIM && s_gets(input[ct], SIZE) != NULL
&& input[ct][0] != '\0')
Может кто нибудь ещё обращал внимание на это?
Почему опция так странно называется? march
Батник набросай
Сап /pr очень нужна ваша помощь
Собираюсь изучать С
Но так вышло, что у меня очень, очень слабенький комп который тянет только Linux (Debian)
Вкатываюсь я с нуля поэтому я бы попросил порекомендовать учебники по С специально под Linux для нулевого Васи.
Т.к. те учебники, что я видел, они все под windows написаны, с софтом и примерами программ для win
Весь код на си и для линукса. Но книга скорее про написание программ специально для линукса и ближе к системному программированию. Базу языка учи по учебникам из шапке треда
Тому що древнее.
Выучил циклы, символьный ввод вывод, файловый воды, строки, функции, массивы и указатели, структуры связанные списки, немного про препроцессор, битовые операции, интерфейс очереди атд.
Вроде даж получается задачки решать. Что дальше делать?
Было с WSL, потом выключил WSL. Это по-твоему "жрет"?
Для вкатывальщика сложно будет. Но для освоения posix систем - хороша.
>>332480
Что вам так неймётся с желанием бросаться неподготовленными на платформонезависимость? Язык программирования, в частности С для того и создавался, чтобы абстрагироваться от деталей. Для 90% задач (а на вкате и 100%) хватит базового языка и glibc.
Программирование не бывает платформонезависимым потому что это процесс программирования платформы. Вопрос только в выборе платформы.
"Платформонезависимость" в просторечном смысле означает виртуальную платформу, которая может работать на нескольких аппаратных. Но Си предназначен не для виртуальных платформ, а для реальных, поэтому не может быть "платформонезависимым".
Нет, разумеется, раз Си находится "внизу", он позмоляет сымитировать "вверх" виртуальную хуйню путем отказа от зависимых вызовов, но такой огрызок от программы на практике бесполезен.
Как пример, если писать программу чисто под потоковую консоль и базовым вводом/выводом она конечно будет "платформонезависима", но это очень убого, даже хуже программирования на батниках, потому что стоит захотеть например вывести в определенное место экрана или другим цветом, и всё, ты в жопе. Кому нужны такие обосранно убогие программы, уступающие софту с компьютеров из 80-х, для которых программисты в домашних условиях травили и паяли паяльником материнские платы.
Это что касается программирования. А теперь к тупым свиньям вроде тебя, серущим негативом на реальные платформы как будто это что-то плохое. Ну что тут сказать, из сказанного выше уже можно было догадаться, что такой сброд не программисты, а офисные макаки, еще один синоним для "секретутки" или "программиста 1с". Секретутка - не программист, она работает с документами, которые как раз и есть "платформонезависимы", т.к. работают на витруальной платформе которой является приложение. То, что в документы добавляют скриптинг не делает их программированием в настоящем смысле языка Си, хотя Си конечно позволяет сымитировать и секретутку. Но желают так детать только секретутки, а не программисты, вот где загвоздка. Дело в маркетинге, который напиздел на уши лапшу тупому секретутко-сброду, что они якобы программисты. Ну то же самое как рабам рассказывают что они якобы "сеньёры" (господа). Ну как тупое рабское чмо может быть господином? Самим не смешно? Конечно нет, на то и тупой сброд же, мозгов ноль без палочки.
Программирование не бывает платформонезависимым потому что это процесс программирования платформы. Вопрос только в выборе платформы.
"Платформонезависимость" в просторечном смысле означает виртуальную платформу, которая может работать на нескольких аппаратных. Но Си предназначен не для виртуальных платформ, а для реальных, поэтому не может быть "платформонезависимым".
Нет, разумеется, раз Си находится "внизу", он позмоляет сымитировать "вверх" виртуальную хуйню путем отказа от зависимых вызовов, но такой огрызок от программы на практике бесполезен.
Как пример, если писать программу чисто под потоковую консоль и базовым вводом/выводом она конечно будет "платформонезависима", но это очень убого, даже хуже программирования на батниках, потому что стоит захотеть например вывести в определенное место экрана или другим цветом, и всё, ты в жопе. Кому нужны такие обосранно убогие программы, уступающие софту с компьютеров из 80-х, для которых программисты в домашних условиях травили и паяли паяльником материнские платы.
Это что касается программирования. А теперь к тупым свиньям вроде тебя, серущим негативом на реальные платформы как будто это что-то плохое. Ну что тут сказать, из сказанного выше уже можно было догадаться, что такой сброд не программисты, а офисные макаки, еще один синоним для "секретутки" или "программиста 1с". Секретутка - не программист, она работает с документами, которые как раз и есть "платформонезависимы", т.к. работают на витруальной платформе которой является приложение. То, что в документы добавляют скриптинг не делает их программированием в настоящем смысле языка Си, хотя Си конечно позволяет сымитировать и секретутку. Но желают так детать только секретутки, а не программисты, вот где загвоздка. Дело в маркетинге, который напиздел на уши лапшу тупому секретутко-сброду, что они якобы программисты. Ну то же самое как рабам рассказывают что они якобы "сеньёры" (господа). Ну как тупое рабское чмо может быть господином? Самим не смешно? Конечно нет, на то и тупой сброд же, мозгов ноль без палочки.
Знатно тебя порвало, к середине даже правила грамматики перестал соблюдать.
А по твоему высеру, тот же libc писали люди поумнее тебя, и он оптимизирует многие вещи, в которых большинство новичков руками накосячит. Плюс постоянные вызовы ядра (системные вызовы) , явно не добавляет производительности. Тем более задачи начинающего изучать язык сильно отличаются от того что ты упоминал.
>базового языка
Что значит "базового"?
>glibc
Почему именно она?
>>332827
>Программирование не бывает платформонезависимым
Бывает, Си для этого и создали.
>отказа от зависимых вызовов, но такой огрызок от программы на практике бесполезен.
Замена.
>на реальные платформы
Что значит "реальные платформы"?
>что они якобы программист
Кто в твоем понимании является программистом?
>>332853
>libc писали
Какую именно?
>люди поумнее тебя
Как ты это определил?
>большинство новичков руками накосячит
О них никто не думал.
Нужно написать для этого несложную арифметику. Как лучше (или правильно) передавать и возвращать этот юнион в процедуры?
Думаю, что через указатель, так как не везде есть регистры больше 32 бит, но хотел бы узнать авторитетное мнение
Бтв пока писал, возникла генерализация моего вопроса: как вообще передается-возвращается например uint32_t, int64_t на 16битных машинах?
struct { char c[6]; }
>Как лучше (или правильно) передавать и возвращать этот юнион в процедуры?
Указатель.
>как вообще передается-возвращается например uint32_t, int64_t на 16битных машинах?
Зависит от реализации и процессора. Их может вообще не быть.
большое спасибо. пошел программировать на питоне
1. Си создан как высокоуровневый ассемблер, самый что ни на есть платформозависисмый язык.
2. Зачем замена? Есть компьютер, но использовать компьютер - плохо? У тебя с башкой плохо, секретутка.
3. Реальные платформы значит аппаратные платформы, а не виртуальные программные. Си транслируется в ассемблер для аппаратного процессора и прочего железа, это реальный язык работающий на реальной платформе. Лепить под него абстрактные мультиплатформенные прослойки = тыквить его, нивелировать достоинства Си, такой язык не нужен.
4. В моем понимании, программист тот, кто программирует, т.е. управляет устройством посредством написания программы. Это значит, устройство должно быть фиксировано и его спецификации открыты и изучены программистом. Только так можно полноценно использовать возможности устройства. А виртуальные мультиплатформенные машины это закрытые черные ящики, значит ими нельзя полноценно управлять. Это не программирование - управление, а скорее мольбы и надежды, гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает".
>1. Си создан как высокоуровневый ассемблер, самый что ни на есть платформозависисмый язык.
Нет.
>2. Зачем замена?
Замена платформозависимого кода, на другой платформозависимый код.
>2. Есть компьютер, но использовать компьютер - плохо?
Почему ты так решил? Из чего вообще образовалось такое предложение?
>3. Лепить под него абстрактные мультиплатформенные прослойки = тыквить его, нивелировать достоинства Си, такой язык не нужен.
int main(void) { return 1 + 1; }
Удивительно, язык сам позволяет абстрагироваться от машинного кода, получается Си не нужен?
>4. Это значит, устройство должно быть фиксировано и его спецификации открыты и изучены программистом.
В этом треде снова признают всех программистов не программистами, потому что они не подходят под какие-то субъективные определения.
>4. Только так можно полноценно использовать возможности устройства.
Время.
>4. А виртуальные мультиплатформенные машины это закрытые черные ящики, значит ими нельзя полноценно управлять.
В чем отличие операционной системы от виртуальной машины? Получается, снова всех программистов вычеркнул из программистов, даже подходящих под твое описание.
>4. Это не программирование - управление, а скорее мольбы и надежды, гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает".
Почему ты считаешь виртуальные машины "черным ящиком", но не считаешь аппаратные способы выполнения кода "черным ящиком"?
Дополнительно: из таких слов получается, что если в каком-либо процессоре найдется аппаратная ошибка, которая не будет написана в документации, то все программисты включая тех, что подходят под твое определение не будут являться программистами?
Потому что:
>спецификации открыты
>изучены программистом
>закрытые черные ящики, значит ими нельзя полноценно управлять
>гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает"
Документация не открывает ящик, она только создает видимость открытости.
Очень часто слышал/читал подобное мнение, копия, насколько же все люди одинаковые. Даже в этом треде было подобное уже. Вас тут клонируют?
>1. Си создан как высокоуровневый ассемблер, самый что ни на есть платформозависисмый язык.
Нет.
>2. Зачем замена?
Замена платформозависимого кода, на другой платформозависимый код.
>2. Есть компьютер, но использовать компьютер - плохо?
Почему ты так решил? Из чего вообще образовалось такое предложение?
>3. Лепить под него абстрактные мультиплатформенные прослойки = тыквить его, нивелировать достоинства Си, такой язык не нужен.
int main(void) { return 1 + 1; }
Удивительно, язык сам позволяет абстрагироваться от машинного кода, получается Си не нужен?
>4. Это значит, устройство должно быть фиксировано и его спецификации открыты и изучены программистом.
В этом треде снова признают всех программистов не программистами, потому что они не подходят под какие-то субъективные определения.
>4. Только так можно полноценно использовать возможности устройства.
Время.
>4. А виртуальные мультиплатформенные машины это закрытые черные ящики, значит ими нельзя полноценно управлять.
В чем отличие операционной системы от виртуальной машины? Получается, снова всех программистов вычеркнул из программистов, даже подходящих под твое описание.
>4. Это не программирование - управление, а скорее мольбы и надежды, гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает".
Почему ты считаешь виртуальные машины "черным ящиком", но не считаешь аппаратные способы выполнения кода "черным ящиком"?
Дополнительно: из таких слов получается, что если в каком-либо процессоре найдется аппаратная ошибка, которая не будет написана в документации, то все программисты включая тех, что подходят под твое определение не будут являться программистами?
Потому что:
>спецификации открыты
>изучены программистом
>закрытые черные ящики, значит ими нельзя полноценно управлять
>гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает"
Документация не открывает ящик, она только создает видимость открытости.
Очень часто слышал/читал подобное мнение, копия, насколько же все люди одинаковые. Даже в этом треде было подобное уже. Вас тут клонируют?
1. "Врёти". Ну ладно.
2. Враньё. Стремление к универсальности это стремление отказаться от реальной платформы, т.е. отказ от Си.
3. Бессмысленный высер только подтверждающий бесполезность универсального кода.
4.4. Я не считаю, это так и есть. Программирование на Си это техника, как пишешь, так и работает, а на виртуальной хуйне это скриптинг, говношлепство на похуях на авось. Это годится для этого вашего пресловутого "тырпрайза 200к в наносекунду" зашибать бабло, но продукты такого труда конченое говно, не зря же говорят "тяп-ляп и в продакшен". Сама система предназначена и оптимизирована шлепать говно, на которое самим разработчикам похуй. С техникой такой подход не работает, на похуях машина банально не будет работать, тупо заклинит и всё. Этим и заканчиваются потуги макак-секретуток программировать на Си, крашами и бугуртами.
>Очень часто слышал/читал подобное мнение
Враньё. Если такое тут писали, это был я, больше никто такое не напишет, и я пишу редко.
>1. "Врёти". Ну ладно.
Я не писал, что это ложь, я написал, что твое утверждение неправильное.
>2. Враньё. Стремление к универсальности это стремление отказаться от реальной платформы, т.е. отказ от Си.
>1. "Врёти"
Нет.
>3. Бессмысленный высер только подтверждающий бесполезность универсального кода.
Почему бессмысленный? Каким образом он это подтверждает?
>4. Я не считаю, это так и есть.
Почему ты так решил?
>4. Программирование на Си это техника, как пишешь, так и работает, а на виртуальной хуйне это скриптинг, говношлепство на похуях на авось.
В чем отличие от аппаратной платформы?
>5. Враньё. Если такое тут писали, это был я, больше никто такое не напишет, и я пишу редко.
>1. "Врёти"
Я не уточнял, что именно здесь видел подобное мнение.
Зачем ты строишь поспешные выводы на основе каких-либо данных, если они у тебя ошибочные? Твои сообщения похожи на сообщения сгенерированные нейросетью, вроде логика какая-то должна быть, но на деле ее не существует, достаточно задать пару вопросов, чтобы в этом убедиться.
В питоне все понятнее
Толсто
И что, он же всё равно -1 возвращать должен
Возможно поэтому
>However, typing Control+Z does not embed an EOF character into a file in either DOS or Windows, nor do the APIs of those systems use the character to denote the actual end of a file.
https://en.wikipedia.org/wiki/Substitute_character
но почему тогда если ввести ctrl+z в начале строки то он завершает ввод в этой программе?
Ладно, извини, ты прав. Это круто. А что еще можно делать с этим типом, кроме как передавать в функции? Я попробовал присваивать ему значение функции напрямую и через разные типы, но, похоже, это так не работает. Разобрался. Если писать название типа со звёздочкой - работает как тип указателя на функцию. Сбивает то, что при передаче в функцию компилируется и со звездочкой и без (по крайней мере в VS). В этом есть какой-то скрытый смысл?
Чет всё равно не понял, там просто написано что в винде это символ конца файла, как я и предполагал.
То есть грубо говоря ничего особенного, просто если это первый символ в строке то она его считает за конец файла, а если нет то за 26?
int md1=shm_open("/q_str",O_CREAT|O_RDWR,S_IRWXG);
if(md1==-1){
perror("unable to create shared memory for queue structure: ");
return -1;
}
int md2=shm_open("/q_buf",O_CREAT|O_RDWR,S_IRWXG);
if(md2==-1){
shm_unlink("/q_str");
perror("unable to create shared memory for queue buffer: ");
return -1;
}
>То есть грубо говоря ничего особенного, просто если это первый символ в строке то она его считает за конец файла, а если нет то за 26?
После 26 кода может вернуться EOF, если так, то игнорируй 26 код и выходи из цикла.
>>334834
Это проблема платформы, которая не в состоянии нормально работать, ты даже оправдаться в своей бездарности не можешь.
Да это клован какой-то. Интересно, какая клавиатура позволяет вводить такие охуительные символы.
ctrl+D вводит EOF.
ftruncate, чтобы выставить размер куска.
>extern float dot(vector, vector);
extern float dot(vector(), vector());
>vector x, y, z, t;
vector(x);
vector(y);
vector(z);
vector(t);
Вариант с дефайнами даже уебищные конструкции вида "int a,b,c,d,e" преобразует в читаемые. Вместо добавления констекспр, как ключевого слова добавили бесполезный тайпдеф, вместо развития препроцессора добавили бесполезный тайпдеф. Худшее решение, но даже у такого решения есть фанатики (говноедики).
Страница 466, Листинг 11.30. Программа mod_str. с
Подскажите опять по Прате
/ mod_str.c — модифицирует строку /
.....................................................................
str = toupper((str)) ;
printf("To upper result char= %c\n", toupper((*str)));
......................................................................
почему toupper не изменяет строку?
Почему ты так решил? Объективно бесполезная функциональность языка, добавленная просто так.
Или ты сможешь объяснить почему она не бесполезная?
>>336140
> деды просто так добавили функционал?
> Или ты сможешь объяснить почему она не бесполезная?
деды хотели нормально определять свои типы и использовать их точно также как и используют стандартные. тип имя_переменной = велью; без всяких там скобочек хуебочек и т. д.
твое
> vector(x) = {0};
выглядит как будто ты к вызову функции присваиваешь что-то. Если бы я такое увидел, то сначала охуел бы, что мой редактор не подсвечивает это как ошибку.
да и по тайпдефам грепать удобно, хочешь получить все кастомные типы в проекте - изи.
>Ты уже весь тред засрал своим прата
А в чём проблема? Я какие-то неправильные вопросы задаю?
>Там варнинг должен быть, а не ошибка
Он написал что ошибка. Впрочем, варнинга тоже нет.
Погугли опции компилятора управления уровнем предупреждения для своего компилятора. Обычно Wall.
gcc -Wall или /Wall для VisualC
Так же можешь добавить интерпретацию предупреждений в ошибку.
gcc -Wall -Wextra или /Wall /WX
Да не, мне сами предупреждения не нужны, я просто хотел понять действительно ли это ошибка, и если да то почему. Уже разобрался.
>>336934
Я знал про хуёвый перевод и спрашивал, но мне всё равно рекомендовали именно её. Да даже в шапке треда кроме древней K&R для вкатывания ничего нет, только прата.
>почему?
Синхронизация общая для всех объектов, но они могут быть созданы в разных потоках и будут падения на бесполезной синхронизации.
Да, один мьютекс на все шаред поинтеры. Не знаю, что за ебанутое конкарренси должно быть, чтоб операции над разными поинтерами часто блочили друг друга.
Сап, итгоспода, я зелень, только начал вкатываться, не могу понять, почему у меня получается хуйня и как делать правильно, я долбоёб не судите строго.
Как я могу выкатиться, если не вкатился? Как будто сами в первые дни не писали говно. Мне хотя бы понять как гуглить мой вопрос. У меня есть массив 5 значений t, я сделал массив, теперь я хочу подставить эти значения в икс от каждого из этих тэ. Но Xot это не массив, поэтому не канает, как сделать массив в массиве не ебу, была идея сделать двумерный массив, но не понимаю, как подступиться
О великий си. Все языке ссылаются на него и хотят быть такими же крутыми как он
struct funds
{
char name[LEN];
int cost1;
char name2[LEN];
int cost2;
}; // объявил структуру
typedef struct funds FUND; // теперь FUND это имя типа объявленной структуры, то есть синоним struct funds
чтобы передать в этом случае структуру функции надо написать прототип например
int sum(FUND ); что есть то же самое что если бы в аргументе было написано (struct funds );
Дальше уж не очень понятно
Например:
typedef FUND List; // List это указатель на этот тип FUND, что и есть struct funds
поэтому в таком случае прототип будет выглядеть примерно так
int sum(List) без всяких звездочек, потому что это и есть указатель на синоним типа, а объявление функции выглядит как int sum(List money) и вроде все работает как надо считается.
Но вот когда работа идет со связанным списком
struct film
{
char title[TSIZE];
int rating;
};
typedef struct film Item;
typedef struct node
{
Item item;
struct node next;
} Node;
typedef Node List;
void InitializeList(List plist); почему в этом прототипе из книги появился еще один указатель? зачем указатель на указатель? Если в первом примере все работает через один указатель?
Ну и еще вот тут на пикриле вроде дано объяснение, но я все равно не понял. Будто бы между темами что-то должны были объяснить по поводу этого, но тупо пропустили потому что автору очевидно, а ученику нет.
Что за двойная косвенность? Почему нельзя в списках обойтись без двойного указателя? Я запутался в общем. Помогите плиз
struct funds
{
char name[LEN];
int cost1;
char name2[LEN];
int cost2;
}; // объявил структуру
typedef struct funds FUND; // теперь FUND это имя типа объявленной структуры, то есть синоним struct funds
чтобы передать в этом случае структуру функции надо написать прототип например
int sum(FUND ); что есть то же самое что если бы в аргументе было написано (struct funds );
Дальше уж не очень понятно
Например:
typedef FUND List; // List это указатель на этот тип FUND, что и есть struct funds
поэтому в таком случае прототип будет выглядеть примерно так
int sum(List) без всяких звездочек, потому что это и есть указатель на синоним типа, а объявление функции выглядит как int sum(List money) и вроде все работает как надо считается.
Но вот когда работа идет со связанным списком
struct film
{
char title[TSIZE];
int rating;
};
typedef struct film Item;
typedef struct node
{
Item item;
struct node next;
} Node;
typedef Node List;
void InitializeList(List plist); почему в этом прототипе из книги появился еще один указатель? зачем указатель на указатель? Если в первом примере все работает через один указатель?
Ну и еще вот тут на пикриле вроде дано объяснение, но я все равно не понял. Будто бы между темами что-то должны были объяснить по поводу этого, но тупо пропустили потому что автору очевидно, а ученику нет.
Что за двойная косвенность? Почему нельзя в списках обойтись без двойного указателя? Я запутался в общем. Помогите плиз
Совсем забыл что звездочки съело
в 16 и 18 строчке скриншота из книги.
там в одном месте указатель на указетль а в другом просто указатель
Потому что необходимо менять структуру по исходному адресу, а не переданому на узел?
Ладно буду разбираться дальше пердеть
Или, возможно, есть алтернатива где учишь алгоритмы и язык вместе.
еб твою мать, упизди с треда, ебнутый
Ты себя очень сильно ограничиваешь в выборе литературы, выдвигая требование, чтоб интересующий тебя язык программирования и интересующая тебя математическая тема сходились в одной книге. И даже если ты найдешь идеальную книгу, никакого двойного профита не получишь, потому что на освоении сишных приколов и на освоении алгоритмических приколов надо фокусироваться отдельно. Можешь взять K&R и SICP параллельно. MIT Scheme в этом плане ничем не заменить. Получишь массу удовольствия. Но SICP не про алгоритмы есичо, а немножко про другой дзен. Алгоритмическая литература, кстати, в идеале псевдокод должна юзать. Ты должен уметь сам воплощать концепции на своем языке. Это базовая умственная обработка инфы, которую ты сам заинтересован осилить, иначе тебе вообще нахуй ничего не поможет.
Чтобы не превратиться в дикарей, надо писать на ассембли, поссал сиблядка.
Меняется.
Все правильно, у тебя неопределенное поведение.
Указатель стека не изменился, 27 никто не переписал.
Написано что переменная которая объявлена в блоке живёт до конца выполнения блока, но по факту "а" которая объявлена после блока не переписала "i", то есть память не переиспользуется и это значение сохраняется там. Правда я забыл что если в релизе компилить то он может не создавать "a" и просто подставить константы, но на самом деле без констант всё то же самое.
а в чём тогда заключается временность хранения переменных, если не в том что их потом перезаписать можно?
>а в чём тогда заключается временность хранения переменных, если не в том что их потом перезаписать можно?
В этом, но компилятор это делать не обязан.
Без оптимизации:
https://godbolt.org/z/GGj8drbE7
С оптимизацией:
https://godbolt.org/z/xn9Eo6ra8
В одном случае инициализирует новую память, в другом использует старую.
Говнокод.
То есть компилятор может наплевать на возможности языка и вынести их в оптимизацию, либо вообще не использовать?
А, то есть стандарт просто говорит что существование этих переменных потом не гарантируется?
Он говорит, что переменная существует в ее области видимости, а за ее пределами не существует.
>Написано что переменная которая объявлена в блоке живёт до конца выполнения блока, но по факту "а" которая объявлена после блока не переписала "i"
Что за бред? Ты вообще знаешь что такое блок?
Давай, расскажи какие на пике есть блоки и какие переменные объявлены к каком блоке.
Просто показываю, какой я умный
>Что за бред? Ты вообще знаешь что такое блок?
Если ты не заметил, я читаю книгу для начинающих, поэтому если я чего-то не знаю, то в этом нет абсолютно ничего удивительного.
В этой же книге я прочитал что блок это часть кода которая окружена фигурными скобками, а ещё я прочитал что в стандарте C99 концепцию блоков расширили и ими стали считать циклы и иф. Книга врёт, или может ты не увидел на скрине цикл for?
Завтра пример набросаю, я спать.
Кстати в этой книге много опечаток. Будь осторожнее. Помню тоже там было написано что блоки это конструкции ограниченные фигурными скобками. Но аноны выше пояснили тебе про неопределенность поведения
Последний раз посторяю, как написано, так программа и работает.
Ты не ответил на вопрос, не перечислил блоки и объявленные в них переменные, значит не понимаешь что это такое. И книги тут ни при чем, книги не объясняют такую элементарщину уровня пикрил, это должно быть понятно любому здоровому человеку само по себе. Но не тебе, как видно.
Брат нет плахи книги ест плахи луди брат
В книге у прата написано что блок это то что ограниченно фигурными скобками
Но этот прав.
typedef void (*signalhandler)(int); signalhandler signal(int, signalhandler);
А как бы это объявление выглядело без использования typedef? У меня живой брат просит.
Заголовок - это структура, которая хранит данные о списке.
Возможно есть более точное название для этого, но я его не помню, поэтому мне все равно.
Структура, хранящая данные об узле:
https://github.com/clibs/list/blob/6c16b69f14de870ed89d0bcac948d85b7a73513f/src/list.h#L51
Структура, хранящая данные о списке:
https://github.com/clibs/list/blob/6c16b69f14de870ed89d0bcac948d85b7a73513f/src/list.h#L61
>>340554
>Могу написать
Зачем?
Собралось без warning-ов, "пук" печатает
>В книге написано что блок это то что ограниченно фигурными скобками
И? Ответа, что в реальном коде это означает, так и не нет. Написано-то написано, но не понято, читатель не смог прочитать написанное. Вот в чём суть, и книга тут уже бессильна.
Да, я знаю, там ошибки на каждом шагу, но что поделать, в ориге читать не удобно.
>>340526
>Ты не ответил на вопрос, не перечислил блоки и объявленные в них переменные, значит не понимаешь что это такое
Нет, это означает что мне лень их перечислять. А нахуя? Я ведь сказал что блок это то что в фигурных скобках, этой информации должно было хватить, а если не хватило, значит видимо это с тобой что-то не так. Но ок, есть блок функции, в нём есть блок цикла, в блоке цикла есть подблок тела цикла. А про переменные я вообще хуй знает что ты хотел услышать, типа проверял на зрение или что? На скрине видно что в каком блоке объявлено.
>Нет, это означает что мне лень их перечислять.
Уже настрочил пустопожнего пиздежа в 20 раз больше, а ответить напростой пвопрос по тексту "лень"?
>А нахуя?
Чтобы определить, прочитал написанное или не осилил.
Народная мудрость "смотрит в книгу - видит вигу" как никогда актуальна и сегодня.
Большое спасибо, добрый человек
>пустопожнего пиздежа
Ну давай, покажи что у меня тут было не по делу
>прочитал написанное или не осилил
А нахуя мне было задавать вопрос если бы я не прочитал?
Ну вот теперь я тебе ответил, так что там у меня было бредового?
>Это начинающие прогеры так пишут?
Нет, смотреть код начинающих программистов невозможно.
1) Они редко им делятся.
2) Он плохой.
3) Начинающие кодеры на Си вымирают.
Если хочешь посмотреть неплохой имхо код, то
https://github.com/nginx/nginx
https://cgit.freedesktop.org/xorg/xserver/tree/
>А нахуя мне было задавать вопрос если бы я не прочитал?
Язык это протокол переджачи информации.
Тект это язык.
Чтение это восприятие читателем информации переданной написавшим.
таким образом, воспроизведение написанных слов это не чтение, чтение это восприятие переданной информации.
Не понят смысла написанного, значит не смог прочитать.
Не ответил на вопрос по тексту, значит не понял смысла написанного - не смог прочитать.
Неграмотный сброд.
>Не понят смысла написанного, значит не смог прочитать
Не понял смысла написанного, значит не понял смысла написанного. Хватит нести хуйню.
>Не ответил на вопрос по тексту, значит не понял смысла написанного
Не ответил на вопрос по тексту, значит не захотел ответить, но уже захотел и давно ответил. Так что, долго ты будешь увиливать?
Питонисты самые культурные и добрые и толерантные
Ты освоил базовые основы языка, но не знаешь, как решать целевые задачи, двигайся в сторону системщины.
Что такое системщина? Я не технарь. С чего начинать? Там надо какие-то платы покупать с паяльником?
>Я не технарь. С чего начинать?
Попробуй тут спросить.
https://2ch.hk/pr/res/2339952.html (М)
https://2ch.hk/pr/res/2334153.html (М)
https://2ch.hk/pr/res/2241613.html (М)
https://2ch.hk/pr/res/2338156.html (М)
https://2ch.hk/pr/res/2286748.html (М)
https://2ch.hk/pr/res/2336182.html (М)
https://2ch.hk/pr/res/2284647.html (М)
Такой язык.
Если нечего прогать, то дрочи алгоритмы. Попробуй в олимпиадные задания залезть. Этого хватит, чтобы время проебать
Есть такое.
Пытаюсь в трифорс
Надо переложить обратную пирамиду сверху - в низ, по кирпичику; начиная с верхнего слоя.
Кирпичик хотелось бы выбирать рандомно.
Как это можно сделать?
Продолжаю свои мытарства: https://onlinegdb.com/kKxBj0YS9
Сговнокодил примерно то, что мне надо на стейт машине (отрисовка анимации крутится в "треде" (таске), поэтому надо чтобы кадр (не вся анимация целиком) побыстрому отрисовался и задача ушла курить, уступив место другим).
Пока завис на проверке достижения нижней границы и занятости следующей ячейки при перемещении кирпичика.
Если у кого есть возможность взглянуть и помочь советом \ делом - спасибо.
Уползаю на работу.
> Не понят смысла написанного, значит не смог прочитать.
ты что в семье психологов или философов родился?
люто кринжую с твоих сообщений, человек спросить хочет, ты вместо того чтобы объяснить нормально начинаешь ему доказывать, что он какой-то долбаеб. У тебя дефицит внимания? или ПМС?
> Неграмотный сброд.
Мы уже поняли что ты тут самый умный, расслабься
А что не так?
Спасибо
>>343433
>Психология и философия имеют имидж умного
Пока что ты сделал себе только имидж чела который старается казаться умным, говоря замысловатыми предложениями. То что ты сказал это хуйня какая-то.
>от чего у тебя бомбит
Так яростно как ты тут ещё никто не кукарекал
>Перечисли 2340091 какие есть блоки и какие переменные объявлены в каком
Уже было достаточно сказано, но ты проигнорировал. Ты так начал разговор, что напрямую отвечать никакого желания нет, так что либо поясни что у меня там было бредового, либо иди нахуй.
Хз что там в книге, но мне в системном довелось использовать: хэши и таблицы, списки, разные виды сортировок, деревья (rb, radix), бинарный хип, подсчет ссылок, разные формы распределения памяти и сборки мусора. Это БАЗА.
О сущечтвовании потоковых/приблизительных алгоритмов тоже стоит знать.
Стрикт-алиасинг чтоли ебоманый?
>хэши и таблицы, списки, разные виды сортировок, деревья (rb, radix), бинарный хип,
Примерно это же в CLRS. Теперь ясно, что алгоритмы пропускать не стоит
Короче, аноны, земля мне пухом. Я просто для чтения uint64 из конца файла делал fseek(file, 8, SEEK_END), а оффсет со знаком минус надо, лол.
Всмысле да? Я когда принтф вызываю, у меня сразу всё выводится. Понятно что в какой-то буфер для этого строка записывается, только в чём суть очищения буфера если принтф сразу выводит? То есть что в этом коде изменится если убрать ффлэш?
Там после printf сразу стоит sleep, программа падает в ступор, зависая на целую секунду, поэтому нужно форсировать вывод на экран до слипа. Попиши зависающие программы и поймешь зачем.
Да я знаю что такое буферизация, вопрос же не в этом. Я в книге прочитал что запись в любой файл производится после того как буфер который с ним связан до конца заполнится, но при этом я вижу что если просто выводить что-то на экран то всё выводится сразу, это стдаут какой-то особенный или что?
Как я могу задуматься о правильности если я не знаю что правильно а что нет? Я поэтому и задаю вопросы. То что я сказал про файлы это неправильно?
У тебя винда, там все через жопу.
Понял, что написал?
>>344476
>То что я сказал про файлы это неправильно?
Они могут иметь различные буферы. Просто запомни, смывай буфер, только когда тебе нужно обязательно что-то записать. В остальном, реальная точка входа в программу сама смоет stdout, stderr буферы, при корректном завершении программы.
>Понял, что написал?
Я показал что хоть с флашем, хоть без него, строка будет выводится до слипа
>Они могут иметь различные буферы
Там было написано что это относится и к вводу и к выводу. Ну я сомневаюсь что это неправильно, потому что я и раньше слышал что с дисков читают сразу по 512 (или больше) байт в буфер, потому что они медленные. Хз, с стдаутом вопрос всё равно открыт получается.
Я конечно ахуенно благодарен, но хотелось бы всё же разобраться а не "просто запомнить"
Во-первых в том почему у того чела код написан так как будто принтф не сразу выводит (если он шиз то такой ответ тоже сойдёт), во-вторых почему в стдаут вывод не такой как в случае с другими файлами. Ну то есть понятно что это не диск поэтому там так и должно быть, но ведь и с стдаутом и с другими файлами работают одни и те же функции и они должны делать одно и то же.
>принтф не сразу выводит
Буферизация.
>почему в стдаут вывод не такой как в случае с другими файлами
Точно такой же.
Ты вообще необучаемый.
Походу это у тебя буферизация, временная память какая-то. Что буферизация? Принтф выводит сразу, я это и так знаю, вопрос был в том почему у него написано что строка просто записывается в буфер (и не выводится пока не вызвать ффлаш). На счёт того почему вывод не такой же я тоже написал, на диск вывод идёт когда буфер заполняется до конца.
Ну ок, объясни тогда в чём я не прав, или хотя бы скинь что почитать. Только не ту статью из википедии, я там ничего нового не нашёл.
Говнокод.
У тебя алгоритмическая сложность проверки команды очень высокая, из-за того, что ты используешь строки, а не их хэши.
ОС несколько больше чем Windows. Даже среди nix -подобных куча реализаций с разным поведением. Стандарт С не гарантирует вывод, только наличие буферизации, остальное на усмотрение разработчиков стандартной библиотеки.
Больше вопросов не имею.
Да я рофлю, на кой хуй там хештаблица, тем более такая хардкорная. Это когда-то давно делал для реализации LZW.
Вот вам анончики, лучше, такая задачка. Передать stateful функцию, как аргумент qsort, например. Чтоб код функции мог ссылаться на переменные из локального скоупа. gcc позволяет делать пикрил, а clang не позволяет. Ну и еще это не универсальный вариант, потому что такой коллбек не получится куда-то назначить для позднейшего вызова. Она живет, пока живет скоуп, а с переписывание стеком пойдут по пизде не только используемые переменные, но и сам код функции. Короче, тот же qsort сам должен знать, что ей передать, а он знать не может. Все? Пиздец?
Заведи глобальный указатель на стейт. И заполняй его перед вызовом сортировки. Будет работать пока какой-нибудь мудак не передаст туда функцию сравнения, которая сама вызывает qsort.
Aлсо
>с переписывание стеком пойдут по пизде не только используемые переменные, но и сам код функции
>код функции
чел? думаешь при входе в мейн рантайм компилирует твой callable, а при выходе стирает?
Не, не компилирует, а скомпилированный код вставляет. Или нет?
> Что буферизация? Принтф выводит сразу
Нет, не сразу, он буферизирует.
То, что твоя строка выводится сразу, не значит, что все строки во всех ситуациях на всех платформах выводятся сразу. Вывод у тебя сразу это лишь твоё случайное везение. Код, рассчитаный на везение - ненадежный код.
По спецификации printf буферизирует, значит когда нужен незамедлительный вывод, нужно сбрасывать буфер, иначе у тебя говнокод.
С ошибками в коде это и есть правильные учебники. Ты должен понимать что там написано, а значит сам находить ошибки. Тупо же копипастя, ничему не научишься.
Если не оишабюсь, то буфыеризация происодит до тех пор, пока не встретится перенос на новую строку "\n". Можешь написать заведомо неправильный код и поиграть так с stderr, и увидеть, что если не выводить в конце '\n', то во время segfault сообщение не будет выводиться, а если добавить - будет.
Зачем ты говно мамонта принес?
>да я уже разобрался, оказалось что на винде стдаут вообще не буферизированный
Разбирайся снова.
Собсна, какого хуя я вообще доказываю, самый простой и эффективный способ - запустить код и посмотреть, тем более что я даже кидал скрины с пруфами.
>мне той твоей шизы хватило
Какой?
Ты не разобрался в ситуации, но думаешь, что разобрался, почему ты по 1 реализации либси решил, что под окнами нет буферизации?
>Какой?
ну это же ты мне тогда про буферизацию говорил? если нет значит не тебе
>Ты не разобрался в ситуации, но думаешь, что разобрался
в этом нет никакой информации, если я в чём-то не прав то лучше скажи в чём конкретно
>почему ты по 1 реализации либси решил, что под окнами нет буферизации?
Ну в идеале да, лучше сказать что в msvc это так работает, но я и в других местах видел такую формулировку, подумал, может есть какая-то зависимость от платформы и это в любых реализациях под винду так работает
Если пишешь под винду, так и пиши под винду, виндовыми вызовами. Свою строку форматируй в память по указателю, а готовую хоть прямо в видеопамять записывай. И не будет никаких гаданий по кофейной гуще мультимочи, буферы-хуюферы.
А я напоню, что в стандартном си стдерр всегда не буферизован, стдаут буферизован на терминал - построчно, иначе полностью.
https://github.com/AllAlgorithms/c
Алгоритмы на си, добавьте в следующий раз в шапку треда.
>Мне не нужно было ничего писать
Суть программирования 2022, одни пиздаболы из социалочек, всё превращают в говночатик ради попиздеть.
>Суть программирования 2022
>всё превращают в говночатик ради попиздеть
Недавно открыл для себя форумы?
Я вкатун, если что. Вышку почти закончил, информатика и вычислительная техника, что-то знаю про всякие триггеры, транзисторы, сумматоры, закон ома помню, но все очень поверхностно, так как никогда должного внимания электронике и схемотехнике не уделял - думал что буду веб манькой.
Си знаю, многократно писал всякие лабы, в том числе под posix, с++ довольно поверхностно. Микроконтроллеры в руках ни разу не держал, паять не умею, с ардуиной и STM никогда не работал. Пользовался микрокапом и мультисимом в универе, хз, нужно ли это в ембеддеде.
У меня всё по теме. Сам-то ты тут что-то делаешь, кроме того что критикуешь? Можешь идти нахуй кароче.
>А дальше что ?
А зачем ты учил язык?
>Просто открывая какой-то рандомный код, я нихуя не могу понять что в нем написано
Если это какой-то специфичный код, тем более без пояснений, ты не обязан понимать что он делает. А если это простой код, значит ты как-то не так учил.
> А зачем ты учил язык?
Хотел разобраться в том, как малварь создают.
> Если это какой-то специфичный код, тем более без пояснений, ты не обязан понимать что он делает. А если это простой код, значит ты как-то не так учил.
Да, именно специфичный, там какой-то сервер был, нихуя не понял, куча каких то незнакомых библиотек и т.д.
Везде читаю что если переменная перечисляемого типа, то она может принимать только значения которые перечислены в определении enum, иначе выдаст ошибку. По факту присваиваю ей другое значение и никакой ошибки нет.
>Везде читаю что если переменная перечисляемого типа, то она может принимать только значения которые перечислены в определении enum, иначе выдаст ошибку
Си и кресты не перепутал?
Нет
https://docs.microsoft.com/ru-ru/cpp/c-language/c-enumeration-declarations?view=msvc-170
>Переменная с типом перечисления хранит одно из значений набора перечисления, определенного этим типом
Ну тут же не приведение, а какой-то конкретный прикол перечисляемых типов. Но кажется я немного понял, там не ошибка должна быть а варн, но у меня нужные флаги не включены походу. Просто странно, зачем этот тип вообще нужен без варнов, можно же было просто сделать enum без всяких дескрипторов, чтоб обычные символические константы создавать и использовать их везде безотносительно типов.
>Each enumerated type is compatible with one of: char, a signed integer type, or an unsigned integer type. It is implementation-defined which type is compatible with any given enumerated type, but whatever it is, it must be capable of representing all enumerator values of that enumeration.
>Enumerated types are integer types, and as such can be used anywhere other integer types can, including in implicit conversions and arithmetic operators.
https://en.cppreference.com/w/c/language/enum
Да я не про это говорю, а про то что без предупреждений перечисляемые типы не нужны, они ничем не отличаются от обычных целочисленных вроде int.
Предупреждение это не язык, а лишь помощь программисту избегать ошибок. Чем тупее программист, тем больше ему нужно помощи чтобы не обосраться. Вот так, со временем количество предупреждений и увеличивается. Раньше предупреждений было мало, теперь стало много. Дрошло и до того, что некоторым без предупреждений вообще никак, не нужно. Достигли дна, наконец-то.
Да мне лично вообще похуй на предупреждения, просто подметил странность.
Как сделать простое виндусятное окно для программы си? Можно ли совместить её с какой нибудь HiAsm? Они смогут обмениваться переменными?
Как успехи в программировании, недаун? Или можешь только хрюкать на форуме даунов?
и что тут не так
Точно, спасибо
Попробуй "unsigned int b : 3"
Как мне по очереди их обрабатывать, инкрементируя название файла?
Надо ведь как-то в fopen() это делать?
>Как мне по очереди их обрабатывать, инкрементируя название файла?
Преобразовывать числа в строки.
>Содержание курса:
>Введение
>Блок 1. Основы языка Си
>1.1 Установка CodeBlocks
КО
>1.2 Минимальная программа на языке Си
>1.3 Русификация консоли
КО
>1.4 Компиляция программы
КО
>1.5 Суть работы программиста
КО-КО-КО ))))
https://www.edx.org/professional-certificate/dartmouth-imtx-c-programming-with-linux
Сам по себе сертификат платный, но можно просто смотреть курсы и решать задачки бесплатно без сертификата. Если кто-то беспокоится, что его там вместо программирования будут учить Линуксу или башу или еще какой-то хуете, то там первые 5 курсов вообще не затрагивают ни операционные системы, ни даже заставляют устанавливать компилятор. Компилятор на одной и той же страничке. Все лекции с субтитрами. Объясняются принципы хранения данных в памяти. После них в голове все встало на места и наконец-то открылось понимание указателей, маллока, массивов, передача параметров по ссылке и все такое.
Однозначная годнота для тех, кто не может осилить К&R.
Да просто задумался, а что если сделать так, и в итоге возник такой вопрос. Например ясно что он точно не по очереди их заменяет, потому что иначе всё заменилось бы на A и была бы ошибка (переопределение переменной). Интересно как он парсит.
>Интересно как он парсит.
Гуглить не пробовал?
https://docs.microsoft.com/en-us/cpp/build/reference/p-preprocess-to-a-file
Ясно
Ну давай, ткни носом, где там ответ на "в каком порядке производится замена" или "как он парсит"? Я бы ничего не сказал если бы не это "гуглить не пробовал". Естественно блять пробовал, иначе не спрашивал бы.
Спасибо за мысль, не знал по какому запросу искать клуб таких некрофилов как я, лол!
Вопрос в догонку. Вот ковыряю сейчас один древний гайд по моей теме и там чувак определяет тип структуры таким кодом
typedef struct tagBITMAP / the structure for a bitmap. /
{
тут всякие кишки
} BITMAP;
и потом объявляет переменные везде по коду через BITMAP, а tagBITMAP вообще нигде не использует. Почему не второй? Гайды говорят что после объявления структуры пишутся имена переменных жы? Зойчем тогда вообще первое имя?
нет это ты тупой, сколько мы уже пиздим а ты до сих пор не понял в чём мой вопрос, хотя он простейший
480x270, 0:02
http://www.c-cpp.ru/books/typedef
Вроде достаточно подробно расписано, хотя хз, не трогал тайпдефы особо
>>358693
у тебя всё, что нужно получения ответа, уже есть
для умственно-отсталых яумамывкатунов:
берёшь файлик с кодом, прокатываешь через препроцессор, смотришь, чё получилось.
у тебя два дефайна, чё останется- то и заменяется последним.
Если опять мясу в твоей черепной коробке это слишком сложно, гугли инфу по рекурсивным дефайнам и то, как они обрабатываются си.
Для совсем дегенератов ебаных: у тебя "А" превращается в "А", а "B" - в "B". порядок выполнения подстановок тут оказывает серьёзное влияние на целое нихуя
Ты тупой еблан и продолжаешь это доказывать, потому что ВСЁ ЕЩЁ не понимаешь.
>чё останется- то и заменяется последним
Меня ебёт что заменяется последним? Кто вообще про это спрашивал? Что останется я и так могу понять, просто принтанув A или B.
>гугли инфу
Точно, именно это мне и было нужно если я сюда написал, без тебя бы не догадался никак
>порядок выполнения подстановок тут оказывает серьёзное влияние на целое нихуя
Опять же, кто про это спрашивал? Меня это абсолютно не ебёт.
Можешь больше не отвечать, помочь ты не можешь всё равно, хотя помощь от такой гниды как ты мне в любом случае не нужна
Бля это не ты на днях в цпп треде 50 постов на оператор += наматывался? Тот так же крыл всех хуями требуя все более детальных инструкций.
>Бля это не ты на днях в цпп треде 50 постов на оператор += наматывался?
Нет, хз о чём ты
>крыл всех хуями
Я не крыл до определённого момента, когда чел начал попусту выёбываться
И конечно я ничего не требовал, просто спросил
> Вроде достаточно подробно расписано
Я на ту же статью вчера в гугле наткнулся, лол, и она не объясняет. Но уже в следующем листинге тот чувак пишет без первого имени вообще, так что думаю это чисто косметическая поебень и всё работает и так. Спасибо, анон.
> Вроде достаточно подробно расписано
Я на ту же статью вчера в гугле наткнулся, лол, и она не объясняет. Но уже в следующем листинге тот чувак пишет без первого имени вообще, так что думаю это чисто косметическая поебень и всё работает и так. Спасибо, анон.
Долбоеб не тот, кто не пока что не может осилить, а кто решил, что раз не осилил, то ну его нахуй.
Да и вообще, обычно K&R советуют тем, кто вообще лыка не вяжет в программировании, типа меня. А он так-то сложный.
цитата например
К сожалению, я вынужден сейчас сказать вам ещё одну не очень приятную вещь.
Далеко не каждый человек может стать программистом, и дело здесь не в уровне интеллекта или каких-то там «способностях», а в том, каковы ваши индивидуальные склонности. Программирование — это очень тяжёлая работа, требующая предельного интеллектуального напряжения, и выдержать эту пытку могут лишь те сравнительно
редкие извращенцы, которые способны от процесса создания компьютерных
программ получать удовольствие. Вполне возможно, что в ходе изучения этой книги вы поймёте, что программирование — это «не ваше»; ничего страшного, в мире есть много других хороших профессий. Если моя книга «всего лишь» позволит вам вовремя понять, что это не ваш путь, и не тратить лучшие годы жизни на бесплодные попытки учиться
в ВУЗе по какой-нибудь программистской специальности — что же, это само по себе немало: лучшие годы, потраченные впустую, вам потом никто не вернёт, и чем раньше вы поймёте, что вам нужно (точнее, не нужно), тем лучше.
И ещё
С учётом сказанного выстраивается довольно однозначная цепочка языков для начального обучения: Паскаль, язык ассемблера, Си. В эту
цепочку практически в любом месте можно что-нибудь добавитьь но ни убирать из неё элементы, ни переставлять их местамиь судя по всему, нельзя. Зная Си, можно вернуться к изучению явления, именуемого операционной системой, и её возможностей с точки зрения программиста
Итак, если иметь в виду в будущем изучение Си, то предварительно нужно освоить какой-то язык, в котором а) есть указателиь причём в полный рост, без всякой сборки мусора; б) без указателей можно обходиться, пока обучаемый не окажется более-менее готов к их восприятию; и в) начав использовать указателиь обучаемый расширит свои возможностиь то есть в указателях должна быть реальная потребность.
<iframe width="800" height="500" frameborder="0" src="https://pythontutor.com/iframe-embed.html#code=#include <stdio.h>#include <stdlib.h>#define A B#define B Aint main() { int A = 1, B = 2; printf("B= %d", B); return 0;}&codeDivHeight=400&codeDivWidth=350&curInstr=1&origin=opt-frontend.js&py=c_gcc9.3.0&rawInputLstJSON=[]"> </iframe>
https://pythontutor.com/c.html#code=#include <stdio.h>#include <stdlib.h>#define A B#define B Aint main() { int A = 1, B = 2; printf("B= %d", B); return 0;}&curInstr=1&mode=display&origin=opt-frontend.js&py=c_gcc9.3.0&rawInputLstJSON=[]
тьфу, хуйню сказал
#define ass(blast) (blast + usa(blast))
#define usa(blast) (blast + ass(blast))
Хотя не, понял к чему это. То есть получается что там рекурсивная замена с каким-то лимитом?
#define A B
#define B A
согласно второму дефайну
#define A B превращается в #define A A, который дальше уже не обрабатывается во избежание рекурсии
аналогично со вторым дефайном
В некоторых программах, таких как ffmpeg или ядро линукса, можно включать/отключать функционал на этапе компиляции. Как это работает?
В общих чертах процесс понятен, но как такое реализовать на практике? Я не хардкорный погромист, а сисадмин локалхоста.
Что за мемес с котами?
Ну чел, он действующий препод в мгу. Как ты думаешь сам?
Конечно стоит время потратить, тем более что если в инглиш не можешь, переводы читать - с ума сойти можно. А тут максимально локализировано всё.
p.s. видосы на ютубе у него шиза полная
Недавно для себя открыл тот факт, что вышла Raspbian OS 64-bit.
Если я установлю на малинку 64-битную ос, то сишные библиотеки для доступа к GPIO, по типу WiringPi и BCM2835 будут работать?
Они ведь создавались еще на 32-битных осях и создатели. В инете годной инфы нема, видимо, потому что новая ОС вышла не так давно, а я не тру хацкер чтобы самому допереть до этого.
Братишка, ты не понимаешь сути си-тредов. Приходи поливать других гавном а не это своё погромирование.
Можно ведь тоньше. Например, "хочешь получить идеальный язык без сишных ошибок, но очень быстрый? Голубая ласка vlang.io уже идёт за тобой".
Хз куда спросить, с радача с таким вопросом прогнали.
В общем, учу FreeRTOS.
структура моей программы такова:
main.c:
LED_Task
TimerTask
CanTask
Ну и несколько файлов в которых Init, которые вызываются из main() и IRQ, в лучших традициях bare-metal:
timer.c
uart.c
can.c
и прочее...
Есть несколько вопросов:
1. Правильно ли так закладывать структуру?
2. Стоит ли делать Семафоры\Мьютексы и прочие примитивы глобальными, чтобы каждое прерывание могло им спокойно пользоваться, если оно нужно в другом файле?
Один из самых заебатых вопросов на собеседовании, которым тимлид тешит свое раздутое ЧСВ.
Еще не хватает:
1.
int foo = 10;
foo = foo++ + ++foo;
2.
int foo = 10;
printf("%d %d", foo++, foo++);
3.
int a=10, b =20, c;
c = a+++b;
4.
int a = 10, b = 20, c = 30, d = 40, e;
e = a b ^ c+++ / d;
5. Установите целую переменную по абсолютному адресу 0x1234 к значению 0xcaba в одну строку
(int * const)(0x1234) = 0xcaba;
А самый нормальный ответ на любой вопрос - выгнать нахуй такого мудака, который пишет в продакшн такую хуйню.
Такой хуйни можно тонну нагенерировать, проверить на компиляторах, и ебать людям мозг, вместо того чтобы проверять.
Я проверял 1-й и 2-й на 3-х компиляторах и получил 2 разных ответа.
Ну и вишенка на торте, о чем меня спросили последний раз:
1. С какими типами оптимизации вы работаете?
2. Какие отличия между стандартами Си вы знаете?
3. Найдите все ошибки в данном коде на этой распечатке.
-Какого плана? Синтаксические тоже? Или только алгоритмичексие?
-Да тут и синтаксические и алгоритмические, долбоебические (кхе-хе) Еще никто все не нашел, насколько помним.
Один из самых заебатых вопросов на собеседовании, которым тимлид тешит свое раздутое ЧСВ.
Еще не хватает:
1.
int foo = 10;
foo = foo++ + ++foo;
2.
int foo = 10;
printf("%d %d", foo++, foo++);
3.
int a=10, b =20, c;
c = a+++b;
4.
int a = 10, b = 20, c = 30, d = 40, e;
e = a b ^ c+++ / d;
5. Установите целую переменную по абсолютному адресу 0x1234 к значению 0xcaba в одну строку
(int * const)(0x1234) = 0xcaba;
А самый нормальный ответ на любой вопрос - выгнать нахуй такого мудака, который пишет в продакшн такую хуйню.
Такой хуйни можно тонну нагенерировать, проверить на компиляторах, и ебать людям мозг, вместо того чтобы проверять.
Я проверял 1-й и 2-й на 3-х компиляторах и получил 2 разных ответа.
Ну и вишенка на торте, о чем меня спросили последний раз:
1. С какими типами оптимизации вы работаете?
2. Какие отличия между стандартами Си вы знаете?
3. Найдите все ошибки в данном коде на этой распечатке.
-Какого плана? Синтаксические тоже? Или только алгоритмичексие?
-Да тут и синтаксические и алгоритмические, долбоебические (кхе-хе) Еще никто все не нашел, насколько помним.
>>364217
>e = a b ^ c+++ / d;
e = a ✱ b ^ c+++ / d;
>(int ✱ const)(0x1234) = 0xcaba;
✱(int ✱ const)(0x1234) = 0xcaba;
звездочки сожрались
>Такой хуйни можно тонну нагенерировать, проверить на компиляторах, и ебать людям мозг, вместо того чтобы проверять.
вместо того чтобы проверять реальные знания.
фикс.
>foo = foo++ + ++foo;
>printf("%d %d", foo++, foo++);
>Я проверял 1-й и 2-й на 3-х компиляторах и получил 2 разных ответа.
Неопределенное.
#define LO(t) ((double)(t & 0x00000000ffffffffLL))
double
difftime(time_t t1, time_t t0)
{
return (HI(t1) - HI(t0)) + (LO(t1) - LO(t0));
}
Да. Тем не менее это спрашивали, как-то. Сейчас я уже понял как отвечать на подобного рода хуйню.
Имя: Вася, Петя, Коля, Саша
Возраст: 21, 64, 7, 15
Температура: 36.4, 17.2, 37.0, 36.9
Не нравится, что в таком объявлении нет связей кроме индекса, что может быть неочевидно. Насколько это уродско, или как вы делаете это на си?
Что тебе мешает создать массив структур?
У тебя на скринах результат замены макроса.
>хранить
Зачем тратить время на обращения к базам, когда данные константные?
>пациентов
Он ничего не говорил про пациентов и реальный проект.
>в сишных массивах
Что плохого?
>Чтобы тебя так в больнице лечили.
Это проклятие?
Есть какой нибудь годный учебник по основам программирования на С? В университет надо для поступления
Go
Objective-C
Да, да многие сейчас скажут, что это нужна потому что потому на этом легче разрабатывать хуйню для Гугл и Эпол. Но в этом и проблема. Что это было сделано не как дополнение, а как замещение, чтобы позаниматься саморекламой. Это не C++ над C.
То же самое сделали Apple с Flash`ем, чтобы поаутофеллировать.
Это ты не в тот тред, макака.
Но я понимаю, трудно бороться с тягой залезть в ситред, даже если он тебя не касается. Тяга грязных чуханов к свету так же естественна как мухота собирается вокруг лампочки. Вот и вылязят из своих помоев и ползут, сползаются к настоящему языку настоящего программирования. И сколько ни отрицай на словах, в душе истина неизменна, ведь истина это сама реальность которую не слепишь из слов, только ложь.
Толсто.
>а весомый какой-нибудь.
Забей хуй на структуру, всем похуй и формируют так, как им удобнее, язык не задает ее явно, значит любая правильная.
>2. Стоит ли делать Семафоры\Мьютексы и прочие примитивы глобальными, чтобы каждое прерывание могло им спокойно пользоваться, если оно нужно в другом файле?
Чел. Мутекс защищает определенный ресурс. Если этот ресурс нужен прям всем, лучше экспортируй функции, которые берут мутекс и работают с ресурсом.
Нит. Используй хотя бы csv, так не потеряется реляция. Кодировка только utf-8. Разделитель тот, которого нет в полях, зумерище.
Привет, токсик, я узнал тебя по твоим сварливым высерам.
>никаких говнобиблиотек и говноконверсий.
Ебалай, без конверсий это останется массивом uint16_t.
wchar_t, или, для тупых ебалаев, wide char, юникодные символы нативные для системы, а значит не требующие ничего, бери и пользуйся, а не лепи макакины говнопрокладки на пустом месте.
>пук
Настоящее лицо прокладочной макаки. Пара простых ответов и попытки косплеить человека испарились без следа уступив законное место нативному хрюканью.
Тяжело ли вкатиться в коммерческую разработку на Си без ВО? Уже 2 года работаю java макакой, но, сука, тянет на самые низкие уровни. Где в РФ сейчас пишут на Си?
Книга, по которой я пытаюсь ебаться с ассемблером/сёй не считает нужным разжёвывать такие нубские вопросы. Вот листинг процедуры хелловорлда на MASM, вот сишный листинг — дальше сами. В asm лежит процедура, которая должна вызываться из сишного кода. Из асма я хуярю обж, но ся при компилировании матерится что линкер не нашёл эту самую процедуру. Куда читать, что делать, ананасы? Выручайте.
Объявлено, я запускаю исходники что с книгой шли, разве что conio добавил, которой не хватало для kbhit.
Как и везде думаю - разработка драйверов/ядра/прочего говна для ОС. Вакансий сравнительно мало, но и поток людей туда не очень большой, так что устроиться можно.
Правда вместе с С придется учить ассемблер и как работает ОС "под капотом". За месяц-два можно спокойно вкатиться
Посмотри на код любого крупного проекта. Например, ядро линукс, nginx, ffmpeg,...
Ну я лично столько учил. Правда я учил конкретно архитектуру ОС (свое ядро делал), а С и ассемблер уже знал.
Спустя 2 месяца после того как закончил в Газпром устроился. Правда переучиваться с x86 на arm пришлось.
Как вкатывальщик вкатывальщику советую
https://youtube.com/playlist?list=PLHHm04DXWzeKuhdGFHSEWDpdgoYpjPptR
душевный тип. Может посоветуют что получше, но мне вообще хорошо зашло.
Кто?
С учётом сказанного выстраивается довольно однозначная цепочка языков для начального обучения: Паскаль, язык ассемблера, Си. В эту
цепочку практически в любом месте можно что-нибудь добавитьь но ни убирать из неё элементы, ни переставлять их местамиь судя по всему, нельзя. Зная Си, можно вернуться к изучению явления, именуемого операционной системой, и её возможностей с точки зрения программиста
Итак, если иметь в виду в будущем изучение Си, то предварительно нужно освоить какой-то язык, в котором а) есть указателиь причём в полный рост, без всякой сборки мусора; б) без указателей можно обходиться, пока обучаемый не окажется более-менее готов к их восприятию; и в) начав использовать указателиь обучаемый расширит свои возможностиь то есть в указателях должна быть реальная потребность.
osdev, просто весь читать
Robert love, Linux kernel что-то там
Просто гайд по пониманию что в линуксе происходит и как
И двачую вот этого
>>374365
На Ютубе круче не найти
Также на udemy
"Developing multithreaded kernel from scratch"
Ну а по не читать, просто берёшь исходники ядра Линукс или его модули/драйвера и разбираешься
>просто берёшь исходники ядра Линукс или его модули/драйвера и разбираешься
Можно какой нибудь пример.
Тебе для начала необходимо понять саму концепцию движения. Все этот работает в бесконечном цикле, условно while(1), потом ты должен это выполнение как-либо задерживать, либо через for(что реалтно только для мк), либо как человек через sleep и отлавливать либо нажатие кнопки, либо сделать такой слип, который сам постоянно проверяет нажатие кнопки. Я просто как делал так и обьяснил сейчас.
https://git.kernel.org/
Там много всякого, ядро Линуса возьми и посмотри, поменяй там шо нить, сделай свою еба фичу например. Гайдик как компилить и запускать в гуглах поищи
Привет. С этим разобрался) Теперь непонятки с тем, как программа должна запоминать предыдущие координаты змейки, чтобы если змея свой хвост укусит, то игра закончилась
Смотри, я делал через миссив структуры координат x,y,prevx,prevy. У меня сначала смещалась голова, а потом я записывал данные в prevx,prevy и изменял x,y относительно смещения гловы. Те примерно так: записываем x,y в prevx,prevy головы и потом по каждой другой части тела повторяем тоже самое, записываем x,y в prevx,prevy и меняем x,y на prevx,prevy предка, те по факту i-1, где i индекс части тела
Спасибо, чекну. Я до этого Кринкина смотрел, ты не знаешь его случайно? Как в сравнении с ним то что ты скинул
Может всё игровое поле сделать массивом и координаты туловища из него брать,и проверять вхождение головы.
https://pastebin.com/EUQQrdRs
>змейка
>"out of memory"
Смишно.
>curses
Фреймворко-макака. Хрр, тьфу.
> / Loop and get user input /
> w a s d
И не стыдно? Стрелочки не осилил?
> for (;;) {
> switch (getch()) {
Судя по докам, getch() останавливает программу ожидая нажатия клавиши. Твой говнокод не работает.
>не проверять malloc на возврат NULL
>curses
>фреймворк
>ебаться вручную с tty/termios/ioctl и читать клавиатуру/мышь из /dev/input/event (или делать что-то наверняка ещё более ебанутое на винде) вместо использования удобного решения, дарованного нам дедами
>getch блокирующий, говнокод не работает!!!
>nodelay(stdscr, 1)
Но стрелочки он правда не осилил. Ну или ему так просто привычнее.
Это оптимизация памяти и времени, на обработку стрелочек уходит больше, чем на wasd. Ситред 2022 итоги.
>>379492
>>не проверять malloc на возврат NULL
Вот кстати поясните плес. Допустим, я смотрю ютуб, слушаю музыку, открыл 100 вкладок в хроме и одновременно запускаю свой хеловорд на 1 кб динамической памяти, в котором нет такой проверки. Какова вероятность, что система мне не даст одного килобайта?
Почему ты решил, что твоей программе вообще должны выделить память?
Лол, читай про процессы и виртуальную память.
Хотя ладно, не столь существенно для быстродействия, думаю.
>>ебаться вручную с tty/termios/ioctl и читать клавиатуру/мышь из /dev/input/event (или делать что-то наверняка ещё более ебанутое на винде) вместо использования удобного решения, дарованного нам дедами
Ситред 2022 итоги, пикрил.
С графикой ебаться неохота, с управлением неохота. Установи Юнити, нарисуй свою змейку мышкой и не еби мозг. Зачем в данный тред пришел?
Не толсто, я ньюфаг. Скачал швитую приложуху для новостей и мемов, чтобы следить за мировой культурой, а там одно говно. Я думал это что то хотя бы типа хабра. Впрочем нашел пару интересных каналов, но они не про си.
Ты решил тут лишний вес сбросить?
Я-то лично согласен с тобой, сам пытался писать tui-либу типа curses, правда на Go, просто здесь мотивация писавшего код тоже имеет значение. Может он либу саму хочет освоить, а как это работает под капотом ему неинтересно.
Лезть в Си, но игнорировать что под капотом это бессмыслица. Си это не алгоритмический язык, в мысле, если писать аогоримы, не отличается от любого другого языка, и даже хуже их, ибо мешает своими низкоуровневыми подставами. Ведь для тебя подставы, раз не хочешь этим заниматься. Ты пришел не по адресу, иди в тот же шарп, выглядит похоже, но меньше мешающей хуйниб отвлекающей от твоих алгоритмов. Циклы, условия, массивы, списки, функции, вот всё это в шарпе куда логичнее и удобнее Си, у которого лишь кривой сахарок над низкоуровневостью который поломать раз плюнуть, у тебя только жопа будет гореть.
Я не очень понимаю, почему ты приписываешь мне такие странные мотивации и обращаешься ко мне, будто я являюсь автором поста со змейкой, пишу на Си в описываемой тобой манере и в чём-то с тобой не согласен. Внимательнее перечитай сообщения.
Я не понимаю зачем идентифицировать пользователей анонимного форума, который специально сделан анонимным чтобы этой хуетой не страдали, а общались по сути вопроса.
Какая разница, кто там со змейкой пришел или ушел, если конкретно ты, к кому я обращаюсь, такая же макака которой Си не нужен, а нужно лишь бы попроще на готовом. Ты не туда зашел, популярно же объяснил >>381700 Что неясно?
Это кретинское лицемерие залезть в Си, но отвергать то чем является Си, пытаясь его использовать как алгоритмический скрипт, для которых есть языки специальные, куда лучше чем Си, которые не для этого предназначен, тупо алгоритмы на готовом шлепать. Си это лоулевел, кишки, железо, а не абстрактные скрипты в сферическом вакууме чистой логики, обмазанные черными ящиками фреймворков которые сами делают "заебись", а кодеру похуй.
Чувак, успокойся. Иди проспись, выпей свои таблетки или просто забей на эту дискуссию, потому что те рвение и агрессия, с которыми ты пытаешься приписать мне качества и мотивации, которых у меня нет, и дать мне объяснения, в которых я не нуждаюсь, выглядят уже совсем ненормально.
>>тред языка программирования Си
>"чувак, ты, ты"
>"мне, я"
>ни слова о языке и программировании
Сброду дали доступ к интернету. Итоги.
Дружно сделаем вид, что ты сам написал что-то более осмысленное и по сути треда. Преисполнись уже до конца своей борьбой с абстракциями и начни писать на машинном коде.
>>382600
Я подозревал, что у кого-то могут быть интенции, отличные от бесполезного пердолинга. Но долбоёб выше сказал, что абстракции и "фреймворки" не нужны, а значит каждый должен написать свою библиотеку для решения стандартной задачи.
Никак, на Си уже давно ничего не разрабатывают, почти везде используют, как прикладной язык.
Да, ладно, не поверю. Всякие МК, ядра, антивирусы, хайлоды разве не на си пишут?
Приветствую всех в этом чатике. Надеюсь у вас здесь достаточно лампово. Не против, если здесь немного посижу с вами?
Тред пока не читал, планирую откиснуть в АСМе на какое-то время, потом сюда, забронирую пока здесь местечко.
(не потому что я такой вредный, просто не хочу аффилироваться как-то, да и найти их самим несложно)
Запрос на включение изменений в ядро ещё не был отправлен Торвальдсу, но набор патчей прошёл дополнительное рецензирование, избавлен от основных замечаний, уже достаточно давно тестируется в ветке linux-next и доведён до состояния, пригодного для создания слоёв абстракции над подсистемами ядра, написания драйверов и модулей.
Мой вопрос: стоит ли теперь вкатываться в embedded c в linux?
Да.
Даже если Раст окажется полной заменой С (что вряд-ли), то на это уйдет много времени. Тем более что зная embedded C, можно будет если что легко пересесть на такой же Раст.
Если жепа паникует, никто не мешает учить и то и то
>интеграции в ядро Linux компонентов для разработки драйверов устройств на языке Rust
Интересно, когда появится первый, не переписанный на раст, драйвер?
>Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
>"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Дайте список подобной литературы, также особенно дайте годных мемуаров, документальных драм, бородатых баек и т.п. необязательно про Си
>Допустим, беру size_t и кручу-верчу его.
Если размера хватит, то все будет хорошо.
>Нету там каких-нибудь скрытых сегментов за пределом 4...8 байт?
Диапазон стандартом не установлен.
Я хочу чтобы у меня был объект map структуры maps, к которому я бы смог обращаться как map.mask[4][12]. Как так сделать? Создавать в мейне отдельный массив char mask[][] не хочется, потому что он будет отделен от объекта map.
Я хочу перед запуском игры в настройках менять размер карты и поэтому там придется ставить переменные. Но это запрещено. Как это исправить? Это же не должно ничего ломать, если объект структуры maps создавать после инициализации всех нужных переменных?
Наверное с её помощью можно сделать, но нет способа попроще? Мне же не нужно менять размер карты в ходе игры. Нужно менять только 1 раз до старта в настройках. Всё равно что define перед запуском поменять.
>нет способа попроще?
Это самый простой.
>1 раз до старта в настройках
В каких настройках?
>define
Это константы, которые Си-код не может менять.
>В каких настройках?
Которые я потом сделаю. Сейчас там просто значения переменной.
>Это константы, которые Си-код не может менять.
Я просто привел пример. Я хочу не залазить постоянно в код, чтобы #define lenght 30 поменять на #define lenght 50 , а хочу в красивом меню написать цифру 50.
>Это самый простой.
Почему нельзя в момент создания объекта структуры задать размер массива mask? Память же выделяется, когда ты пишешь struct maps map, а не когда просто объявляешь структуру. Это должен быть самый простой способ
>создания объекта
>struct maps map
Это не создание объекта.
>Память же выделяется, когда ты пишешь
Она может выделиться когда угодно, главное, чтобы в момент выполнения этого кода она была.
>Я хочу не залазить постоянно в код, чтобы #define lenght 30 поменять на #define lenght 50 , а хочу в красивом меню написать цифру 50.
#define maxlength 10000, а пользоваться в пределах значения length структуры.
Это абсурдный код. Структура определяется объявлением, ты не можешь объявить одну структуру, а потом наплодить из неё разных структур лишь присваивая значения полям.
Думаю, ноги этой шизофазии растут из непонимания что такое компиляция, нативный код, долбоебом привыкшим к скриптовой динамикопараше.
>>381700
http://cmustdie.com/
>прочитал хуйню нихуя не понял
Функции в Си здорового человека должны возвращать -1 при ошибке (но NULL для указателя).
Тогда можно писать
if ((count = readall(fd)) < 0) {
close(fd);
return -1;
}
Вместо
if (readall(fd, &count) == MY_SMART_API_ERROR_RETURN) {
close(fd);
return MY_SMART_API_ERROR_RETURN;
}
Посмотри в ассемблер, там не будет копирования.
Что и кто должен унифицировать? Разработчики компиляторов? Или те, кто стандарт выкатывают? Это вопрос конвенции, принятой в конкретном ПО на любом языке, не обязательно на Си. 228 будут возвращать on success, если захотят, и ничего ты им не скажешь.
Никак и слава богам блять но можно заставить упаковать без паддинга. Хотя кажется тогда поешь говна с выравниваем.
Ебаная сишка, ебаная сборочная система, ебаная кросс-конпеляция каменного века
мимо растобог
Сам нашёл. Просто добавь --verbose
Покроссконпелировал, нахуй, ебать, ваш сишный мирок убог, пиздец. Конпелятор решил, что эта инклуда - не инклуда, заебок. Как вы с этим живёте, вообще?
За ради портирования игрули на арм машинку переписать её на расте получится немного оверкилл.
Агргумент функции так: char (*name)[16]
А возвращаемое значение?
char✵ get_name() {
char✵ res = malloc(16 ✵ sizeof(char));
return res;
}
void del_name(char✵ v) {
free(v);
}
...
char✵ name = get_name();
...
del_name(v);
Думаю, он о том, что размер char на всех платформах равен 1 байту, и sizeof здесь просто лишний.
Ошибаешься, я о макаке залезшей в си не зная что такое байт, и еще код пишет.
>sizeof здесь просто лишний
Лишнего ничего нет, код полностью функционально полноценен, показывает что этому индусу в си не место. Потому что это не проблема кода, а проблема самого человека, дефективного способа мышления.
Учителю тоже так говоришь когда получаешь двойку?
man man-pages
блин просто проблема в том что почему-то именно книги я не очень хорошо воспринимаю, поэтому и думаю может видеокурсы есть хорошие
можешь через аргументы ебануть.
объявил переменные вне функции, сам решил стек или хип, передал их указатели в функцию, функция по этим указателям все заполнила и вернула какой-то код (ошибка, либо все ок).
Структуру размером два слова почти все возвращают эффективно (на регистрах). Если больше, то передай указатель на локальный массив или структуру. Если совсем большая, выделяй в хипе.
И теперь у меня вопрос - а в любимой сишечке есть какие-то гайды про то как стоит/не стоит строить приложение в целом и почему?
Пока нашел только книжку
Patterns in C adam Thornhill
Но она платная.
>как стоит/не стоит строить приложение в целом
Пахнет инфоцыганством.
Исторический принцип - чем меньше делает приложение, тем оно лучше.
керниган точно что то писал такое. в названии книги слово "практика" или "практический/ое"
Плюс/минус первый раз взял в руки этот отладчик, прижало вкурить как exim парсит несколько специфических DKIM заголовков и чет приуныл
Что происходит на пикрил? Это эмулятор?
WSL же только от 10 и выше?
Выглядит как то, что исходник поменялся а бинарник остался тем-же. Попробуй там перекомпилить и запустить или lldb или что ещё использовать, если не починится
На всякий случай пересобрал без оптимизаций, но все равно такой же прыжок там после присвоений/обнулений еще куча if блоков, должны же они были проверится?((
Возможно это все проделки RHEL-овского rpmbuild..
Покурю немного его SPEC файл и попробую ручную пересборку / LLVM-ный дебагер, спасибо
>>406475
>>406482
В общем отказался от идеи собрать из src.rpm что безусловно было бы удобно - бахнул rpmbuild и вот тебе на выходе и бинарный пакетик, и debuginfo, и всем этим можно жонглировать пакетным менеджером в пользу старого доброго git-а + make + install. Пришлось конечно поприседать с ручной установкой зависимостей, путями/конфигами, но зато удалось добиться нормального поведения в отладчике - на этом все, спасибо помогавшему анону
Зачем эта параша нужна, когда у тебя системная параша будет вся в unsafe'ах, а пруфать ты нихуя не будешь, история с раст белтом просто охуенно показательна.
Ну челики из этого проекта по первой находили баги во всяких мьютексах из стдлиба.
Пишу свой двухколёсный дебаггер. Вот есть процесс, ему соответствует программа и слинкованные с ней в рантайме библиотеки (libc, ld и прочее); сегменты программы загружены в выделенную процессу память, библиотеки отображены и я всю эту красоту могу наблюдать в /proc/{pid}/maps.
Всё, что мне нужно сделать, это найти запись в таблице символов файла программы/библиотеки по адресу вызванной функции. Я парсю инфу о сегментах из /proc/{pid}/maps, смотрю, какой сегмент соответствует адресу функции и для соответствующего имени файла с помощью libelf подгружаю нужные мне заголовки.
Дальше это работает так:
https://pastebin.com/0rLUpUWF
(код сырой; на данном этапе нужно было, чтобы это просто работало)
data содержит маппинг файла программы/библиотеки, addr = адрес_функции - адрес_сегмента.
Для самого executable код вроде работает, но не для слинкованных с ним либ. Что я упускаю?
сделал как ты сказал, теперь у меня вместо a.exe файл с названием name
а мне надо чтобы была huita
Толсто.
Короче правой кнопкой щелкни получившийся файл, нажми в выпадающем меню кнопку Переименовать. Способ удобен тем что ты можешь назвать файл как ты захочешь и когда захочешь, этих даунов не слушай, они промыты пропагандой командной строки, будущее за графическим интерфейсом.
Какой самый свежий и понятный учебник на русском?
BeginEnd. Это канал на ютабе, там Антон всё рассказывает в плейлисте по C.
Зачем?
А мне нравятся его теперешние стримы, особенно по templeOS, да и сам он чел крутой. Правда в хохлошизу ударился поле 24, но это ничего страшного.
{
int x,y;
int i;
printf("input x=");
scanf("%d", &x);
printf("input y=");
scanf("%d", &y);
printf("oper: \n1 = \n2 = +\nselect code = ");
scanf("%d", &i);
if (i == 1);
printf("%d %d = %d", x, y, x * y);
if (i == 2);
printf("%d + %d = %d", x, y, x + y);
return 0;
}
Делал калькулятор, он считает какую-то хуйню, что я там не так написал?
Всё, нашел
Анчоусы, как вообще грамотно переводится "address offset" и "stack base pointer"? Я просто далек от С и машинных кодов, а гуглеж ещё больше запутал.
Как понять значение фразы: "This movl (команда такая, это я уже сам понял) is moving this value into this thing which is actually address of offset. So %rbp is the stack base pointer..."
>fatal error: 'stdio.h' file not found
Из-за чего это? Могло или это быть из-за отсутствия gcc?
Вроде я уже устанавливал Cygwin
>- Стандарт 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 (драфт)
Есть годный разбор отличий? На старой идеешке код не компилится, надо бы понять почему. Не вручную же различия стандартов выявлять?
Мне очень нравится "низкоуровневое" программирование, нравится С, нравится изучать операционки и всё что связано с сетью.
Но я не могу для себя понять, какова область применения у языка в целом и какие существуют вакансии в реальном мире в этой области? Может вы что-то подскажите, отталкиваясь от интересов, которые указал выше, куда мне стоит двигаться и как искать что-то подобное в плане работы? Заранее благодарю.
>какова область применения у языка в целом и какие существуют вакансии в реальном мире в этой области
Никаких, ты умрешь с голода, если будель писать на Си.
>>417684
>куда мне стоит двигаться и как искать что-то подобное в плане работы?
Пробовать вкатиться в ОС проекты, а после пилить деньги с пожертвований крупных корпораций.
Есть несколько адресов и один порт. На все это дело шлется udp инфа с сервера, и есть клиент который читает данные с этих сокетов каждый в отдельном треде
Че я делаю: создаю для каждого треда отдельный сокет, ставлю setsockopt опцию реюза для порта, бинжу адрес INADDR_ANY и моим портом, потом ставлю setsockopt опцию с адресом уже конкретным
Собсно я че то не так делаю или в логике какая то проблема? Потому что у меня каждый тред читает все адреса вместо одного конкретного
Ну э ты подсказать не можешь?
Да, с сервер посылает udp на разные адреса с одним и тем же портом
Клиент все это читает и проблема только в нем
Кто использовал, какие подводные?
Вот есть сортировка слиянием, на этапе когда нужно найти середину массива имеется формула m=l+(r-l)/2.
Но не пойму, почему не просто m=(r-l)/2? Зачем +l еще?
затем, что l может быть не равным 0. Какая середина для l = 6, r = 10? посмотри по какой из твоих формул она корректно находится
короче запомнил от неё, что для размеров массива лучше всегда использовать size_t, звучит разумно.
точно формулировку не помню, но как-то все это перешло в то, что я почти год писал циклы for используя size_t(for (size_t i = 0...blabla)
только сегодня услышал, что не рекомендуется использовать беззнаковый тип в условии цикла фор (при size = 10: size_t i =0; i < size - 11... будет бесконечный цикл из-за переполнения) , но источник тоже так себе(видос на ютубе - отрывок со стрима)
так вот, всё таки че использовать в цикле, тупо int? выгдядит как то хз
для размера массива вроде size_t нигде плохо не влияет
А, мысль не туда заворачивалась, теперь увидел,спасибо.
и что это значит? вопрос про любой стандартный обход с нуля до значения какой то переменной, а не вырожденный случай. действительно ли плохо i делать беззнаковым или это сильно редко приводит к ошибкам
Это не хороший тон. А очень хорошая практика, и её нужно использовать всегда. Во-первых, это обезопасит твой код от случайных и нарочных выстрелов в ногу. Во-вторых, покажет пользователю функции что она никак не изменит переменную, а следовательно безопасна на чтение, ну если у тебя в нескольких потоках идет работа. Ну и в третьих расширит применение твоей функции, ведь её можно будет вызывать как для волатильных переменных так и для константных
Ну и один спецификатор в 5 букв. Как это загромождать что то может
Читать быстрее же. Но я когда только вкатывался смотрел видосы narodstream т.к. работал тогда за рулем много и не было возможности читать.
Я наоборот из тех людей, у которых КПД при чтении книг ниже, чем при разборе лекций и видосов.
Просто чтение книги должно сопровождаться какими-то действиями по теме. Если просто читать то канеш ничего особо не усвоишь.
Если оно не меняется, это константа.
const можешь навесить, если внутренний голос подсказывает тебе, что какой-нибудь долбоеб, не разрбравшись в 100 строках макарон с goto, рано или поздно присвоет твоему pi новое значение. В остальных случаях это сомнительная практика.
У тя массив или заведомо маленький (< 30000) или нет.
В первом случае можешь брать инт. Во втором что-то большее, что подходит: for (long l = bigsize; --l >= 0; )
>является ли это хорошим тоном
Только для указателей.
>загромождает код
Для всего, кроме указателей.
Это копия, сохраненная 4 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.