Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
Чем компилировать: - Очевидный 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)
В общем, есть такое мнение, что программист, который не умеет писать на Си, не является программистом. Вместо Си можно подставить Паскаль, потому что разница между ними ничтожна и заключается лишь в синтаксисе - они близнецы и братья.
Это не значит, что нужно всё писать на Си. Это даже не значит что на Си вообще нужно писать. Это значит что знать язык Си обязан каждый программист.
Поясняю почему так. Потому что Си наиболее близок к железу, к машинным кода, к ассемблеру. С отключенный оптимизацией сишный код почти один-в-один вырождается в ассемблер. Когда пишешь на Си, знаешь какой код тебе сгенерирует компилятор.
Си это священная корова, которую не обязательно доить. На Си можно написать всё, абсолютно всё, а что нецелесообразно писать на Си, то можно написать на языке, который написан на Си.
С++ это "Си на стероидах". В общем случае корректную программу на Си, можно собрать С++ компилятором и в 90% случаев она соберётся. Даже без warnings. Исключения из этого правила есть, но их ничтожно мало и в большинстве случаев они легко обходятся.
Итак, суть этого поста - ТЫ МОЖЕШЬ НЕ ЛЮБИТЬ ЯЗЫК СИ, НО ЗНАТЬ ЕГО ОБЯЗАН. Ты даже можешь его ненавидеть, но знать обязан. Иначе ты не программист, а приживала, зря едящий свой хлеб.
>>2297537 >Вместо Си можно подставить Паскаль, потому что разница между ними ничтожна и заключается лишь в синтаксисе - они близнецы и братья. Нельзя, не братья, не близнецы.
>Это значит что знать язык Си обязан каждый программист. Не всегда и не каждый, зачем мне знать С, если я пишу логику для какого-либо сайта, на JS? Оптимизации, по выделению памяти или по системным вызовам за меня сделает интерпретатор, мне нужно лишь знать алгоритмы и то, какие функции/методы/классы выполняются относительно друг друга по времени быстрее или медленнее.
>С++ это "Си на стероидах". С++ это язык с Си синтаксисом, все.
>В общем случае корректную программу на Си, можно собрать С++ компилятором и в 90% случаев она соберётся. Даже без warnings. Зачем собирать программу чужим компилятором? Можно статистику про 90%?
>ТЫ МОЖЕШЬ НЕ ЛЮБИТЬ ЯЗЫК СИ, НО ЗНАТЬ ЕГО ОБЯЗАН. Нет.
>>2297578 >Нельзя, не братья, не близнецы. Абсолютные близнецы. За исключением множеств, оператора with и пары других мелочей.
>Не всегда и не каждый, зачем мне знать С, если я пишу логику для какого-либо сайта, на JS? Тогда ты не программист. Кто угодно, но не программист. Отключи тебя от Сети и твои знания и умения бесполезны.
>Зачем собирать программу чужим компилятором? Можно статистику про 90%? Даже больше 90%. Обратная совсестимость С++ с Си весьма и весьма хороша. Не используй K&R стиль объявления функции и будет тебе счастье.
>>2297775 Вот именно. Без понимаюния как это работает программы жрут память как не в себя, жрут процессорное время, постоянно переписывая сктроки по памяти. Они (программы) ещё бы и падали на каждом шагу, но современные языки неплохо защищены от этого - концепция и хорошая ранняя диагностика. Поэтому современные программы просто тупо жрут дешёвые нынче вычислительнык ресурсы, электроэнерги. и худо-бедно выполняют своё предназначение, попутно обогревая окружающую среду.
А всё это покрывается волшебной аббревиатурой TTM - Time To Market. Главное вывести своё говно на рынок, а там уже техподдержка разрулит инциденты. Вот в таком мире нынче живём.
>>2297651 >Абсолютные близнецы. За исключением множеств, оператора with и пары других мелочей. Что у них общего, кроме простых типов?
>Тогда ты не программист. Кто угодно, но не программист. Отключи тебя от Сети и твои знания и умения бесполезны. Отключи сетевого программиста от сети, его знания станут бесполезны, отключи системного программиста от системы, его знания станут бесполезны. При этом, они оба пишут на C, удивительно, 2 программиста на C, стали не программистами, исходя из твоей логики.
>Даже больше 90%. Ты можешь писать, что хочешь, но без статистики - это пустые слова.
>Обратная совсестимость С++ с Си весьма и весьма хороша. Ты так и не ответил, зачем компилировать C код, C++ компилятором, кроме, как перенос всей программы на C++, без переписывания легаси, но даже в таких случаях, C код компилируется C компилятором, а потом линкуется, как объектный файл.
>Не используй K&R стиль объявления функции и будет тебе счастье. К чем это?
Иногда мне кажется, что тут работают боты, которых проверяют студенты, вроде они тебе отвечают, но смысла в их ответах нет. Сообщения выглядят, как склейка сообщений с каких-то форумов.
>>2297872 >Что у них общего, кроме простых типов? Ну как тебе объяснить, если ты на обеих не программируешь? Перечисления, циклы, указатели, указатели на функции, структуры/рекорды. Всё, что есть в одном, есть и в другом.
Это для константных строк, а для динамических будет чуть иначе.
Сишные строки в Паскале - используй PChar и не забывай '\0'. Вот чего нет в Паскале, так это битовых полей. Но это же проблема для программиста, да?
>Ты так и не ответил, зачем компилировать C код, C++ компилятором, кроме, как перенос всей программы на C++, без переписывания легаси Ты сам ответил. Ну или просто по желанию. Запретишь?
>>Не используй K&R стиль объявления функции и будет тебе счастье. >К чем это? Чтобы не ебацца в будущем. Вот на картинке не скопилится в С++. Но за последние 20 лет ни разу не видел сырцов в таком стиле.
3 программы, которые C++ компилятор не может собрать, без флагов и модификации исходников, но можешь ли ты быть уверен, что с флагами не будет вызван C компилятор?
>Перечисления, циклы, указатели, указатели на функции, структуры/рекорды. Всё, что есть в одном, есть и в другом. C# и C - это братья языки близнецы, все что есть в одном есть и в другом, ну кроме классов, пространств имен, синтаксис немного другой, кросс компиляция в C, получше, а так да, один язык можно сказать. >
>>2297992 >>example-1.c:9:19: error: invalid conversion from 'void' to 'char' Ну так строгое приведение типов. Всё нормально. Так и должно быть. Ты, кстати, там ошибку допустил sizeof * a
>>2297992 >>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 вне комментариев?
А теперь напомню изначальный посыл: >>>> Исключения из этого правила есть, но их ничтожно мало и в большинстве случаев они легко обходятся.
>>2298086 >sizeof a sizeof a == sizeof(a), но если ты про выделение памяти, то да там памяти выделяется в sizeof a раз больше.
>А теперь напомню изначальный посыл: А я думал такой >>2297537 >Итак, суть этого поста - ТЫ МОЖЕШЬ НЕ ЛЮБИТЬ ЯЗЫК СИ, НО ЗНАТЬ ЕГО ОБЯЗАН. Ты даже можешь его ненавидеть, но знать обязан. Иначе ты не программист, а приживала, зря едящий свой хлеб.
>>2298204 Чтобы не превратиться в дикарей, поклоняющихся чудо-машине, использующих её, но не понимающих как она работает. Чтобы писать оптимальные программы. Чтобы знать алгоритмы, а не тупо использовать очередной 100500-й модный фремворк, который через полгода устареет и будет заменён ещё более модным фреймворком.
>>2298240 >Чтобы не превратиться в дикарей, поклоняющихся чудо-машине, использующих её, но не понимающих как она работает. Знание C, никак не помогает в понимании, как работает вычислительная машина.
>Чтобы писать оптимальные программы. Для написания оптимальных программ, на высокоуровневом языке, тебе нужно понимать алгоритмы, а не, как работает машина, потому что уровень абстракции слишком большой от железа.
>Чтобы знать алгоритмы, а не тупо использовать очередной 100500-й модный фремворк, который через полгода устареет и будет заменён ещё более модным фреймворком. Хорошие разработчики понимают алгоритмы, не важно на каком языке они пишут, если программист не может в алгоритмы в сфере, в которой он работает - это хуевый программист.
>>2298269 >Знание C, никак не помогает в понимании, как работает вычислительная машина. Си это в некотором роде высокоуровневый ассемблер. Хорошо помогает. Картинка в подтверждение.
Сейчас меня студенты спалят. На картинке, разумеется, просто кусок учебного материала из лекции. А то ещё подумаете что в рабочих проектах так называю переменные.
>>2298308 >Си это в некотором роде высокоуровневый ассемблер. Хорошо помогает. Картинка в подтверждение. Я с этим и не спорил, но C и близко не дает понимание того, как работают вычислительные машины. Он дает базовые понимания того, как работать с памятью и операционной системой, сама стандартная библиотека C, заканчивается на моменте, когда нужно сделать что-то большее, чем чтение и запись памяти. Все остальное реализуется через системные вызовы.
>>2298240 >Чтобы не превратиться в дикарей, поклоняющихся чудо-машине, использующих её, но не понимающих как она работает. Ты чтоль понимаешь, если ебешься с сями?) ебло бля) Ты давно смотрел как там и что проектируют и собирают в проце и памяти, чтоб уверенно заявлять как оно там все на самом деле работает. Тоже мне не каргокультист епта)) пхах
>>2298419 Мне кажется уже ни кто этого достоверно не знает. Только эмпирическим путем можно установить производительность того или иного кода. Даже ассемблерного.
>>2298240 Мыслишь верно, но выводу >>2298173 неверные. Дело в том, что нельзя превратиться в дикарей, так же как нельзя перестать быть дикарями. Человек не меняется. кем родился, тем и помрет. Личность фиксирована как минимум с момента рождения.
Далее, если отбросить политику (система образования служит властям, воспитывать болванчиков, каких им нужно, т.е. программа обучения определяется правительством), оставив только чистые благие намерения, то учить никаким реальным языкам нельзя, потому что люди разные, а образование это не учитывает.
Нужно давать представление об программировпании на практике искусственного учебного языка. Например, был такой "Исполнитель Робот", на поле из клеток стоял "робот" в виде кружочка и написав программу его можно было передвигать по полю и закрашивать клетки. Вот что-то такое искусственное нужно дать всем, а осталдьное оставить на их усмотрение. Кто какой настоящий язык захочет, тот пусть и учит, а кто не хочет, пусть учит, скажем, Майкрософт Офис, Фотошоп, Видеоредактор, 3D Редактор, КАД какой-нибудь и т.д. Так что, кому нужен Си, тот сам его возьмет, аналогов у него всё равно нет, дальше кресты, а потм только скриптопараша, она вся одинаковыя, хоть js, хоть c#, одна хрень. Чено нельзя допускать, это только пердольные мваня языки типа всяких хачкелов, потому что пердолинг это бегство от реальности, а такое воспитывать никому на пользу не пойдет. Если преподавать, то только вещи реально применимые на практике, потому что программирование это не философия и прочие теоретические дисциплины, где можно хуи катать разводя пустопорожнюю демагогию. Опять, воспитывать такое нельзя. Если уж настолько дегенерат, то после учебы сам скатитися в это говно, но уже как взрослый под свою ответственность.
>>2298631 >Чено нельзя допускать, это только пердольные мваня языки типа всяких хачкелов В таком случае развитие языков застрянет на текущем уровне. Все инновации, виртуальная машина, сборка мусора, абстрактные типы данных, условный оператор с плечами вместо goto, итераторы, - всё это впервые появилось в, как ты выражаешься, "мваня языках".
>>2298664 Развитием языков занимаются профессионалы, а речь про обучаемую школоту. Вот типичный пример тупого дегенерата, которые в этом пердольном говне валяются. Не может элементарно прочитать текст, про что написано, а тупо триггерится на отдельные слова и пукает мимо кассы. Вот такое вот никак нельзя воспитывать намеренно, преподавать в школе, иначе жто уже не школа, а детсад дегенерации.
>>2298672 Мимо проходил. В джаве нет и половины фич сишарпа, похожи они только принудительным ООП, LINQ и Streams и ключевыми словами, кек. Никак не близнецы
>>2298693 >вместо меня код пишет язык Тут сайт 18+ для самостоятельных людей. Пиздюкам не умеющим жить без мамкиной юбки и дегенератам не вырасшим из детских штанишек просьба проследовать нахуй в сишарп/джава/жс/питон тред
>>2298681 >К чему ты это? Наверное к тому, сто си и с# не имеют ничего общего от слова совсем. >>C# и C - это братья языки близнецы Тупорылый вброс. Си имеет общее только с C++, и то потому что это один язык. А с# же это уже скрипты, хоть какие бери, начиная с VBS, JS и заканчивая чем угодно вроде Java и Питона, одного поля ягоды. Просто потому что это уже не программирование, а гадание на кофейной гуще на авось. Вдумайся в значение слова "программирование". Это не самостоятельное явление, а процесс прилгагаемый к определенному объекту (компьютеру), который и программируется на выполнение действий. Свойства объекта и языка должны быть однозначны и предсказуемы, иначе программировать нельзя.
Скрипты же - не такие, там пишут магические слова на авоь, сработает или нет. Там тонны неопределенности, в которых тонут крохи определенности. И мало того, эти помои еще и прогрессивно деградируют прям на глазах. Короче, если си это программирование, четко написание команд для четкого получения результата, то скриптование это скорее общение с компьютером уровня "Слыш, дарагой, сделай заебись, а, мне очень нада". Для скриптера компьютер это не механизм, которым он управляет, а черный ящик исполняющий желания, вроде лампы алладина.
Есть предположение, что типичный двачер — это сочетание шизоидного и тревожного расстройства личности. Экономика усложняется с каждым годом. Мир усложняется. Если много лет назад мужчины в основном рычали, двигали тазобедренным суставом и охотились, то сейчас появилось много сидячей, компьютерной, удалённой работы. Для успеха нужно много лет потратить на образование и самообразование, убить молодость и социализацию, чтобы потом ты стал хорошим специалистом, хорошо владел английским, ковырял баги в дебаггере, месил мьютексы и семафоры, обмазываясь многопоточностью и асинхронностью, мигал лампочками на STM32, каждый день самостоятельно учился чему-то новому и загребал доллары, вписался в экономику XXI века. Что в итоге?
У инцела шизоидное расстройство. Он — церебротоник ("мозговитый"). Высокий IQ, интроверт, линуксоид. Много ресурсов тратит на мышление, калории сжигаются, он всегда уставший, апатичный. Ускоренный обмен веществ. Логик. Рационал. Не развита эмоциональность. Сух, зануден. Душнила (душный человек). Не способен адекватно рассказать о своих хобби, интересах, потому что они сложные наподобие "запилить свой процессор на FPGA своей архитектуры и микроархитектуры, а потом для него компилятор написать". Когда начинает рассуждать про монады и моноиды, Haskell и Erlang, тянки разбегаются, затыкая уши.
У инцела тревожное расстройство вследствие воспитания в однополой семье "мать плюс бабушка". У Дениса Бурхаева было ещё хуже: мать + бабка + сестра матери, они втроём пытались его воспитать даже не образцовым пионером, а образцовой пионеркой. Поскольку двачер потратил молодость на умственное, а не физическое развитие, да ещё и мать с бабкой стращали его, дрессировали и запугивали, то получился результат, как на картинке 1. Рост — средний по популяции, астеник, есть дефицит массы тела, одна кожа да кости. Драться не умеет
>>2298844 >Наверное к тому, сто си и с# не имеют ничего общего от слова совсем. Наверное, ты один из ботов, которых пишут студенты и проверяют тут, да? Все еще не можете в анализ естественных языков? Прочитай ветку и пойми, что это была ирония о том, что другой анон писал, что C и паскаль - это языки близнецы, только потому что в них есть перечисления и простые типы.
>>2298881 Какие-то стереотипы миллионлетней давности, что программист - это нерд-аутист-скряга, хотя еще с 90х эта профессия для всех желающих, и среди прогораммистов можно встретить кого угодно от нерда, до гопника, от кочки до богемного хипстора, хотя 90% - обычные офисные васяны.
>да ещё и мать с бабкой стращали его, дрессировали и запугивали Лолшто? Обычно в таких семьях сынуличке жопу вытирают и сюсюкают аж до свадьбы, пока овоща не передадут на сохранение другой бабе, и пусть только попробует ему жопу неправильно подтирать нашему золотцу, тупая блядина.
>>2298671 А профессионалы, едва им после рождения перерезают пуповину, сразу начинают пейперы хуячить в научные журналы, так тебя надо понимать, максималистичный юноша?
>>2299021 Профессионалов не лепят как говно из глины в школе, они ими сами становятся, и уже далеко не в школе, а во взрослой жизни. А лепят только тупорылое пердольное говно, потому что само по себе говно безмозглое и бесполезное, ничего не иожет. Поэтому и не нужно лепить, пердосрани нет места в школе, если нет цели наплодить выродков.
>>2298903 Си и Паскаль это близнецы, тут нет никакой иронии. Разве что Паскать дубовый, т.к. предназначен для учебы, типа строго воспитывать стиль кода. Но функционирует от точно так же как Си и С++, т.е. является их прямым эквивалентом, просто он неактуален по причине дурацких идей в его дизайне озвученных выше.
>>2299435 Такие близнецы, что на момент появления первой, во второй не было ни динамических массивов, ни управления динамической памятью, ни нетипизированных указателей и тд. Покормил. То что ноги растут у обоих из алгола, не делает их близнецами.
>>2299561 На момент появление на свет, ты не мог ни башкой думать, ни разговаривать, а мог только орать и пачкать пеленки. Так зачем рот тут открываешь? Покормил.
>>2300224 Не напоминай. Вот же годная вещь была - компиляция в памяти это нечто божественное. И хоть я приверженец Си, но Турбо Паскаль вспоминаю с любовью. Годнота была.
>>2299407 >Профессионалов не лепят как говно из глины в школе, они ими сами становятся А становятся они таковыми по двадцать лет хуяча на языках, "реально применимых на практике", правильно я тебя понял?
>>2297526 (OP) Доброго вечера, си боги. Хочу адски въебать computer science, и я так понимаю мне нужен си. Есть какая нибудь книжка совсем для грудничков? Что бы параллельно учить both hardware & software части
>>2300254 >компиляция в памяти это нечто божественное Имеешь ввиду компиляция сразу в бинарник, без этапа создания объектных файлов? Если да, то можно вспомнить что объектные файлы могут пригодиться для инкрементальной компиляции.
>>2300464 >Имеешь ввиду компиляция сразу в бинарник, без этапа создания объектных файлов? Нет. Имеется в виду компиляция в память, без создания исполняемого файла. Т.е. это было похоже на интерпретатор, с отличием в том, что программа всё же компилировалась, но только исполняемый код был в оперативной памяти и не писался на диск. Это имело смысл, посколько IDE HDD были очень очень очень очень очень медленными.
Спешите видеть - тупой защеканец высказал своё бесполезное мнение - >>2300519
Спросите меня: "А почему он тупой?" Да потому что не ведает вырожденец о чём толкует. Дядя этому хуйлу и адекватным анонампринёс картинку, чтобы оно, хуйло, посмотрело своими мутными красными глазами на пункт меню "Destination Memory", но вонючая субстанция в его наплечной параше неспособна осознать очевидные вещи, оно увидело первый раз в жизни Turbo Pascal на этой картинке и нихуя не поняло.
>>2300523 Поридж даже не понял о чем речь. Пытается махать незначительной фигней, не замечая что штаны спили и на самом деле размахивает своим достоинством на потеху публике.
>>2300254 >была - компиляция в памяти это нечто божественное. Это архаизм на самом деле: так работали первые поколения компов без ОС и релоцируемых программ, с однопроходным ассемблером. Подозреваю ТурбоПаскаль выдавал что то типа досовского com файла - там простейший формат, по сути дамп памяти, который грузится всегда в одно место.
>>2300540 Это всё понятно, но это работало охуительно. И приятно.
И в то же время была возможность скомпилировать с противополжной крайностью - оверлеями. Такое в голову могло прийти только богатырям - программы, размером больше имеющегося ОЗУ в то время, когда виртуальная память была только у суперкомпьютеров.
>>2300549 >Таненбаум "Архитектура компьютера" Я сам не читал, но вот тут ее не очень любят видимо. Говорят она башню из слоновой кости строит. https://habr.com/ru/post/589091/
>>2302732 Не понял. >>2302792 Ломать? Ломать создание int a[5]; ни в коем случае не стоит. А можно позязя int main() { static const size_t a = 12; int arr[a]; } ? Ну позязя!
>>2302840 Вангую потому что она не тру конст, у нее есть локация в памяти, теоретически ее может переписать (да это UB и надо что-то типа снятия защиты записи на страницу памяти?) const int a = 12; intp = &a; p = 42; В отличии от тру конст, которая сразу пойдет операндом в машинную инструкцию (хотя, конечно, ее тоже можно перезаписать, лол)
>>2303493 >>2303498 https://docs.microsoft.com/ru-ru/cpp/c-language/type-char Хотя сейчас погуглил, как я понял знаковость изменяется флагом комплиятора, но насколько я помню по умолчанию он стоит всегда на беззнаковые, а проект называется Project1, поэтому я думаю, что там используется беззнаковый.
Аноны, а как вы указываете тип переменной? Стандартной хуйне в виде "int, long long, ...." или же как это сделано в расте, чтобы было видно количество байт "u8, u64,..." Где вообще можно об этом почитать?
>>2303530 Видеть количество байт нужно только во всяких криптографических и прочих алгоритмах. В остальном достаточно базовых типов, главное для размеров использовать size_t, а для разницы указателей ptrdiff_t.
>>2303530 >Аноны, а как вы указываете тип переменной? В зависимости от проекта по желанию левой пятки. А если серьёзно, то действительно в завсимости от проекта - под Виндой одно, под Фрюниксами другое. Как в хидерах объявлено, так стараюсь и в проекте.
Но если проект подразумевается быть кроссплатформенным, то #include <stdint.h>
>>2303546 Тут как раз никаких вопросов. Переменная хранится на стеке, там же где адрес возврата и прочее. Ты пишешь в память ЗА переменную. Просто тупо ее портишь.
>>2303464 А какой смысл у этого кода? Ты к адресу переменной C прибавляешь единицу, а зачем разыменовываешь получившийся указатель. Что за эффект должен получиться? неофит
>>2303553 А хотя да, сейчас вчитался получше в ошибку, стало понятнее. >>2303557 Если буквально то я хочу прочитать следующий за переменной байт. А вообще всё началось с того что я попробовал вывести чар как инт, то есть через %d и ожидал увидеть там число отличное от 129 которое присвоено, но выводилось всё так же 129. Потом я решил посмотреть стоят ли после этого числа нули в памяти - оказалось что нет. И только потом я вспомнил что аргументы передаются через стек и он ложит туда 1 байт как и полагается, а остальные байты видимо заполняет нулями это не точно
>>2303585 Я не знаю почему так. Мое предположение - студия видит что ты обращаешься по адресу вне переменных, считает это UB (Undefined Behavior), в этот момент считает, угу, значит это бред написан, переменная c реально не используется, выкидываю вместе с инициализацией.
>>2303610 всё то же самое, но справедливо, стек реально ломается. Но я тут в процессе задался фундаментальным вопросом, а что вообще переменные забыли в стеке...
>>2303618 У тебя локальная переменная функции. Если ты вызовешь ее рекурсивно, то у каждого вызова должно быть место для своей переменной. Естественно если ты объявишь переменную вне функции, она будет не на стеке.
>>2303834 На этом часто уязвимости и основаны. С этим пытаются бороться (силами операционной системы и компилятора) разбрасывая память по рандомным адресам - ASLR
>>2297526 (OP) Есть ли какой-то способ имплементировать this-> в С? Пишу для микроконтроллеров, не хочу полностью переходить на С++ и менять корпинятор.
Да, про передачу указателя на функцию первым аргументом знаю.
>>2304504 Ничего так, лихо ты. В VS уже не работает, не то что между архитектурами. Но можно перекрыть кучей дефайнов и, собственно, сделать свой компилятор.
Смотрю как в VS вообще с asm вствками работать, не разу не работал. В x64 вроде вообще не работает.
>>2304550 >Но конечно такие вещи опасны >как сделать из си кресты, но без крестов, кресты не нужны, но нужно как в крестах Да, дебилы опасны, я бы такого хуесоса мгновенно уволил с занесением в черный список. Если так любит играть со своим анусом, пусть это делает дома наедине с собой.
>>2304712 написал же, чтобы юзеры всяких либ не забывали FreeMyLib() вызывать и тому подобное потому что штука, которая может вызвать событие на выход переменной из скоупа, очень нужна
>>2304738 скажу больше, что многие C89 собираются, на C99 переходят, только очень низкоуровневые, когда нужна уверенность в целых, 64битный да вариативный макрос > И расходы у defer функций огромные накладных расходов вообще нет, компилятор просто вставляет кусок кода в место, где переменная выходит из скоупа
>>2304749 >накладных расходов вообще нет, компилятор просто вставляет кусок кода в место, где переменная выходит из скоупа https://pastebin.com/JrH980Cu
Как он будет обрабатывать некорректные выходы из области видимости? Как он будет оптимизировать количество вызовов defer функций?
>>2304761 > Как он будет обрабатывать некорректные выходы из области видимости? ну так перед строчкой abort(); // critical error, exit, pthread_exit, ExitProcess, ExitThread etc вставит free(a); free(b); free(c); т.к. компилятор видит, что в этом месте точно такой же выход из скоупа > Как он будет оптимизировать количество вызовов defer функций? что значит количество? Один вызов к одной закрепленной переменной. var x; defer(x){ /code / } теперь в месте выхода переменной X из области видимости вставляется code
>>2304780 >ну так перед строчкой abort(); // critical error, exit, pthread_exit, ExitProcess, ExitThread etc Компилятор не знает, какая функция завершает работу программы, pthread_exit, ExiitProcess, ExitThread функций нет в стандартной библиотеке. >т.к. компилятор видит, что в этом месте точно такой же выход из скоупа Не видит. >Один вызов к одной закрепленной переменной. Это назвается деструкторы, мы же говорим о defer функциях. >что значит количество? Для каждого выхода области видимости, необходимо продублировать код вызова defer функций или придумать гениальный способ оптимизации машинных кодов создаваемых компилятором, только зачем?
>>2304792 > Это назвается деструкторы, мы же говорим о defer функциях. изначально мы говорим о механизме, который будет вызывать некий код при выходе переменной из области видимости, а каким словом это обозвать дело десятое > ЗАЧЕМ ТЕБЕ C++/Go В C? тоже выше написано, чтобы создавая библиотеку я бы давал гарантии пользователям, что им нужно только создать структуру из этой либы в нужном им месте, а об освобождении ресурсов уже подумал я и компилятор мне помог
>>2304814 >изначально мы говорим о механизме, который будет вызывать некий код при выходе переменной из области видимости, а каким словом это обозвать дело десятое >>2304708 >скорее бы уже C23, может будет defer или любой другой деструктор Ты путаешь понятия, но пытаешься в расширение стандартов языка.
>я бы давал гарантии пользователям, что им нужно только создать структуру из этой либы в нужном им месте, а об освобождении ресурсов уже подумал я и компилятор мне помог Пиши на C++.
>>2304823 > Ты путаешь понятия я написал суть, а слова привел для тех, кто в теме не очень шарит, а кто шарит и так понял смысл из фразы > штука, которая может вызвать событие на выход переменной из скоупа, очень нужна
> Пиши на C++ сиди на C89, никто обратную совместимость пока не ломает
ладно, ты решил в срач скатываться, вместо обсуждения, поэтому бывай
>>2304828 >я написал суть, а слова привел для тех, кто в теме не очень шарит, а кто шарит и так понял смысл из фразы > штука, которая может вызвать событие на выход переменной из скоупа, очень нужна Ты хочешь деструктор в С, зачем? Возьми и пиши на C++, где эти деструкторы есть.
>сиди на C89, никто обратную совместимость пока не ломает Я сказал тебе решение, твоей же задачи.
>ладно, ты решил в срач скатываться, вместо обсуждения, поэтому бывай Сказал по фактам, но ты не можешь в обсуждение.
>>2304693 >как сделать из си кресты, но без крестов, кресты не нужны, но нужно как в крестах Я против крестов ничего не имею, так что утверждение не к месту. Но я не могу просто использовать кресты, играть с разными компиляторами, потому что их попросту нет во многих контроллерах, которые используем. Как и многих стандартов Си, хотя это вообще меньшее из зол. А переносимость кода важна. Хотя бы портирование между архитектурами. Где-то FIFO и LIFO; где-то 8, 16, 32 бит; а где-то Big\Little Endian.
Так что, то что ты говоришь - "играть со своим анусом", так такое бывает, да. Даже в крупных компаниях и никого не увольняют. Иногда свои ебанутые SDK пишут, которые на других работах нахуй не нужны потом.
Как пример: работал в конторе где делали виртуалки, и чтобы передать данные в гостя нужно было, если вкратце: 1. Приостановить виртуалку на один такт (код Си) 2. Подменить значение CPUID (asm вставка) 3. Продолжить виртуалку и подтянуть значение в госте (код Си) 4. Приостановить виртуалку на один такт (код Си) 4. Вернуть значение CPUID (asm вставка) 5. При необходимости повторить ...... x. Продолжить виртуалку при завершении (код Си)
Так там такой ебейший дефайн был нагроможден ради пяти строк со всеми проверками компиляторов, ОС хостовых машин, и прочего говна.
>>2304955 просто многие не понимают, что от C тоже хотят нормального человеческого развития или запила его альтернативы, чтобы был такой же легкий в освоении и простой, но при этом учитывал знания, полученные в IT за последние 40 лет
>>2304955 Не о том речь. В твоем примере поставлена задача и она решена, не важно дефайнами или нет, это продуктивная работа. Ты же, изобретая кресты в сях, не решаешь никаких задач, а тупо играешься, балуешься, причем знаешь как надо делать (передавать параметр), но сознательно откладываешь решение. Косишь от работы бессмысленным пердолингом. Поэтому я и сказать "играть со своим анусом", потому что это и есть маструбация, бесполезное занятие только ради личного удовлетворения, т.е. вред работе. И особенно если впердолишь нестабильное решение, это уже не просто вред от бездействия, а активное вредительство.
Начала учить язык по книжке R. Seacord - Effective C. Почему компилятору индифферентно использую ли я * при указании на функцию? Как должно быть по идее правильно?
>>2306834 Не определяет, асм вставки вроде вообще не стандартизированы нормально, в каждом компиляторе синтаксис у них отличается. Для каждой архитектуры тоже свой асм.
>>2306816 Возможно это связано с тем, что компилятор неявно приводит fn_b, к указателю на функцию, после чего ты его разыменовываешь и он снова приводится к указателю.
>>2308918 Что значит сделать форк? Внести какие-то изменения в репозиторий или что? А как обычный рядовой чел внесёт какие-то нормальные изменения в репозриторий с операционкой чтобы это ещё и можно было бы использовать в курсовой? мне просто интересно, я даже не представляю что там сделать такого можно.
>>2308982 Тебе нужен курсовой и код, или просто курсовой? Какая ОС? Какие-то ограничения, задачи на курсовой были от преподавателей? Если код, то под окнами, я бы порекомендовал написать логгер для обращений программ в реестр, чтобы удалить созданные ими ключи, после их деинсталяции. Под пингвином, попробуй написать ... Не знаю, под него все системное уже написано.
>>2309002 Курсовая заключается в написании кода + записки к нему. Ограничений вроде нет, я думал взять что-то про линух, тк наверное по нему больше всего инфы в инете. Была идея на ncurses написать gui который показывает различные датчики температуры в компе, и как-то встроить в виде виджета на рабочий стол. Насколько реализуемо? Сам я пользуюсь убунтой
>>2310059 > Мнение? Хочу, чтобы перевел и оформил в виде статьи на каком-нибудь хабре, чтобы с большим числом народу перетереть Ну а по сути - все как всегда: комитетчики - старые пердуны, которые уже не умеют в развитие, а только используют то, к чему привыкли, поэтому тормозят развитие. Есть кучи направлений, где можно улучшать эффективность языка, чтобы он делал более совершенный код, чтобы удобнее было писать, но ..
Если в одной библиотеке, есть статическия глобальная переменная, например, мьютекс для синхронизации вывода, то если я слинкую эту библиотеку, статически с другой библиотекой, а после чего использую вторую библиотеку в своей программе и еще раз слинкую статически первую библиотеку, но уже со своей программой, то мьютексы во второй библиотеке и в первой библиотеке будут разные?
>>2310678 Если проекты (1. программа+мьютекс_либа и 2. либа+мьютекс_либа) разные, то очевидно что глобальные переменные у обоих проектов будут разные. Надо подключать мьютекс-либу динамически к программе и либе.
>>2309002 >Если код, то под окнами, я бы порекомендовал написать логгер для обращений программ в реестр, чтобы удалить созданные ими ключи, после их деинсталяции. - Звучит как глобальный хук (|| другой способ инжекта либы) с перехватом функций обращения к реестру. - Также похоже на снэпшотер всего реестра, до и после установки программы. Но там еще и другие программы могут в этот момент писать что-то в реестр. Может случиться бяка.
>>2311463 >Звучит как глобальный хук (|| другой способ инжекта либы) с перехватом функций обращения к реестру. Да, но если права позволяют и система тестовая, то можно реализовать через патч системной Advapi32.dll, но я не помню, как связываются системные библиотеки, в смысле только динамически или статически тоже. Ну, а способов глобальной подгрузки dll, в интернете миллионы, к тому же прав администратора будет достаточно, потому что следить за процессами, у которых права выше администратора, бессмысленно.
>>2311988 >>2311998 Посмотрел на исходный код, там (по гитхабу) в 150 строке, в файле unproto.c выбирается заголовочный файл флагом STDARG, используй его при компиляции.
Функция printf и все остальные ее производные, в конечном итоге, вызывают write или WriteFile, которые можно использовать для записи в сокет, так вот, можно ли использовать функцию fprintf для записи в сокет и насколько это легально?
Товарищи, а при линковке gcc шо -static шо -Wl,-Bstatic это синонимы и просто слинкуют все последующие либы статически к бинарнику приложения?
Если мне нужно часть либ статически, а часть динамически, то мне перед одними нужно поставить -Wl,-Bstatic потом их перечислить, потом -Wl,-Bdinamic и уж их перечислить?
Аноны, почему так мало? Где функции сортировки, работы с деревьями, генераторы различных типов распределений, списки, графики? Неужели такие базовые вещи в Си нужно писать с нуля в ручную? Или может быть есть какой-нибудь ресурс, где можно найти готовые реализации в .h файлах?
>>2313116 > где можно найти готовые реализации в .h файлах? github, за последние лет 50 написали уже все, что только может тебе прийти в голову > почему так мало? потому что в стандартной либе должен быть минимум элементарных кирпичиков, чтобы на любой ОС можно было запустить, а не засирать и тащить в нее все подряд
>>2313139 Ну гитхаб понятно, но почему нет какого-то централизованного и стандартизированного менеджера пакетов вроде pip'a, где можно скачать готовую и отлаженную реализацию и включать её в код через include. Разве удобнее самому копаться в гитхаб-помоях, где половина функций либо вообще не будет работать, либо будет работать так плохо, что придётся переписывать самостоятельно? >>2313155 Деревья вообще-то даже в файловых системах используются. Давай, напиши ФС на Питоне, клован.
>>2313155 > Для деревьев и прочей лабуды используют другие языки вроде питона. Ты не туда зашел, петушок, со своим говном. Какой еще петухон. Ты не туда зашел, петушок, со своим говном. > но почему нет какого-то централизованного и стандартизированного менеджера пакетов потому что тогда нужен какой-то дядя или много дяд, кто будет определять что такое хорошо по своему вкусу, все либы в своих областях чаще всего итак в одном самом популярном и отлаженном экземпляре, та же ssl, ну а что попроще вроде там png - набираешь также в гитхабе и смотришь по количеству звезд, времени обновления и прочему, если подходит - берешь, для простых либ давно есть стандарт вроде того, что создается one_header_library под свою задачу, а потом их просто накидываешь в свой проект и прописываешь один инклуд, яркий пример сборник таких либ stb
>>2313157 >Ну гитхаб понятно, но почему нет какого-то централизованного и стандартизированного менеджера пакетов вроде pip'a, где можно скачать готовую и отлаженную реализацию и включать её в код через include. Все есть. См. msys2, vcpkg под винду. С линухом вообще никаких проблем нет, там в каждом дистре свой пакетный менеджер. >стандартизированного Как ты себе это представляешь? Си это не только х86/64. Существуют десятки сишных компиляторов под хуеву кучу платформ, которые не то что бинарно, а даже программно не совместимы.
>>2313981 Спасибо, а не знаешь как этот FARPROC правильно в функцию прокинуть и через GetProcAddress получить, потому что func_1 остается NULL, а func_2 все нормально работает? Но нужно именно без хардкодного описания параметров функции через typedef, чтобы перед GetProcAddress ее тип проставить или без этого он совсем никак не сможет в данном случае сопоставить func внутри функции load_func и передаваемую туда func_1
>>2313983 Ты же понимаешь, что ты обосрался и пытаешься в маневры? Зачем ты продолжшаешь общение? Смирись с тем, что ты не прав, у тебя нет никаких оправданий, а лишь попытки оскорблений, скорее всего ты бездарное существо, которое живет на бабушкину пенсию и дрочит Си-код.
>>2314046 Ты передаешь указатель в функцию и его изменяешь, передавай указатель на указатель для его именения или взаимодействуй с глобальной переменной.
>>2314125 Но тогда почему там написано "на помощь и приходит uintmax_t", ведь этого всего лишь машинное слово (или я чет не понял), а структуры могут быть любой длины?
>>2314179 Ну дальше там написано что есть какой-то __int128 (че) которым внезапно может оказаться переменная, но следом же сказано что компилятор не считает его за расширенный целочисленный тип, поэтому максинт это в любом случае лонг лонг. Непонятно зачем вообще нужен этот максинт если есть лонг лонг. В статье сначала говорится типа "вот можем захотеть написать так, но вдруг размер больше? поэтому надо юзать максинт" а потом оказывается что больше-то ничего и не бывает.
>>2314211 >Но есть один нюанс. Некоторые читатели, использующие __int128 или его беззнаковый аналог, могут задаться вопросом: почему в моем компиляторе clang или gcc intmax_t определен как long long, тогда как его размер меньше, чем у __int128? Все дело в том, что clang и gcc не рассматривают __int128 как расширенный целочисленный тип, так как это влечет за собой изменение intmax_t, а это уже нарушает ABI-совместимость с другими приложениями.
>Представьте, что у вас есть программа, которая использует функцию с параметром intmax_t в динамической библиотеке. Если компилятор изменит значение intmax_t и перекомпилирует программу, то она и библиотека будут ссылаться на разные типы, нарушая бинарную совместимость.
>В конечном итоге intmax_t/uintmax_t немного не соответствуют целям, описанным для них в стандарте.
>>2314227 >Я погугли и кажется нашёл кое-что получше Выглядит, как говно без задач с парой пакетов в репозитории, которые не понятно еще в каком виде предоставляются.
>>2314219 Целям не ломания совместимости. Школьникам-максималистам-бунтарям-старье-нинужно-весь-мир-разрушим-до-основанья-а-затем-новый-мир-построим осмыслить подобное трудно, но это важно.
>>2314703 >__int128 int_128 = __INT128_MAX; Эта залупа вообще хоть в чем-то скомпилируется? Ни разу не видел 128-битных литералов. если конечно __INT128_MAX это дефайн, а не хитровыебанное прибитое гвоздями расширение конпелятора
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++ должно хватить.
Есть ли возможность кастануть во время выполнения void указатель в указатель на функцию, мб каким-либо образом где-то упаковав информацию о количестве/типах аргументов и типе возвращаемого значения? Или само возникновение такой необходимости уже означает, что я делаю что-то не так? Я пишу свой говноязык и реализую встроенные функции/методы объектов, которые описаны структурами, содержащими имя функции/метода, кол-во аргументов, флаг наличия возвращаемого значения и указатель на C-функцию. Например, в моём говноязыке есть функция int max(int, int), которую описывает структура {"max", 2, true, builtin_max}, где builtin_max - void указатель на функцию с сигнатурой Object ж builtin_max(Object ж, Object ж). При этом аргумент/возвращаемое значение всегда имеют тип указателя на Object, т. е. структура описывает функцию полностью.
>>2315659 >Есть ли возможность кастануть во время выполнения void указатель в указатель на функцию Да.
>мб каким-либо образом где-то упаковав информацию о количестве/типах аргументов и типе возвращаемого значения? typedef return_type function_type_name(parameters);
Зойчем структуры как-то ебануто выравнивают содержимое? Нахуя это сделано? Как ими пользоваться нормально, если они такие непослушные? Хотел структурой описать содержимое одного файла, так она все переговняла, посмещала. Хуйня получилась. Пришлось ебаться, описывая содержимое массивом с указателями.
>>2315823 >Зойчем структуры как-то ебануто выравнивают содержимое? Нахуя это сделано? Производительность.
>Как ими пользоваться нормально, если они такие непослушные? Правила выравнивания изучи.
>Хотел структурой описать содержимое одного файла, так она все переговняла, посмещала. Хуйня получилась. Пришлось ебаться, описывая содержимое массивом с указателями. Проблема в тебе, а не в выравнивании.
>>2315823 гугли упаковка/распаковка структур для бинарного хранения или передачи и не выдумывай велосипедов надеюсь ты еще студентик, а не зарабатываешь этим деньги, а то заебался переделывать за таким говном как ты
>>2315561 Окей, спасибо, анончик! А по учебникам че то годное можешь посоветовать? Чтобы вот быстро освоить как то хотя бы базовые вещи, чтобы потом уже проще было. А то этих талмудов на 1000 страниц много, но что именно из этого годнота на берегу определить очень сложно.
>>2315672 Спасибо. В результате поступил средне - передаю содержащий аргументы объект в случае функции, а в случае метода ещё и соответствующий инстанс. Свой подход всё ещё собираюсь использовать для различения функции с аргументами/функции без аргументов/метода, но это будет уже проще сделать.
>>2315707 Спасибо, что-то вообще в голову это не пришло. Жаль только, что придётся условиями всё это дело обложить а-ля "if (nargs == 2 && has_return) { return (func_type_2args_has_return)(args) }. И в макрос никак красиво не оформить.
Аноны, почему первый мегабайт в начале диска (gpt) пропускается? Он отображается как свободный то есть неразмеченный. Находится вначале. С какой целью это сделано?
>>2317066 Надо подчеркнуть чтобы вы быстрее поняли. Вот видите первый разедл и у него offset 1024кб от начала диска, почем первые 1024кб диска не используются? А? А? А? Причём они не размечены так как на диске отображаются как фри.
>>2317115 Потому что здесь ситемщики сидят больше шансов что ответят.
Да я уже разобрался потому что lba 0 это резерв для mbr защищаюй gpt от изменения старыми программами. Ну и до меня сразу не доходило по картинке
Правда вопрос в том что mbr запись 512 байт занимает а не 1024 килобайта но это видимо размера кластера то есть весь lba0 адресует 1024килобайта потому что такой размер блока, ведь lba1 это уже заголовок gpt
Системный вызов fork() создаёт копию родительского процесса. Правильно ли я понимаю, что код в этой копии стартует не с самого начала программы, а с того места, которое идёт сразу после fork() ?
>>2317183 Да. >>2317185 >С самого начала программы. А как тогда сделано, чтобы форки не плодились бесконечно? Ведь если программа начнёт выполняться с самого начала, то она опять на вызов fork() натолкнётся?
>>2317175 Не совсем так, он начинает работу с места форка, но возвращает результат в зависимости от того, является ли процесс дочерним или родительским. Таким образом, можно сделать различную логику у дочернего и родительского процесса, после форка.
https://opennet.ru/man.shtml?topic=fork >При успешном завершении родителю возвращается PID процесса-потомка, а процессу-потомку возвращается 0. При неудаче родительскому процессу возвращается -1, процесс-потомок не создается, а значение errno устанавливается должным образом.
>>2317679 ничем. всем устраивает просто навсякий случай спросил мало ли есть какой-то более простой\альтернативный способ. всегда так делаю. так я уже копаю во всю в его сторону
>>2317707 >>2317724 Функции по выдаче реальной температуры процессора не предусмотрено в wmi есть только датчик с материнки, чтобы её узнать нужно драйвер написать.
>>2319220 Кто считает? Си первым делом изучают например в cs50 или в школе21. Мой препод в универе говорил, что си хороший первый язык. Из аргументов: учишься работать с памятью, простой синтаксис.
Помогите написать makefile. собрал библиотеку функций из .с в .о потом ar rc в один файл .а. Позже написал main.c как его теперь соединить с библиотекой .a ?
>>2319311 у вас слишком сложно уже попердолился и написал типа gcc -o $(NAME) $(OBJ_FILES) $(LIBA) вроде работает. Мне говорили что книжка по мейкфайлам около 700 страниц, так и живу на основе ранее написанного
Хочу в драйвера пиздец как вкатиться. Начать хочу с винды, подскажите с чего начать ньюфане? Ну я щас читаю microsoft docs про драйвера там всякие виды, isolated driver packages и т.д. много всего и лишнего для ньюфажной головы там. Подскажите как уже к практике присутпить. Может какой-нибудь фильтр для клавиатуры написать или хз что.
>>2297526 (OP) Вчера оставлял тред, никто туда не зашёл и его снесло, потому что я забыл бампнуть. Собственно, вопрос с треда: Насколько распространено использование wm_keyboard_LL для отслеживания нажатий клавиш, и как сильно на это могут триггерится антивирусы / античиторы / антипидоры?
>>2319413 Думаю, что как минимум тем, что у него открыт исходный код; в репозитории ядра много примеров драйверов для разных устройств, в которых можно покопаться (предварительно разобравшись, как ядро с ними взаимодействует).
А в чём геморрой? На моём личном опыте линуксовский GRUB рядом с виндусовским загрузчиком хорошо рядом встаёт; слышал о проблемах с какими-то моделями efi, но сам не встречался. Плюс, если тебе просто дрова писать и тестировать, то и места свободного на диске много выделять не надо.
да я так сказал про дуал потому что как-то хотел вторую винду поставить и она выёбываться начала что диск размечен не в рекомендуемом порядке и в итоге крашилась при установке. сами микрпософты не рекомендуют в двуал бут в ефи 2 винды пилить.
спасибо, анон. тогда будем в linux стремиться для начала
>>2319422 >wm_keyboard_LL Эти хуки хороши только если тебе нужен доскональный контроль клавы/мыши, включая блокировку. Например есть НЕАКТИВНОЕ окно которое тебе нужно скроллить и кликать в нём, но БЕЗ АКТИВАЦИИ этого окна. С помощью хука перехватываешь все события, реагируешь на них как хочешь, при этом можешь блокировать какие надо от дальшейшей обработки системой по умолчанию.
Звучит красиво, но - ненадежно. Хуки работают по принципу цепи - передачи сообщений от одного приложения к другому. Это значит, если хук используют два и более приложения, и одно из них обрабатывает сообщения некорректно или блокирует от передачи дальше, остальные приложения в цепи больше сообщения не получают и висят мертвые, не реагируют. Есть достаточно софта, даже от больших серьезных компаний, страдающего подобным говнокодом. Будь готов к тому, что твоя прога в любой момент отвалится "просто так".
Надежно работает GetAsyncKeyState(), но эту байду нужно дергать по таймеру, что зашквар, и быстрые нажатия таким образом можно пропустить. Еще есть RegisterHotKey(). Сам не пользовался, но для своей задачи выглядит наилучшим выбором. Шлёт сообщения как положено, и вряд ли будет отваливаться как хук.
Вообще, я думаю, есль же всякие кейлоггеры, где реализовано всё как надо, но эти хацкеры мамкины жлобы код скрывают.
мб есть какой способ намутить темплейты как в плюсах используя какой-нибудь не сишный препроцессор? вроде же есть какие-то общие препроцессоры типа gnu m4
>>2319914 > 1) Зачем они тебе? чтобы не писать вручную миллион одинаковых функций и структур типо int func_int(int arg1, int arg2) float func_float(float arg1, float arg2) и т.д. >> 2) Что ты понимаешь под темплейтами? то что в плюсах понимается под темплейтами >> 3) Зачем шаблоны в Си? а зачем спрашивать один и тот же вопрос 2 раза?
>>2319947 спс, идею понял, не лаконично, конечно а если мне надо шаблон на 2 типа то там видимо кастыли вообще лютые будут >>2320002 > выглядят они несколько говняно супер говняно выглядят либа прикольная
Помогите продавцу мяса разобраться с циклом Хочу сделать проверку допустимости ввода только чисел, которые при соблюдении условия будут записываться в массив. Если ввожу только числа, то программка работает, а если ввожу другой символ, то консолька зависает. Объясните пожалуйста
>>2321137 Считывай в строку, а после пройдись по ней функцей isdigit, дальше через atoi преобразуй строку в int, размер буфера (для строки) будет равен `sizeof(#__INT_MAX__) + 1`.
>>2321139 >`sizeof(#__INT_MAX__) + 1` __INT_MAX__ - максимальное значение int в десятичной системе, в строковом представлении, + 1 для знака и еще + 1 для терминального нуля.
>>2321139 А можно ли как-то сделать без функций атой, сайзоф и т.п.? Я пока что ещё не дошел до этих тем с работами со строками, пока хочу разобраться как циклы сделать с помощью простых отношений
>>2321150 Но в примере все равно происходит неправильная обработка строк вида "1000qwerty", потому что scanf считывает только 1000, а последующее чтение возвращает "qwerty", поэтому очистку stdin надо сделать общей для 2 случаев, то есть вынести за проверку.
Анончики-прогеры, такой вопрос Почему-то иногда при запуска кода на Си(1 раз из 5), в переменные записывается какая-то дрянь, работал с указателями, сначала думал, что может неправильно память выделял, но после перепроверки и просмотра кода построчно понял, что все нормально, проблема в том, что только в некоторых ячейках памяти матрицы какая-то ерунда, в остальных все нормально, выделял память под матрицу char. операционная система Windows 10, процессор AMD, работал на ноуте, был разряжен до 15 процентов
>>2321603 / Назначение: выводит на консоль интерпритации, где формула принимает 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"); }
>>2321612 А блять, я понял почему, потому что я выделил память не под char*(указатель на char), а просто на char, пиздец, бля Ебался три часа из-за одной строчки
Есть массив, и в нем надо найти символ, когда он встречается в первый раз. Я создал массив, сохраняю символ в переменную и передаю массив и символ в функцию, которая должна вернуть мне адрес ячейки, где символ встречается в первый раз. Но я запутался с этими типами и указателями. Максимум что получается это вернуть значение по адресу, но не сам адрес. Помогите, прошу...
>>2321734 В объявление функции ты должен указать возвращаемый тип данных. Вместо "char searh(...)", "char* search", так как при возврате переменной text, из функции возвращается адрес на char, а не char
>>2321727 >>2321734 хехе объявил функцию как указатель и все получилось ппц интересно если не трудно объясните пожалуйста. я еще только прохожу указатели
>>2321738 Но что-то мне подсказывает, что можно как-то сделать так чтобы вернуть адрес ячейки можно было бы вернуть из функции объявленной без звездочки. Можно ли так?
>>2321743 Нет, так нельзя, потому что возвращаемый тип данных должен соответствовать объявлению функции. Возвращаешься указатель -- функций объявлена, как указатель, возвращаешь char -- функция объявлена, как char, и т.д.
Объясните нубу, почему звездочка указателя должна являться частью имени переменной, а не типа данных (void *a,b; вылетит с ошибкой "нельзя переменную void") Из за этого для объявления указателя на функцию нужно лишние скобочки писать, а профит в чем?
>>2321969 >Объясните нубу, почему звездочка указателя должна являться частью имени переменной, а не типа данных Указатель не является типом. >Из за этого для объявления указателя на функцию нужно лишние скобочки писать Не нужно.
>>2323432 >по стандарту 99. То есть в стандарте константа не константа. Нет, не верю. Комитет те еще пидорасины, но не до такой степени. Это прыщавые дебилы обосрались.
>>2323340 По умолчанию в стеке тебе делать нечего, тем более тупой индусской макаке. >>2323427 Это была хуевая идея. Если так надо насрать в стеке, есть alloca(), однако давать срать по умолчанию даже без осознания этого факта программистом, ну это дно. Или же это показатель, что именно язык "С" не предназначен для обычных людей, а строго инструмент специалистов досконально понимающих такое подъебки.
>>2323488 >По умолчанию в стеке тебе делать нечего Что значит "по умолчанию"? >тем более тупой индусской макаке Как ты определил, что он макака? >Если так надо насрать в стеке, есть alloca() Нет. https://www.opennet.ru/man.shtml?topic=alloca >однако давать срать по умолчанию даже без осознания этого факта программистом Что значит "по умолчанию"?
>>2323505 >Что значит "по умолчанию"? Без специальных действие с твоей стороны для получения доступа, что будет означать ты понимаешь что делаешь и лезешь туда намеренно. А по-умолчанию, когда просто пишешь обычный код, но он лезет куда не надо без твоего разумения. Последствия такой хуйни "я пишу сам не знаю что" самые печальные. Однако, последнее - естественное положение вещей в говномакакинге. Эти ввыродки думают, что так и надо, что это и етсь программирование, не осознавая, что в си это не работает, так нельзя тут.
>Как ты определил, что он макака? В си, не знать про стек. Залетная макака, ну или серь тролит тупостью.
Совет деда: VLA и alloca не нужны. Если размер массива ограничен парой килобайт, то задай константу и выдели фиксированный кусок стека. Если нет - не стреляй в ногу, используй маллок.
>>2323932 Варнинги и ошибки компиляции, если я захочу передать const char X в функцию, которая принимает char X, но при этом работает с ним, как с const char X, то мне придется отключать варнинги и ошибки.
>>2323963 >Скинь тогда плагин для форматирования кода в виме clang-format (не плагин), но не рекомендую использовать версии до 15, мало функционала может оказаться.
>>2322048 >>2322086 Спасибо, хотя все еще кажется что не перевешивает >>2322121 > Указатель не является типом. Передай в функцию, требующую указатель на int целочисленное значение и почитай что напишет компилятор > Не нужно. int foo(int a, double b) создаст функцию с возвращаемым типом int, единственный способ создать указатель - добавить скобки int (*foo)(int a, double b);
Попробуй разобраться в вопросе прежде чем щитпостить
>>2324535 Во всех подобных случаях смотри асм-выхлоп, это многое прояснит. Вангую следующее: поскольку printf принимает любое количество параметров, они идут по cdecl конвенции, т.е. ты кладешь на стек один байт char и следом четыре байта int, а printf читает два раза по четыре байта unsigned, поэтому и распидорашивает все. Но если такого уровня ответ тебя не устраивает, то кастуй char в unsigned.
>>2324548 >смотри асм-выхлоп так там же вся суть происходит в принтфе, в котором много вложенных вызовов всяких других функций, такое я хз как смотреть >ты кладешь на стек один байт вот кстати что видно из асма, так это то что кладётся именно 4 байта, и вообще не видел чтоб когда-нибудь было по-другому >кастуй char в unsigned так оно же в памяти будет в таком же виде храниться, не? вот просто можно даже абстрагироваться от сканфа, как так получается что чар по модулю больше 255
>>2324556 > кладётся именно 4 байта Я почему-то подумал, что идет именно один байт. Но вообще это логично, что это не так, стек выгодно выровненным держать. > так там же вся суть происходит в принтфе Ну почему, у тебя уже видно как минимум то, что movsx по своему определению пробрасывает знаковый бит, а т.к. пишется unsigned, то он в 31 разряде и дает тебе твои 4 миллиарда. > так оно же в памяти будет в таком же виде храниться, не? Не, в памяти char хранится именно как один байт. Но это без учета возможного выравнивания полей в структурах, ну или, как видно, на стеке.
>>2324569 >movsx по своему определению пробрасывает знаковый бит, а т.к. пишется unsigned, то он в 31 разряде и дает тебе твои 4 миллиарда. а вот этого я почему-то не заметил... тогда вопрос решен, спасибо >Не, в памяти char хранится именно как один байт Я знаю что один байт, я про то что signed и unsigned это одно и то же значение
>>2324576 > я про то что signed и unsigned это одно и то же значение Ну как бы да, нужно только не забывать, что там UB дохуя где на операциях на знаковых. Но отметить хотел бы немного ебанутую терминологию, которая ввела тебя в заблуждение: unsigned сам по себе в сишке это сокращение от unsigned long, он 4 байта на большинстве платформ.
>>2324535 Ты вводишь 2 символа, а scanf ожидает у тебя 2 строки, которые можно преобразовать в целочисленные типы, в итоге получается, что ты просто выводишь неинициализированные значения, которые приводишь со знакового и более короткого к unsigned.
Абстракции позволяют писать код, без них ты бы до сих пор писал пиложения на ассемблере. Да даже ассемблер -- абстракция над схемами из транзисторов.
ООП помогает поддерживать код в больших проектах. С ним проще ориентироваться в коде. Ускоряют написание -- хз, что ты имеешь в виду -- какой-нибудь костыль или маленькое приложение быстрее напишешь без ооп, но потом будешь страдать при дебаге.
>>2325625 >ООП помогает поддерживать код в больших проектах Поправка: поддерживать код в больших проектах, силами большой команды. Если ты делаешь в одно рыло, но в принципе тоже приятнее будет, но не так остро, когда рыл много
>какой-нибудь костыль или маленькое приложение быстрее напишешь без ооп, но потом будешь страдать при дебаге. Нет. Меньше кода - меньше ебли с отладкой.
>>2325625 >Да даже ассемблер -- абстракция над схемами из транзисторов. Нет. >ООП помогает поддерживать код в больших проектах. Нет. >С ним проще ориентироваться в коде. Вкусовщина. >но потом будешь страдать при дебаге. Нет.
>>2325625 >Да даже ассемблер -- абстракция над схемами из транзисторов.
Но ассемблер это всего-лишь язык. Вот архитектура это непосредственная абстракция над микроархитектурой, а ОС - над архитектурами. Где тут место языкам и в частности ассемблеру?
>>2326865 Какое описание задачи? По коду нельзя понять, что ты хотел сделать и где ошибка, что такое первая и вторая функция, какая проверка не работает? Возможно проблема в том, что ты переопределяешь переменные `min` и `max` внутри блоков проверок.
>>2326901 >Какое описание задачи? Больше интересно, в какой тупорылой шараге задают математические задачки на си, самом непригодном для математики языке.
Вопрос к эмбед-господам, если такие тут всё ещё обитают.
Для домашней махарайки хотел бы реализовать эффект из программы Jinx! для LED табло 5х5.
Есть шрифт 5х5 точек, который хранится в виде строк двумерного массива. Ссылка на образец шрифта: https://pastebin.com/htDxc92r
Последовательность действий: 1) получили строку символов 2) нашли первый символ в массиве шрифта и вывели его на табло без сдвига 3) начинаем сдвигать точки первого символа влево 3.1) между символами необходим промежуток в 1-2 пикселя 4) сдвигаем точки символов влево, пока последний символ не будет отрисован полностью 5) начинаем сдвигать последний выведенный символ вправо с соблюдением п. 3.1
"Матрица", 5 строк на 5 столбцов - индексы массива светодиодов, где 0 - соответствует первому светодиоду и 0-ому индексу в массиве Начало точки отсчёта координат ХУ в моём случае - верхний левый угол (индекс 4 матрицы).
Проблема вот в чём: произвели сдвиг первого символа на 3 столбца влево -> тут же надо вставить промежуток в 1-2 пикселя -> и подвязать первый столбец второго символа. И так далее. Вот именно на этом алгоритме у меня мозг и закипел.
Могу скинуть говнокод для вывода символа на табло (он не слишком опрятный). Сдвиг тоже есть, но крайне хуёвый. Есть спизженная функция, которая транслирует координаты Х У в индексы массива светодиодов.
Есть сомнительная идея - динамически выделять память под двумерный массив uint64_t, и попытатсья пихать туда побитово символы - по аналогии с массивом шрифта: 8 символов полученной строки на каждый элемент массива. А потом сдвигать всё это дело. Идея крайне говёная и плохо подходит для эмбед. Но это вобще крайний вариант, прежде чем застрелиться.
П.С. Тем, кому влом помочь - пожалуйста, просто пройдите мимо. Вам не впервой.
>>2327176 Не хватает прокрутки вправо при достижении последнего символа строки.
Эффект в программе называется: "эффект внутренней прокрутки текста" (текст влево <-> вправо, т.е. от первого символа до последнего влево, а по достижении последнего символа - вправо до достижения первого символа; и всё по циклу снова, влево <-> вправо).
Анончик, доделай плез. Если не слишком занят.
Я пока пойду вкуривать что к чему в том, что ты скинул. У меня это много времени займёт.
>>2327117 Не совсем понял, что ты хочешь сделать. Обычно текст отрисовывают в видеобуфер(массив, который содержит состояния точек-пикселей), откуда уже последовательно столбец-за столбцом выводится на матрицу. Сдвиги и промежутки делаются элементарно изменением индекса при чтении этого буфера.
>>2327211 >Смещения и рывки сам исправляй, мне лень офсеты считать. Окей, попробую. Спасибо за помощь и уделённое время. Ты это, в тред иногда заходи - если разберусь с кодом и он взлетит, то хотел бы отблагодарить. Хотя бы пополнением абонентки на телефон любым способом.
>>2327259 >Не совсем понял, что ты хочешь сделать. Хотелось бы избежать использование промежуточного буфера и транслировать на лету текстовые символы + эффекты напрямую в массив, который отображает текущее состояние светодиодов на матрице. Памяти на устройстве очень мало.
>>2327469 У дедов было мало памяти и скорости, дурачок, не более шести символов в идентификаторе гарантировалось. Ты ещё про линуксовые команды пожалуйся, ls cp и т.д.
>>2327211 Анончик, спасибо за старание. Но, кажется, твой код мимо кассы. У тебя завязка на шрифт и консольку. Ну или, скорее всего, я не догоняю, как адаптировать код под свои нужды.
>>2327743 Это пример алгоритма без дополнительных буферов, просто адаптируй вывод на матрицу, сделай абстрактную функцию print_matrix, которая будет преобразовывать смещения под твои данные, у тебя вроде координаты на ней какие-то ебанутые, на вход которой будет подаваться массив значений, типа "10001", где 1 - это включение светодиода, 0 - это выключение. В итоге, сигнал должен будет подаваться на "линию" светодиодов. После чего замени в алгоритме printf на свой print_matrix и подправь остальные данные, как тебе надо. Обнуление состояний светодиодов в таком случае не нужно будет, потому что я же не перезаписываю руками символы в терминале, их перезаписывает следующее число.
>>2327772 Если ты не слишком занят, то напиши, плез, на мыло kaija78@gmail.com. Честно - я не очень понимаю, что творится в твоём коде и смог выделить только некоторые части. П.С. Мыло фейковое, для связи.
>>2327812 >>2327797 Там кстати в комментариях ошибка, в выводе справа налево, но думаю это понятно, там текущая и последняя цифра перепутаны копипастом.
>>2297526 (OP) Аноны напишите годных, заковыристых а так же уебанских вопросов, которые задавали вам на собесе Си. Особенно в эмбеддед.
На последнем собесе мне задавали вопросы самой разной группы инвалидности, например, но среди них можно найти годноту: 1. Назовите отличия стандартов с89 и с99 - справочная информация задрачиванию не подлежит 2. Посмотрите на этот лист А4 кода и найдите все типы ошибок которые тут есть, вплоть до звездочек, точек с запятой, объявления переменных после оперидрования с другими переменными (привет из С89) и прочей иногда не особо очевидной хуеты. 3. Сможет ли МК заработать после первой микросекунды вклчения? - как по мне вопрос хуйня, т.к. он требует некоторых знаний в электронике, которые эмбеддер не обязан иметь. 4. С какими типами оптимизации вы работаете? 5. Как происходит прерывание? вопрос норм, полагаю 6. Что будет если, 2 ядра работающие в параллель, одновременно считывают из одной ячейки памяти и инкреентируют её? Как предотвратить такую ситуацию? - считаю достаточно хорошим вопросом 7. Мьютексы, хуютексы, volatile, static, константный указатель, указатель на константу, указатель на функцию, битовые операции - задают везде по дефолту
>>2328177 Спасибо, проверил - действительно можно. А чому тогда во всех туторах для вкатывальщиков рассказывается о хидер-декларациях и .с-имплементациях? Это что-то вроде гуд-практис?
>>2328168 > 3. Сможет ли МК заработать после первой микросекунды вклчения? - как по мне вопрос хуйня, т.к. он требует некоторых знаний в электронике, которые эмбеддер не обязан иметь. Ну, если в резюме написано, что работал с мк, то это хороший способ проверить, изучил ли чел хоть один даташит. > 4. С какими типами оптимизации вы работаете? Ыыы.
Мне задавали вопрос, как предельно точно синхронизировать время между двумя машинами. Надо было расписать пакеты с метками времени и расчеты, я затупил.
>>2328205 >Ну, если в резюме написано, что работал с мк, то это хороший способ проверить, изучил ли чел хоть один даташит. Тут дело-то не совсем в МК, если говорить про программу - по любому нет, какой бы МК не был. Сначала микроконтроллер настраивает периферию. Это уже ассемблерная часть но пока до нее далеко, см ниже. И это почти всегда элементарный и очевидный ответ.
Но можно углубиться в стартовую логику - т.е. вшитая логика с помощью которой выставляются лог элементы для нормального запуска, т.к. некоторые элементы могут иметь неопределенное состояние от остаточных зарядов, такие как компараторы, триггеры, счетчики.
А если говорить еще и про обвязку и саму работу в целом, т.е. стартанул или нет - то совсем дргуое дело: если посмотреть осциллографом на резонатор, то он стартутет как нарастающая волна (скорее всего из-за конденсаторов возле него). Итог - МК стоит в супоре в самом начале, т.к. резонанор не запущен.
>>2328210 Я бы ответил, что тактовый генератор стабилизируется не сразу и потому в МК есть таймер запуска. >>2328215 Не знаю, но это пришлось бы расписать.
а если я создал enum для флагов что-то типа enum { ... flag_end = 0x1000 0000 } то как будет работать этот enum на системах, меньшей битности 16 и 8 битных, он урежет мне все флаги по 0x1000 и 0x10 соответственно? или исходя из того, что int всегда должен быть не менее 4 байт по стандарту у меня всегда есть как минимум эти 32 бита?
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.
>>2328343 Хорошо, попробуем пойти более сложным путём...
Попытался адаптировать свой говнокод.
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 бит в строке?
>>2328570 >Я правильно интерпретировал эту часть кода? Да. >Я парвильно понимаю, что из целой строки выводятся только первые _DIGITS_FONT_WIDGTH - offset символов? Да. >Т.е. из битового представления строки надо считать только первые _DIGITS_FONT_WIDGTH - offset бит? Да. >Допустим, строка 0x0F -> читаем первые 5 бит (левый бит MSB) -> будет считано 0000 1 Да. >Или пропустить первые _DIGITS_FONT_WIDGTH + offset бит в строке? Да и вывести остатки, то есть 0x0F + 5 бит -> 111.
>>2297526 (OP) ИЩУ УЧЕБНИК САП! Ищу учебник какого-то Русского препода, вроде в двух томах Там он обучает программированию на С в Linux Помогите пожалуйста найти
>>2328580 >В остальном коде разбираться лень, но вроде все правильно, хотя выглядит вроде правильно. Если бы было правильно - оно бы работало :) А судя по моей вебмке, работает как-то не очень...
>89: int last_i = string[0]; // FIX Так это *(string + last_i) - указывает на символ в строке с индексом 0. Потому что last_i = 0.
>>2328594 >Возможно проблема в этом. В хедере задефайнено #define LSB_FONT false Так что заходит в эту строку >(font_line & (0x80 >> bit)) И это просто проверка - что в байте в конкретном бите - 0 или 1 (если 0 - пиксель погашен, если 1 - зажигаем нужным цветом), которая производится с какого-то бита или до какого-то бита в зависимости от offset.
>>2328601 >И еще попробуй обрезать значения, типа xpos > FONT_WIDTH, значит xpos = FONT_WIDTH и продолжать вывод, такое же и с отрицательными (меньше чем 0). Хорошо. Ушёл возиться.
>>2328615 >И это просто проверка - что в байте в конкретном бите - 0 или 1 (если 0 - пиксель погашен, если 1 - зажигаем нужным цветом), которая производится с какого-то бита или до какого-то бита в зависимости от offset. У тебя просто `const unsigned char font_line` объявлен, без указателя, я и думаю, что это хуйня какая-то.
>>2328713 Попробуй без цикла просто вывести 0, потом смести его на пару светодиодов, проверь, как он отображается. И логи по координатам посмотри и проверь.
>>2327117 >>2329221 У меня используется 5 бит шрифта, но 5 бит является 0, чтобы было так же, как на видео. Для того, как ты хочешь придется менять логику, поэтому проблема в несовместимости шрифта и алгоритма.
>>2329394 >Для того, как ты хочешь придется менять логику, поэтому проблема в несовместимости шрифта и алгоритма. Посыпаю голову пеплом Видео - для демонстрации эффекта. У меня нет 4-ёх битного шрифта, да он мне и не подходит.
Сможешь переделать? Если я что-то недоописал - спроси. А то опять забредём не в ту степь.
>>2329344 Просто там очень был хороший учебник, да еще и под Linux А я как раз хотел изучать и С и Linux Да и тем более, я для интереса ведь занимаюсь этим, как хобби Мне на 28 лвл без ВО вряд ли удастся вкатиться в разработку на С, но, для себя изучать ОС и системное программирование - это круто
>>2329454 Имею ввиду, что если учить с нуля, по учебникам которые пишутся для изучения основ под винду, то ведь могут быть сложности? Ведь у линух есть своя специфика. Например, отсутствие bat и exe файлов, другие среды разработки, другая файловая система и т.д. и т.п. что не будет приводится в качестве примера в учебниках по С написанных под windows
>>2329475 Зачем тебе на этапе обучения такие детали? Ты же будешь использовать именно С и стандартную библиотеку. Избегай системные вызовы напрямую. А компилятор скроет от тебя детали реализации. Потом когда разберешь чуть можно смотреть книги по API и ABI Linux. Про формат elf/static/shared objects в инете статьи.
>>2329429 Canonical (разработчик Linux-дистрибутива Ubuntu) выступил против войны в Украине и приостановил работу с российскими компаниями Red hat так же объявили о полном прекращении работы в РФ. Популярный open-source пакет начал заменять данные российских пользователей по IP на сердечки. Один за другим Linux проекты уходят из РФ, open-source себя дискредитировал. Больше нельзя быть уверенным, что твои данные в безопасности. Нельзя быть уверенным, что твой любимый дистрибутив, которым ты пользуешься вскоре не прекратит поддержку пользователей из РФ и вовсе не остановит работу в РФ с закрытием репозиториев, поддержкой языка и т.д. Вся эта философия open-source, свобода и т.д. оказались просто словами и враньем. Что делать в такой ситуации? Какие искать альтернативы и остался ли безопасный дистрибутив в котором можно быть уверенным?
>>2330027 >Вся эта философия open-source, свобода и т.д. оказались просто словами и враньем. Любая религия - враньё, однако религии не исчезают и всегда востребовваны. Подумай почему.
>>2329475 >Ведь у линух есть своя специфика. Да, и что?
>ведь могут быть сложности? Нет. Ты должен уже понимать особенности ОС, иначе ты даже даже не пользователь компьютера, а - чайник. Такому в программировании делать нечего. Сначала нужно знать основы компьютера, и только потом заниматься его программированием. Если же ты хочешь писать универсальные мультиплатформенные скрипты, то ошмбся языком и тредом.
>>2330027 нашел в каком треде такой вброс делать, тут у многих ядра в исходниках лежат и все нужные проги и либы к ним, ну дискредитирует кто-то себя, просто не собирать последние версии без собственной ревизии кода, что там изменили и просто вырезать все подобные сердечки
>>2297526 (OP) Памахите кто помнит, Прату, 11 глава listing 11.29 sort_str.c есть константа #define HALT " " /нулевая строка для прекращения ввода/ в самой программе она не используется, ввод строк не прерывается идёт до 20, как пофиксить?
>>2331175 >есть константа >#define HALT " " /нулевая строка для прекращения ввода/ в самой программе она не используется, Получается неправильный комментарий и неиспользуемый дефайн. >ввод строк не прерывается идёт до 20, как пофиксить? Добавить выход из цикла ввода.
>>2297526 (OP) Сап /pr очень нужна ваша помощь Собираюсь изучать С Но так вышло, что у меня очень, очень слабенький комп который тянет только Linux (Debian) Вкатываюсь я с нуля поэтому я бы попросил порекомендовать учебники по С специально под Linux для нулевого Васи. Т.к. те учебники, что я видел, они все под windows написаны, с софтом и примерами программ для win
>>2332480 Весь код на си и для линукса. Но книга скорее про написание программ специально для линукса и ближе к системному программированию. Базу языка учи по учебникам из шапке треда
Здрастье Выучил циклы, символьный ввод вывод, файловый воды, строки, функции, массивы и указатели, структуры связанные списки, немного про препроцессор, битовые операции, интерфейс очереди атд. Вроде даж получается задачки решать. Что дальше делать?
>>2332544 Для вкатывальщика сложно будет. Но для освоения posix систем - хороша. >>2332480 Что вам так неймётся с желанием бросаться неподготовленными на платформонезависимость? Язык программирования, в частности С для того и создавался, чтобы абстрагироваться от деталей. Для 90% задач (а на вкате и 100%) хватит базового языка и glibc.
>>2332765 Программирование не бывает платформонезависимым потому что это процесс программирования платформы. Вопрос только в выборе платформы. "Платформонезависимость" в просторечном смысле означает виртуальную платформу, которая может работать на нескольких аппаратных. Но Си предназначен не для виртуальных платформ, а для реальных, поэтому не может быть "платформонезависимым".
Нет, разумеется, раз Си находится "внизу", он позмоляет сымитировать "вверх" виртуальную хуйню путем отказа от зависимых вызовов, но такой огрызок от программы на практике бесполезен. Как пример, если писать программу чисто под потоковую консоль и базовым вводом/выводом она конечно будет "платформонезависима", но это очень убого, даже хуже программирования на батниках, потому что стоит захотеть например вывести в определенное место экрана или другим цветом, и всё, ты в жопе. Кому нужны такие обосранно убогие программы, уступающие софту с компьютеров из 80-х, для которых программисты в домашних условиях травили и паяли паяльником материнские платы.
Это что касается программирования. А теперь к тупым свиньям вроде тебя, серущим негативом на реальные платформы как будто это что-то плохое. Ну что тут сказать, из сказанного выше уже можно было догадаться, что такой сброд не программисты, а офисные макаки, еще один синоним для "секретутки" или "программиста 1с". Секретутка - не программист, она работает с документами, которые как раз и есть "платформонезависимы", т.к. работают на витруальной платформе которой является приложение. То, что в документы добавляют скриптинг не делает их программированием в настоящем смысле языка Си, хотя Си конечно позволяет сымитировать и секретутку. Но желают так детать только секретутки, а не программисты, вот где загвоздка. Дело в маркетинге, который напиздел на уши лапшу тупому секретутко-сброду, что они якобы программисты. Ну то же самое как рабам рассказывают что они якобы "сеньёры" (господа). Ну как тупое рабское чмо может быть господином? Самим не смешно? Конечно нет, на то и тупой сброд же, мозгов ноль без палочки.
>>2332827 Знатно тебя порвало, к середине даже правила грамматики перестал соблюдать. А по твоему высеру, тот же libc писали люди поумнее тебя, и он оптимизирует многие вещи, в которых большинство новичков руками накосячит. Плюс постоянные вызовы ядра (системные вызовы) , явно не добавляет производительности. Тем более задачи начинающего изучать язык сильно отличаются от того что ты упоминал.
>>2332765 >базового языка Что значит "базового"? >glibc Почему именно она? >>2332827 >Программирование не бывает платформонезависимым Бывает, Си для этого и создали. >отказа от зависимых вызовов, но такой огрызок от программы на практике бесполезен. Замена. >на реальные платформы Что значит "реальные платформы"? >что они якобы программист Кто в твоем понимании является программистом? >>2332853 >libc писали Какую именно? >люди поумнее тебя Как ты это определил? >большинство новичков руками накосячит О них никто не думал.
Сап, Шайтаны. Вот есть битфилд суммарной шириной в 48 бит. Нужно написать для этого несложную арифметику. Как лучше (или правильно) передавать и возвращать этот юнион в процедуры?
Думаю, что через указатель, так как не везде есть регистры больше 32 бит, но хотел бы узнать авторитетное мнение
Бтв пока писал, возникла генерализация моего вопроса: как вообще передается-возвращается например uint32_t, int64_t на 16битных машинах?
>>2333092 >Как лучше (или правильно) передавать и возвращать этот юнион в процедуры? Указатель. >как вообще передается-возвращается например uint32_t, int64_t на 16битных машинах? Зависит от реализации и процессора. Их может вообще не быть.
>>2333044 1. Си создан как высокоуровневый ассемблер, самый что ни на есть платформозависисмый язык. 2. Зачем замена? Есть компьютер, но использовать компьютер - плохо? У тебя с башкой плохо, секретутка. 3. Реальные платформы значит аппаратные платформы, а не виртуальные программные. Си транслируется в ассемблер для аппаратного процессора и прочего железа, это реальный язык работающий на реальной платформе. Лепить под него абстрактные мультиплатформенные прослойки = тыквить его, нивелировать достоинства Си, такой язык не нужен. 4. В моем понимании, программист тот, кто программирует, т.е. управляет устройством посредством написания программы. Это значит, устройство должно быть фиксировано и его спецификации открыты и изучены программистом. Только так можно полноценно использовать возможности устройства. А виртуальные мультиплатформенные машины это закрытые черные ящики, значит ими нельзя полноценно управлять. Это не программирование - управление, а скорее мольбы и надежды, гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает".
>>2333170 >1. Си создан как высокоуровневый ассемблер, самый что ни на есть платформозависисмый язык. Нет. >2. Зачем замена? Замена платформозависимого кода, на другой платформозависимый код. >2. Есть компьютер, но использовать компьютер - плохо? Почему ты так решил? Из чего вообще образовалось такое предложение? >3. Лепить под него абстрактные мультиплатформенные прослойки = тыквить его, нивелировать достоинства Си, такой язык не нужен. int main(void) { return 1 + 1; } Удивительно, язык сам позволяет абстрагироваться от машинного кода, получается Си не нужен? >4. Это значит, устройство должно быть фиксировано и его спецификации открыты и изучены программистом. В этом треде снова признают всех программистов не программистами, потому что они не подходят под какие-то субъективные определения. >4. Только так можно полноценно использовать возможности устройства. Время. >4. А виртуальные мультиплатформенные машины это закрытые черные ящики, значит ими нельзя полноценно управлять. В чем отличие операционной системы от виртуальной машины? Получается, снова всех программистов вычеркнул из программистов, даже подходящих под твое описание. >4. Это не программирование - управление, а скорее мольбы и надежды, гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает". Почему ты считаешь виртуальные машины "черным ящиком", но не считаешь аппаратные способы выполнения кода "черным ящиком"?
Дополнительно: из таких слов получается, что если в каком-либо процессоре найдется аппаратная ошибка, которая не будет написана в документации, то все программисты включая тех, что подходят под твое определение не будут являться программистами? Потому что: >спецификации открыты >изучены программистом >закрытые черные ящики, значит ими нельзя полноценно управлять >гадание на кофейной гуще: "я пишу сам не знаю что, но авось сработает" Документация не открывает ящик, она только создает видимость открытости.
Очень часто слышал/читал подобное мнение, копия, насколько же все люди одинаковые. Даже в этом треде было подобное уже.Вас тут клонируют?
>>2333261 1. "Врёти". Ну ладно. 2. Враньё. Стремление к универсальности это стремление отказаться от реальной платформы, т.е. отказ от Си. 3. Бессмысленный высер только подтверждающий бесполезность универсального кода. 4.4. Я не считаю, это так и есть. Программирование на Си это техника, как пишешь, так и работает, а на виртуальной хуйне это скриптинг, говношлепство на похуях на авось. Это годится для этого вашего пресловутого "тырпрайза 200к в наносекунду" зашибать бабло, но продукты такого труда конченое говно, не зря же говорят "тяп-ляп и в продакшен". Сама система предназначена и оптимизирована шлепать говно, на которое самим разработчикам похуй. С техникой такой подход не работает, на похуях машина банально не будет работать, тупо заклинит и всё. Этим и заканчиваются потуги макак-секретуток программировать на Си, крашами и бугуртами. >Очень часто слышал/читал подобное мнение Враньё. Если такое тут писали, это был я, больше никто такое не напишет, и я пишу редко.
>>2333519 >1. "Врёти". Ну ладно. Я не писал, что это ложь, я написал, что твое утверждение неправильное. >2. Враньё. Стремление к универсальности это стремление отказаться от реальной платформы, т.е. отказ от Си. >1. "Врёти" Нет. >3. Бессмысленный высер только подтверждающий бесполезность универсального кода. Почему бессмысленный? Каким образом он это подтверждает? >4. Я не считаю, это так и есть. Почему ты так решил? >4. Программирование на Си это техника, как пишешь, так и работает, а на виртуальной хуйне это скриптинг, говношлепство на похуях на авось. В чем отличие от аппаратной платформы? >5. Враньё. Если такое тут писали, это был я, больше никто такое не напишет, и я пишу редко. >1. "Врёти" Я не уточнял, что именно здесь видел подобное мнение.
Зачем ты строишь поспешные выводы на основе каких-либо данных, если они у тебя ошибочные? Твои сообщения похожи на сообщения сгенерированные нейросетью, вроде логика какая-то должна быть, но на деле ее не существует, достаточно задать пару вопросов, чтобы в этом убедиться.
>>2334415 Возможно поэтому >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
>>2324687 Ладно, извини, ты прав. Это круто. А что еще можно делать с этим типом, кроме как передавать в функции? Я попробовал присваивать ему значение функции напрямую и через разные типы, но, похоже, это так не работает. Разобрался. Если писать название типа со звёздочкой - работает как тип указателя на функцию. Сбивает то, что при передаче в функцию компилируется и со звездочкой и без (по крайней мере в VS). В этом есть какой-то скрытый смысл?
>>2334608 26 код игнорируй, из-за ее "особенностей" приходится вместо православного getchar() != EOF писать дополнительную проверку, на википедии, в описании EOF последний абзац >>2334568. Должно сработать, но не уверен.
аноны помогите, начал немного вкуривать многопотчность на линуксе, проблема с общей памятью, выкидывает SIGBUS при попытке доступа к памяти которая была выделена с помощью сначала shm_open а потом mmap, причем обе функции отработали без ошибок, отладка на экране. но при это при попытке записать в любое поле структуры( например я ставил то что выделено первым) всегда выбрасывает из программы с этим сигналом, я прочитал это вроде связано либо с ошибкой выравнивания, либо что там неправильный физический адрес, чего по идее не должно быть если функии отработали без ошибок. дескрипторы открываются в мейне: 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; }
>>2334664 >То есть грубо говоря ничего особенного, просто если это первый символ в строке то она его считает за конец файла, а если нет то за 26? После 26 кода может вернуться EOF, если так, то игнорируй 26 код и выходи из цикла. >>2334834 Это проблема платформы, которая не в состоянии нормально работать, ты даже оправдаться в своей бездарности не можешь.
Вариант с дефайнами даже уебищные конструкции вида "int a,b,c,d,e" преобразует в читаемые. Вместо добавления констекспр, как ключевого слова добавили бесполезный тайпдеф, вместо развития препроцессора добавили бесполезный тайпдеф. Худшее решение, но даже у такого решения есть фанатики (говноедики).
>>2334842 Ну например если нужно будет вводить что-то в несколько строк, \n не подойдёт >>2335003 >какая клавиатура позволяет вводить такие охуительные символы любая, ебанат
>>2336023 Почему ты так решил? Объективно бесполезная функциональность языка, добавленная просто так. Или ты сможешь объяснить почему она не бесполезная?
>>2335011 >>2336140 > деды просто так добавили функционал? > Или ты сможешь объяснить почему она не бесполезная? деды хотели нормально определять свои типы и использовать их точно также как и используют стандартные. тип имя_переменной = велью; без всяких там скобочек хуебочек и т. д. твое > vector(x) = {0}; выглядит как будто ты к вызову функции присваиваешь что-то. Если бы я такое увидел, то сначала охуел бы, что мой редактор не подсвечивает это как ошибку.
да и по тайпдефам грепать удобно, хочешь получить все кастомные типы в проекте - изи.
>>2336716 >Ты уже весь тред засрал своим прата А в чём проблема? Я какие-то неправильные вопросы задаю? >Там варнинг должен быть, а не ошибка Он написал что ошибка. Впрочем, варнинга тоже нет.
>>2336724 Погугли опции компилятора управления уровнем предупреждения для своего компилятора. Обычно Wall. gcc -Wall или /Wall для VisualC Так же можешь добавить интерпретацию предупреждений в ошибку. gcc -Wall -Wextra или /Wall /WX
>>2336931 Да не, мне сами предупреждения не нужны, я просто хотел понять действительно ли это ошибка, и если да то почему. Уже разобрался. >>2336934 Я знал про хуёвый перевод и спрашивал, но мне всё равно рекомендовали именно её. Да даже в шапке треда кроме древней K&R для вкатывания ничего нет, только прата.
>>2337276 Да, один мьютекс на все шаред поинтеры. Не знаю, что за ебанутое конкарренси должно быть, чтоб операции над разными поинтерами часто блочили друг друга.
>>2297526 (OP) Сап, итгоспода, я зелень, только начал вкатываться, не могу понять, почему у меня получается хуйня и как делать правильно, я долбоёб не судите строго.
Как я могу выкатиться, если не вкатился? Как будто сами в первые дни не писали говно. Мне хотя бы понять как гуглить мой вопрос. У меня есть массив 5 значений t, я сделал массив, теперь я хочу подставить эти значения в икс от каждого из этих тэ. Но Xot это не массив, поэтому не канает, как сделать массив в массиве не ебу, была идея сделать двумерный массив, но не понимаю, как подступиться
Объясните пожалуйста со связанными списками, не могу понять момент про передачу переопределенных с помощью typedef структур.
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) и вроде все работает как надо считается.
void InitializeList(List plist); почему в этом прототипе из книги появился еще один указатель? зачем указатель на указатель? Если в первом примере все работает через один указатель?
Ну и еще вот тут на пикриле вроде дано объяснение, но я все равно не понял. Будто бы между темами что-то должны были объяснить по поводу этого, но тупо пропустили потому что автору очевидно, а ученику нет.
Что за двойная косвенность? Почему нельзя в списках обойтись без двойного указателя? Я запутался в общем. Помогите плиз
>>2339178 Ты себя очень сильно ограничиваешь в выборе литературы, выдвигая требование, чтоб интересующий тебя язык программирования и интересующая тебя математическая тема сходились в одной книге. И даже если ты найдешь идеальную книгу, никакого двойного профита не получишь, потому что на освоении сишных приколов и на освоении алгоритмических приколов надо фокусироваться отдельно. Можешь взять K&R и SICP параллельно. MIT Scheme в этом плане ничем не заменить. Получишь массу удовольствия. Но SICP не про алгоритмы есичо, а немножко про другой дзен. Алгоритмическая литература, кстати, в идеале псевдокод должна юзать. Ты должен уметь сам воплощать концепции на своем языке. Это базовая умственная обработка инфы, которую ты сам заинтересован осилить, иначе тебе вообще нахуй ничего не поможет.
>>2340116 Написано что переменная которая объявлена в блоке живёт до конца выполнения блока, но по факту "а" которая объявлена после блока не переписала "i", то есть память не переиспользуется и это значение сохраняется там. Правда я забыл что если в релизе компилить то он может не создавать "a" и просто подставить константы, но на самом деле без констант всё то же самое.
>>2340157 >а в чём тогда заключается временность хранения переменных, если не в том что их потом перезаписать можно? В этом, но компилятор это делать не обязан.
>>2340137 >Написано что переменная которая объявлена в блоке живёт до конца выполнения блока, но по факту "а" которая объявлена после блока не переписала "i" Что за бред? Ты вообще знаешь что такое блок? Давай, расскажи какие на пике есть блоки и какие переменные объявлены к каком блоке.
>>2340265 >Что за бред? Ты вообще знаешь что такое блок? Если ты не заметил, я читаю книгу для начинающих, поэтому если я чего-то не знаю, то в этом нет абсолютно ничего удивительного. В этой же книге я прочитал что блок это часть кода которая окружена фигурными скобками, а ещё я прочитал что в стандарте C99 концепцию блоков расширили и ими стали считать циклы и иф. Книга врёт, или может ты не увидел на скрине цикл for?
>>2340416 Кстати в этой книге много опечаток. Будь осторожнее. Помню тоже там было написано что блоки это конструкции ограниченные фигурными скобками. Но аноны выше пояснили тебе про неопределенность поведения
>>2340416 Последний раз посторяю, как написано, так программа и работает. Ты не ответил на вопрос, не перечислил блоки и объявленные в них переменные, значит не понимаешь что это такое. И книги тут ни при чем, книги не объясняют такую элементарщину уровня пикрил, это должно быть понятно любому здоровому человеку само по себе. Но не тебе, как видно.
Могу написать обявление функции signal(), чуть-чуть подглянув в signal.h и используя, как и положено, typedef: typedef void (*signalhandler)(int); signalhandler signal(int, signalhandler);
А как бы это объявление выглядело без использования typedef? У меня живой брат просит.
>>2340540 >В книге написано что блок это то что ограниченно фигурными скобками И? Ответа, что в реальном коде это означает, так и не нет. Написано-то написано, но не понято, читатель не смог прочитать написанное. Вот в чём суть, и книга тут уже бессильна.
>>2340438 Да, я знаю, там ошибки на каждом шагу, но что поделать, в ориге читать не удобно. >>2340526 >Ты не ответил на вопрос, не перечислил блоки и объявленные в них переменные, значит не понимаешь что это такое Нет, это означает что мне лень их перечислять. А нахуя? Я ведь сказал что блок это то что в фигурных скобках, этой информации должно было хватить, а если не хватило, значит видимо это с тобой что-то не так. Но ок, есть блок функции, в нём есть блок цикла, в блоке цикла есть подблок тела цикла. А про переменные я вообще хуй знает что ты хотел услышать, типа проверял на зрение или что? На скрине видно что в каком блоке объявлено.
>>2340913 >Нет, это означает что мне лень их перечислять. Уже настрочил пустопожнего пиздежа в 20 раз больше, а ответить напростой пвопрос по тексту "лень"? >А нахуя? Чтобы определить, прочитал написанное или не осилил. Народная мудрость "смотрит в книгу - видит вигу" как никогда актуальна и сегодня.
Всем доброго здоровья. Будьте добры, подскажите где можно посмотреть учебные или небольшие, но простые проекты для человека, который изучает программирование на языке си?
>>2341100 >пустопожнего пиздежа Ну давай, покажи что у меня тут было не по делу >прочитал написанное или не осилил А нахуя мне было задавать вопрос если бы я не прочитал? Ну вот теперь я тебе ответил, так что там у меня было бредового?
>>2341120 >Это начинающие прогеры так пишут? Нет, смотреть код начинающих программистов невозможно. 1) Они редко им делятся. 2) Он плохой. 3) Начинающие кодеры на Си вымирают.
>>2341118 >А нахуя мне было задавать вопрос если бы я не прочитал? Язык это протокол переджачи информации. Тект это язык. Чтение это восприятие читателем информации переданной написавшим. таким образом, воспроизведение написанных слов это не чтение, чтение это восприятие переданной информации. Не понят смысла написанного, значит не смог прочитать. Не ответил на вопрос по тексту, значит не понял смысла написанного - не смог прочитать. Неграмотный сброд.
>>2341183 >Не понят смысла написанного, значит не смог прочитать Не понял смысла написанного, значит не понял смысла написанного. Хватит нести хуйню. >Не ответил на вопрос по тексту, значит не понял смысла написанного Не ответил на вопрос по тексту, значит не захотел ответить, но уже захотел и давно ответил. Так что, долго ты будешь увиливать?
Эмм...ну вроде подучил я синтаксис списки структуры. Ну сделал я список свою идею тёлки которых я ебал их рост возраст и размер пизды. С выгрузкой этих данных в файл. Но.... это разве проект? Ну и типа конвертер величин но это вообще хз для чего....Куда применять полученные знания чтобы развивать навык программирования? В компах не шарю паять не умею роботов строить не знаю как. Это что и есть си? Просто списки делать и искать в них данные? Глянул идеи а там про какие-то сети подмаски контроллеры паяльник циферблаты. Я вообще даже близко не представляю что из себя технически представляют они... Крч я вообще растерян. Помогите... Наверное потому и спрашивают прежде чем учить язык должен сказать что ты хочешь. Но я не технарь вообще. Что вы пишите на си, скажите....
Пытаюсь в трифорс Надо переложить обратную пирамиду сверху - в низ, по кирпичику; начиная с верхнего слоя. Кирпичик хотелось бы выбирать рандомно. Как это можно сделать?
Сговнокодил примерно то, что мне надо на стейт машине (отрисовка анимации крутится в "треде" (таске), поэтому надо чтобы кадр (не вся анимация целиком) побыстрому отрисовался и задача ушла курить, уступив место другим).
Пока завис на проверке достижения нижней границы и занятости следующей ячейки при перемещении кирпичика.
Если у кого есть возможность взглянуть и помочь советом \ делом - спасибо.
>>2341183 > Не понят смысла написанного, значит не смог прочитать. ты что в семье психологов или философов родился? люто кринжую с твоих сообщений, человек спросить хочет, ты вместо того чтобы объяснить нормально начинаешь ему доказывать, что он какой-то долбаеб. У тебя дефицит внимания? или ПМС? > Неграмотный сброд. Мы уже поняли что ты тут самый умный, расслабься
>>2343409 Психология и философия имеют имидж умного, поэтому они раздражают тупых, вот как тебя. Никому не интересно, от чего у тебя бомбит, лучше на вопрос ответь. Перечисли >>2340091 какие есть блоки и какие переменные объявлены в каком.
Как лучше всего символьную таблицу у эльфа прочитать и в массив описывающих каждую запись структур оформить? И как вообще для начала смещение/размер таблицы узнать? В сырцы objdump/readelf неохота лезть пока, может есть какие-либо вызовы в библиотеке для этого.
>>2343409 Спасибо >>2343433 >Психология и философия имеют имидж умного Пока что ты сделал себе только имидж чела который старается казаться умным, говоря замысловатыми предложениями. То что ты сказал это хуйня какая-то. >от чего у тебя бомбит Так яростно как ты тут ещё никто не кукарекал >Перечисли 2340091 какие есть блоки и какие переменные объявлены в каком Уже было достаточно сказано, но ты проигнорировал. Ты так начал разговор, что напрямую отвечать никакого желания нет, так что либо поясни что у меня там было бредового, либо иди нахуй.
>>2344286 Хз что там в книге, но мне в системном довелось использовать: хэши и таблицы, списки, разные виды сортировок, деревья (rb, radix), бинарный хип, подсчет ссылок, разные формы распределения памяти и сборки мусора. Это БАЗА. О сущечтвовании потоковых/приблизительных алгоритмов тоже стоит знать.
Почему этот ваш Си ебаный такой? Наделал хуйнюшек для платформонезависимого fwrite/fread, а оно разные результаты отрыгаивает с разными флагами оптимизации, и все неправильные. Какие же вы конченные пидарасы все.
>>2344400 Короче, аноны, земля мне пухом. Я просто для чтения uint64 из конца файла делал fseek(file, 8, SEEK_END), а оффсет со знаком минус надо, лол.
>>2344442 Всмысле да? Я когда принтф вызываю, у меня сразу всё выводится. Понятно что в какой-то буфер для этого строка записывается, только в чём суть очищения буфера если принтф сразу выводит? То есть что в этом коде изменится если убрать ффлэш?
>>2344445 Там после printf сразу стоит sleep, программа падает в ступор, зависая на целую секунду, поэтому нужно форсировать вывод на экран до слипа. Попиши зависающие программы и поймешь зачем.
>>2344449 Да я знаю что такое буферизация, вопрос же не в этом. Я в книге прочитал что запись в любой файл производится после того как буфер который с ним связан до конца заполнится, но при этом я вижу что если просто выводить что-то на экран то всё выводится сразу, это стдаут какой-то особенный или что?
>>2344466 Как я могу задуматься о правильности если я не знаю что правильно а что нет? Я поэтому и задаю вопросы. То что я сказал про файлы это неправильно?
>>2344475 Понял, что написал? >>2344476 >То что я сказал про файлы это неправильно? Они могут иметь различные буферы. Просто запомни, смывай буфер, только когда тебе нужно обязательно что-то записать. В остальном, реальная точка входа в программу сама смоет stdout, stderr буферы, при корректном завершении программы.
>>2344493 >Понял, что написал? Я показал что хоть с флашем, хоть без него, строка будет выводится до слипа >Они могут иметь различные буферы Там было написано что это относится и к вводу и к выводу. Ну я сомневаюсь что это неправильно, потому что я и раньше слышал что с дисков читают сразу по 512 (или больше) байт в буфер, потому что они медленные. Хз, с стдаутом вопрос всё равно открыт получается.
>>2344576 >>2344493 >Просто запомни, смывай буфер, только когда тебе нужно обязательно что-то записать. В остальном, реальная точка входа в программу сама смоет stdout, stderr буферы, при корректном завершении программы.
>>2344612 Во-первых в том почему у того чела код написан так как будто принтф не сразу выводит (если он шиз то такой ответ тоже сойдёт), во-вторых почему в стдаут вывод не такой как в случае с другими файлами. Ну то есть понятно что это не диск поэтому там так и должно быть, но ведь и с стдаутом и с другими файлами работают одни и те же функции и они должны делать одно и то же.
>>2344633 Походу это у тебя буферизация, временная память какая-то. Что буферизация? Принтф выводит сразу, я это и так знаю, вопрос был в том почему у него написано что строка просто записывается в буфер (и не выводится пока не вызвать ффлаш). На счёт того почему вывод не такой же я тоже написал, на диск вывод идёт когда буфер заполняется до конца.
Ннагавнякал версталку текстовых файлов воедино спецом чтоб шоб уместить свой охуительный архиватор в два скрина и показать вам. Только заебался utils.h подгонять, две строки на предыдущий скрин все таки попали.
>>2344660 ОС несколько больше чем Windows. Даже среди nix -подобных куча реализаций с разным поведением. Стандарт С не гарантирует вывод, только наличие буферизации, остальное на усмотрение разработчиков стандартной библиотеки.
>>2344852 Да я рофлю, на кой хуй там хештаблица, тем более такая хардкорная. Это когда-то давно делал для реализации LZW.
Вот вам анончики, лучше, такая задачка. Передать stateful функцию, как аргумент qsort, например. Чтоб код функции мог ссылаться на переменные из локального скоупа. gcc позволяет делать пикрил, а clang не позволяет. Ну и еще это не универсальный вариант, потому что такой коллбек не получится куда-то назначить для позднейшего вызова. Она живет, пока живет скоуп, а с переписывание стеком пойдут по пизде не только используемые переменные, но и сам код функции. Короче, тот же qsort сам должен знать, что ей передать, а он знать не может. Все? Пиздец?
>>2344899 Заведи глобальный указатель на стейт. И заполняй его перед вызовом сортировки. Будет работать пока какой-нибудь мудак не передаст туда функцию сравнения, которая сама вызывает qsort.
>>2344899 Aлсо >с переписывание стеком пойдут по пизде не только используемые переменные, но и сам код функции >код функции чел? думаешь при входе в мейн рантайм компилирует твой callable, а при выходе стирает?
>>2344646 > Что буферизация? Принтф выводит сразу Нет, не сразу, он буферизирует. То, что твоя строка выводится сразу, не значит, что все строки во всех ситуациях на всех платформах выводятся сразу. Вывод у тебя сразу это лишь твоё случайное везение. Код, рассчитаный на везение - ненадежный код. По спецификации printf буферизирует, значит когда нужен незамедлительный вывод, нужно сбрасывать буфер, иначе у тебя говнокод.
>>2344997 С ошибками в коде это и есть правильные учебники. Ты должен понимать что там написано, а значит сам находить ошибки. Тупо же копипастя, ничему не научишься.
>>2344441 Если не оишабюсь, то буфыеризация происодит до тех пор, пока не встретится перенос на новую строку "\n". Можешь написать заведомо неправильный код и поиграть так с stderr, и увидеть, что если не выводить в конце '\n', то во время segfault сообщение не будет выводиться, а если добавить - будет.
Сап, котятки. Откопал свой первый комп и решил что хочу в качестве хобби раскурить графику под дос, ну и соответственно что-то поближе к земле железу. Не то чтобы игори сразу кодить, для начала пару софтин с графеном под собственные нужды. Учил Си в универе двадцать лет назад, лол, не то чтобы его там давали на уровне выше школьного паскаля, но нравился мне он своей прямотой уже тогда. Короче анончики, нужна литература для долбоёба из середины девяностых про Си по полной программе. Желательно на русском, а то туповат одновременно с ангельского переводить и эти ваши указальники понимать. Насоветуйте книг, добрые аноны, а с меня как всегда.
>>2345808 так, ты вообще иди нахуй, мне той твоей шизы хватило >>2345907 >The stdout and stderr functions are flushed whenever they are full or, if you are writing to a character device, after each library call
>>2345936 Собсна, какого хуя я вообще доказываю, самый простой и эффективный способ - запустить код и посмотреть, тем более что я даже кидал скрины с пруфами.
>>2345945 >Какой? ну это же ты мне тогда про буферизацию говорил? если нет значит не тебе >Ты не разобрался в ситуации, но думаешь, что разобрался в этом нет никакой информации, если я в чём-то не прав то лучше скажи в чём конкретно >почему ты по 1 реализации либси решил, что под окнами нет буферизации? Ну в идеале да, лучше сказать что в msvc это так работает, но я и в других местах видел такую формулировку, подумал, может есть какая-то зависимость от платформы и это в любых реализациях под винду так работает
>>2345963 Если пишешь под винду, так и пиши под винду, виндовыми вызовами. Свою строку форматируй в память по указателю, а готовую хоть прямо в видеопамять записывай. И не будет никаких гаданий по кофейной гуще мультимочи, буферы-хуюферы.
>>2346362 Мне не нужно было ничего писать, я просто хотел узнать как это работает >>2346486 Ну это явно не требование стандарта, потому что в реализации микрософта работает не так
Какие есть перспективы в ембеддед разработке ныне? Есть смысл перекатываться из стагнирующего и жутко перегретого рынка веба в ембеддед? Я вкатун, если что. Вышку почти закончил, информатика и вычислительная техника, что-то знаю про всякие триггеры, транзисторы, сумматоры, закон ома помню, но все очень поверхностно, так как никогда должного внимания электронике и схемотехнике не уделял - думал что буду веб манькой. Си знаю, многократно писал всякие лабы, в том числе под posix, с++ довольно поверхностно. Микроконтроллеры в руках ни разу не держал, паять не умею, с ардуиной и STM никогда не работал. Пользовался микрокапом и мультисимом в универе, хз, нужно ли это в ембеддеде.
>>2346989 Си тоже есть >>2347148 А как мне ещё задавать вопросы если их дохуя, еблан? Я тут предлагал с кем-нибудь перекатиться в тг например, под предлогом что тред засрется - мне сказали спрашивать здесь.
Я вкатун, прошу отнестись с пониманием к моему вопросу. Прочитал книгу и задался вопросом, а что дальше ? Ну я получил представление о языке, его синтаксисе, командах и т.д. А дальше что ? Просто открывая какой-то рандомный код, я нихуя не могу понять что в нем написано, не в плане команд операторов, а в плане указанных переменных и прочей хуеты. Или это значит, что я хуево все понял ?
>>2348081 >А дальше что ? А зачем ты учил язык? >Просто открывая какой-то рандомный код, я нихуя не могу понять что в нем написано Если это какой-то специфичный код, тем более без пояснений, ты не обязан понимать что он делает. А если это простой код, значит ты как-то не так учил.
>>2348186 > А зачем ты учил язык? Хотел разобраться в том, как малварь создают. > Если это какой-то специфичный код, тем более без пояснений, ты не обязан понимать что он делает. А если это простой код, значит ты как-то не так учил. Да, именно специфичный, там какой-то сервер был, нихуя не понял, куча каких то незнакомых библиотек и т.д.
>>2349986 Везде читаю что если переменная перечисляемого типа, то она может принимать только значения которые перечислены в определении enum, иначе выдаст ошибку. По факту присваиваю ей другое значение и никакой ошибки нет.
>>2350042 >Везде читаю что если переменная перечисляемого типа, то она может принимать только значения которые перечислены в определении enum, иначе выдаст ошибку Си и кресты не перепутал?
>>2350072 Ну тут же не приведение, а какой-то конкретный прикол перечисляемых типов. Но кажется я немного понял, там не ошибка должна быть а варн, но у меня нужные флаги не включены походу. Просто странно, зачем этот тип вообще нужен без варнов, можно же было просто сделать enum без всяких дескрипторов, чтоб обычные символические константы создавать и использовать их везде безотносительно типов.
>>2350075 >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
>>2350080 Да я не про это говорю, а про то что без предупреждений перечисляемые типы не нужны, они ничем не отличаются от обычных целочисленных вроде int.
>>2350107 Предупреждение это не язык, а лишь помощь программисту избегать ошибок. Чем тупее программист, тем больше ему нужно помощи чтобы не обосраться. Вот так, со временем количество предупреждений и увеличивается. Раньше предупреждений было мало, теперь стало много. Дрошло и до того, что некоторым без предупреждений вообще никак, не нужно. Достигли дна, наконец-то.
аноны, помогите. нужна библиотека для с. которая работает непосредственно с партишнами ext234, а конкретно например позволяет получать например незанятые или наоборот занятые блоки а так же мб записывать\считывать информацию из них. есть вообще что-то похожее?
>>2297526 (OP) Как сделать простое виндусятное окно для программы си? Можно ли совместить её с какой нибудь HiAsm? Они смогут обмениваться переменными?
Аноны, написал обработчик для файла .bin, все норм работает. Но у меня таких бинарных файлов 6,5 тысяч. Названия файлов просто пронумерованы 1.bin - 6573.bin. Как мне по очереди их обрабатывать, инкрементируя название файла? Надо ведь как-то в fopen() это делать?
>>2355889 >Содержание курса: >Введение >Блок 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.
>>2357219 Да просто задумался, а что если сделать так, и в итоге возник такой вопрос. Например ясно что он точно не по очереди их заменяет, потому что иначе всё заменилось бы на A и была бы ошибка (переопределение переменной). Интересно как он парсит.
>>2357579 Ну давай, ткни носом, где там ответ на "в каком порядке производится замена" или "как он парсит"? Я бы ничего не сказал если бы не это "гуглить не пробовал". Естественно блять пробовал, иначе не спрашивал бы.
>>2358272 боже блять какой же ты тупой >>2357375 мало того, что ты нихуя не гуглил, так ещё ссылку кинули и ты её даже сука не открывал, зато сидит самый умный, без ответа мля
>>2352260 Спасибо за мысль, не знал по какому запросу искать клуб таких некрофилов как я, лол!
Вопрос в догонку. Вот ковыряю сейчас один древний гайд по моей теме и там чувак определяет тип структуры таким кодом
typedef struct tagBITMAP / the structure for a bitmap. / { тут всякие кишки } BITMAP;
и потом объявляет переменные везде по коду через BITMAP, а tagBITMAP вообще нигде не использует. Почему не второй? Гайды говорят что после объявления структуры пишутся имена переменных жы? Зойчем тогда вообще первое имя?
>>2358693 у тебя всё, что нужно получения ответа, уже есть для умственно-отсталых яумамывкатунов: берёшь файлик с кодом, прокатываешь через препроцессор, смотришь, чё получилось. у тебя два дефайна, чё останется- то и заменяется последним.
Если опять мясу в твоей черепной коробке это слишком сложно, гугли инфу по рекурсивным дефайнам и то, как они обрабатываются си.
Для совсем дегенератов ебаных: у тебя "А" превращается в "А", а "B" - в "B". порядок выполнения подстановок тут оказывает серьёзное влияние на целое нихуя
>>2358733 Ты тупой еблан и продолжаешь это доказывать, потому что ВСЁ ЕЩЁ не понимаешь. >чё останется- то и заменяется последним Меня ебёт что заменяется последним? Кто вообще про это спрашивал? Что останется я и так могу понять, просто принтанув A или B. >гугли инфу Точно, именно это мне и было нужно если я сюда написал, без тебя бы не догадался никак >порядок выполнения подстановок тут оказывает серьёзное влияние на целое нихуя Опять же, кто про это спрашивал? Меня это абсолютно не ебёт. Можешь больше не отвечать, помочь ты не можешь всё равно, хотя помощь от такой гниды как ты мне в любом случае не нужна
Привет аноны, я нюфаг, взялся написать свою первую змейку, сижу на линуксе и не могу найти нормальный способ описать код так, чтобы змейка продолжала движение пока не нажата снова клавиша какая-нибудь. По гуглу будто одни костыли через termios.h, в под винду всего лишь одной функцией khbib() решается. Неужели ничего нового не придумали под линукс?
>>2358875 >Бля это не ты на днях в цпп треде 50 постов на оператор += наматывался? Нет, хз о чём ты >крыл всех хуями Я не крыл до определённого момента, когда чел начал попусту выёбываться И конечно я ничего не требовал, просто спросил
>>2358733 > Вроде достаточно подробно расписано Я на ту же статью вчера в гугле наткнулся, лол, и она не объясняет. Но уже в следующем листинге тот чувак пишет без первого имени вообще, так что думаю это чисто косметическая поебень и всё работает и так. Спасибо, анон.
>>2358733 > Вроде достаточно подробно расписано Я на ту же статью вчера в гугле наткнулся, лол, и она не объясняет. Но уже в следующем листинге тот чувак пишет без первого имени вообще, так что думаю это чисто косметическая поебень и всё работает и так. Спасибо, анон.
Кто сталкивался со Столяровым? Нормальный у него учебник? цитата например
К сожалению, я вынужден сейчас сказать вам ещё одну не очень приятную вещь. Далеко не каждый человек может стать программистом, и дело здесь не в уровне интеллекта или каких-то там «способностях», а в том, каковы ваши индивидуальные склонности. Программирование — это очень тяжёлая работа, требующая предельного интеллектуального напряжения, и выдержать эту пытку могут лишь те сравнительно редкие извращенцы, которые способны от процесса создания компьютерных программ получать удовольствие. Вполне возможно, что в ходе изучения этой книги вы поймёте, что программирование — это «не ваше»; ничего страшного, в мире есть много других хороших профессий. Если моя книга «всего лишь» позволит вам вовремя понять, что это не ваш путь, и не тратить лучшие годы жизни на бесплодные попытки учиться в ВУЗе по какой-нибудь программистской специальности — что же, это само по себе немало: лучшие годы, потраченные впустую, вам потом никто не вернёт, и чем раньше вы поймёте, что вам нужно (точнее, не нужно), тем лучше.
С учётом сказанного выстраивается довольно однозначная цепочка языков для начального обучения: Паскаль, язык ассемблера, Си. В эту цепочку практически в любом месте можно что-нибудь добавитьь но ни убирать из неё элементы, ни переставлять их местамиь судя по всему, нельзя. Зная Си, можно вернуться к изучению явления, именуемого операционной системой, и её возможностей с точки зрения программиста
Итак, если иметь в виду в будущем изучение Си, то предварительно нужно освоить какой-то язык, в котором а) есть указателиь причём в полный рост, без всякой сборки мусора; б) без указателей можно обходиться, пока обучаемый не окажется более-менее готов к их восприятию; и в) начав использовать указателиь обучаемый расширит свои возможностиь то есть в указателях должна быть реальная потребность.
согласно второму дефайну #define A B превращается в #define A A, который дальше уже не обрабатывается во избежание рекурсии аналогично со вторым дефайном
>>2361603 Ну чел, он действующий препод в мгу. Как ты думаешь сам? Конечно стоит время потратить, тем более что если в инглиш не можешь, переводы читать - с ума сойти можно. А тут максимально локализировано всё. p.s. видосы на ютубе у него шиза полная
Всем сап, вопрос от неуча. Недавно для себя открыл тот факт, что вышла Raspbian OS 64-bit. Если я установлю на малинку 64-битную ос, то сишные библиотеки для доступа к GPIO, по типу WiringPi и BCM2835 будут работать? Они ведь создавались еще на 32-битных осях и создатели. В инете годной инфы нема, видимо, потому что новая ОС вышла не так давно, а я не тру хацкер чтобы самому допереть до этого.
>>2297526 (OP) Хз куда спросить, с радача с таким вопросом прогнали. В общем, учу FreeRTOS.
структура моей программы такова:
main.c: LED_Task TimerTask CanTask
Ну и несколько файлов в которых Init, которые вызываются из main() и IRQ, в лучших традициях bare-metal: timer.c uart.c can.c и прочее...
Есть несколько вопросов: 1. Правильно ли так закладывать структуру? 2. Стоит ли делать Семафоры\Мьютексы и прочие примитивы глобальными, чтобы каждое прерывание могло им спокойно пользоваться, если оно нужно в другом файле?
>>2357131 Один из самых заебатых вопросов на собеседовании, которым тимлид тешит свое раздутое ЧСВ.
Еще не хватает:
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. Найдите все ошибки в данном коде на этой распечатке. -Какого плана? Синтаксические тоже? Или только алгоритмичексие? -Да тут и синтаксические и алгоритмические, долбоебические (кхе-хе) Еще никто все не нашел, насколько помним.
>>2364217 >e = a b ^ c+++ / d; e = a ✱ b ^ c+++ / d; >(int ✱ const)(0x1234) = 0xcaba; ✱(int ✱ const)(0x1234) = 0xcaba;
звездочки сожрались
>Такой хуйни можно тонну нагенерировать, проверить на компиляторах, и ебать людям мозг, вместо того чтобы проверять. вместо того чтобы проверять реальные знания.
Есть структура, инициализирующая поля экземпляров исходя из наборов разных констант. Первое, что пришло в голову, это задать для каждого набора констант по массиву, в каждом из которых индексом будет номер конкретного профиля структуры, т.е.
>>2365290 >хранить Зачем тратить время на обращения к базам, когда данные константные? >пациентов Он ничего не говорил про пациентов и реальный проект. >в сишных массивах Что плохого? >Чтобы тебя так в больнице лечили. Это проклятие?
Да, да многие сейчас скажут, что это нужна потому что потому на этом легче разрабатывать хуйню для Гугл и Эпол. Но в этом и проблема. Что это было сделано не как дополнение, а как замещение, чтобы позаниматься саморекламой. Это не C++ над C.
То же самое сделали Apple с Flash`ем, чтобы поаутофеллировать.
>>2366790 Это ты не в тот тред, макака. Но я понимаю, трудно бороться с тягой залезть в ситред, даже если он тебя не касается. Тяга грязных чуханов к свету так же естественна как мухота собирается вокруг лампочки. Вот и вылязят из своих помоев и ползут, сползаются к настоящему языку настоящего программирования. И сколько ни отрицай на словах, в душе истина неизменна, ведь истина это сама реальность которую не слепишь из слов, только ложь.
>>2366871 >а весомый какой-нибудь. Забей хуй на структуру, всем похуй и формируют так, как им удобнее, язык не задает ее явно, значит любая правильная.
>>2364079 >2. Стоит ли делать Семафоры\Мьютексы и прочие примитивы глобальными, чтобы каждое прерывание могло им спокойно пользоваться, если оно нужно в другом файле? Чел. Мутекс защищает определенный ресурс. Если этот ресурс нужен прям всем, лучше экспортируй функции, которые берут мутекс и работают с ресурсом.
Если я не хочу пользоваться sql, xml или другой сторонней разметкой, нормально ли хранить табличные данные в файлах вида "один файл - один столбец"? Что нужно знать при этом про кодировку и разделители?
>>2367357 >Кодировка только utf-8 Тыскозал? Еще в zip запакуй, дятел, больше кодировок богу кодировок. utf16 - вперед, как загрузил, так и пользуешься, так же и записал, никаких говнобиблиотек и говноконверсий.
>>2367722 wchar_t, или, для тупых ебалаев, wide char, юникодные символы нативные для системы, а значит не требующие ничего, бери и пользуйся, а не лепи макакины говнопрокладки на пустом месте.
>>2368310 >пук Настоящее лицо прокладочной макаки. Пара простых ответов и попытки косплеить человека испарились без следа уступив законное место нативному хрюканью.
Привет, бородатые. Тяжело ли вкатиться в коммерческую разработку на Си без ВО? Уже 2 года работаю java макакой, но, сука, тянет на самые низкие уровни. Где в РФ сейчас пишут на Си?
Сап, ананасы, некрофил-нубас на проводе. Продолжаю ковыряться в коде под досом, точнее Borland C 3.1. Поясните как прицепить внешний obj.
Книга, по которой я пытаюсь ебаться с ассемблером/сёй не считает нужным разжёвывать такие нубские вопросы. Вот листинг процедуры хелловорлда на MASM, вот сишный листинг — дальше сами. В asm лежит процедура, которая должна вызываться из сишного кода. Из асма я хуярю обж, но ся при компилировании матерится что линкер не нашёл эту самую процедуру. Куда читать, что делать, ананасы? Выручайте.
>>2369028 Как и везде думаю - разработка драйверов/ядра/прочего говна для ОС. Вакансий сравнительно мало, но и поток людей туда не очень большой, так что устроиться можно.
Правда вместе с С придется учить ассемблер и как работает ОС "под капотом". За месяц-два можно спокойно вкатиться
>>2374466 С учётом сказанного выстраивается довольно однозначная цепочка языков для начального обучения: Паскаль, язык ассемблера, Си. В эту цепочку практически в любом месте можно что-нибудь добавитьь но ни убирать из неё элементы, ни переставлять их местамиь судя по всему, нельзя. Зная Си, можно вернуться к изучению явления, именуемого операционной системой, и её возможностей с точки зрения программиста
Итак, если иметь в виду в будущем изучение Си, то предварительно нужно освоить какой-то язык, в котором а) есть указателиь причём в полный рост, без всякой сборки мусора; б) без указателей можно обходиться, пока обучаемый не окажется более-менее готов к их восприятию; и в) начав использовать указателиь обучаемый расширит свои возможностиь то есть в указателях должна быть реальная потребность.
>>2358808 Тебе для начала необходимо понять саму концепцию движения. Все этот работает в бесконечном цикле, условно while(1), потом ты должен это выполнение как-либо задерживать, либо через for(что реалтно только для мк), либо как человек через sleep и отлавливать либо нажатие кнопки, либо сделать такой слип, который сам постоянно проверяет нажатие кнопки. Я просто как делал так и обьяснил сейчас.
>>2375685 Привет. С этим разобрался) Теперь непонятки с тем, как программа должна запоминать предыдущие координаты змейки, чтобы если змея свой хвост укусит, то игра закончилась
>>2376125 Смотри, я делал через миссив структуры координат x,y,prevx,prevy. У меня сначала смещалась голова, а потом я записывал данные в prevx,prevy и изменял x,y относительно смещения гловы. Те примерно так: записываем x,y в prevx,prevy головы и потом по каждой другой части тела повторяем тоже самое, записываем x,y в prevx,prevy и меняем x,y на prevx,prevy предка, те по факту i-1, где i индекс части тела
>curses >фреймворк >ебаться вручную с tty/termios/ioctl и читать клавиатуру/мышь из /dev/input/event (или делать что-то наверняка ещё более ебанутое на винде) вместо использования удобного решения, дарованного нам дедами
>getch блокирующий, говнокод не работает!!! >nodelay(stdscr, 1)
Но стрелочки он правда не осилил. Ну или ему так просто привычнее.
>>2379492 >>2379492 >>не проверять malloc на возврат NULL Вот кстати поясните плес. Допустим, я смотрю ютуб, слушаю музыку, открыл 100 вкладок в хроме и одновременно запускаю свой хеловорд на 1 кб динамической памяти, в котором нет такой проверки. Какова вероятность, что система мне не даст одного килобайта?
>>2379492 >>ебаться вручную с tty/termios/ioctl и читать клавиатуру/мышь из /dev/input/event (или делать что-то наверняка ещё более ебанутое на винде) вместо использования удобного решения, дарованного нам дедами Ситред 2022 итоги, пикрил.
С графикой ебаться неохота, с управлением неохота. Установи Юнити, нарисуй свою змейку мышкой и не еби мозг. Зачем в данный тред пришел?
>>2381050 Не толсто, я ньюфаг. Скачал швитую приложуху для новостей и мемов, чтобы следить за мировой культурой, а там одно говно. Я думал это что то хотя бы типа хабра. Впрочем нашел пару интересных каналов, но они не про си.
>>2380620 Я-то лично согласен с тобой, сам пытался писать tui-либу типа curses, правда на Go, просто здесь мотивация писавшего код тоже имеет значение. Может он либу саму хочет освоить, а как это работает под капотом ему неинтересно.
>>2381430 Лезть в Си, но игнорировать что под капотом это бессмыслица. Си это не алгоритмический язык, в мысле, если писать аогоримы, не отличается от любого другого языка, и даже хуже их, ибо мешает своими низкоуровневыми подставами. Ведь для тебя подставы, раз не хочешь этим заниматься. Ты пришел не по адресу, иди в тот же шарп, выглядит похоже, но меньше мешающей хуйниб отвлекающей от твоих алгоритмов. Циклы, условия, массивы, списки, функции, вот всё это в шарпе куда логичнее и удобнее Си, у которого лишь кривой сахарок над низкоуровневостью который поломать раз плюнуть, у тебя только жопа будет гореть.
>>2381700 Я не очень понимаю, почему ты приписываешь мне такие странные мотивации и обращаешься ко мне, будто я являюсь автором поста со змейкой, пишу на Си в описываемой тобой манере и в чём-то с тобой не согласен. Внимательнее перечитай сообщения.
>>2382039 Я не понимаю зачем идентифицировать пользователей анонимного форума, который специально сделан анонимным чтобы этой хуетой не страдали, а общались по сути вопроса.
Какая разница, кто там со змейкой пришел или ушел, если конкретно ты, к кому я обращаюсь, такая же макака которой Си не нужен, а нужно лишь бы попроще на готовом. Ты не туда зашел, популярно же объяснил >>2381700 Что неясно?
Это кретинское лицемерие залезть в Си, но отвергать то чем является Си, пытаясь его использовать как алгоритмический скрипт, для которых есть языки специальные, куда лучше чем Си, которые не для этого предназначен, тупо алгоритмы на готовом шлепать. Си это лоулевел, кишки, железо, а не абстрактные скрипты в сферическом вакууме чистой логики, обмазанные черными ящиками фреймворков которые сами делают "заебись", а кодеру похуй.
>>2382075 Чувак, успокойся. Иди проспись, выпей свои таблетки или просто забей на эту дискуссию, потому что те рвение и агрессия, с которыми ты пытаешься приписать мне качества и мотивации, которых у меня нет, и дать мне объяснения, в которых я не нуждаюсь, выглядят уже совсем ненормально.
>>2382395 Дружно сделаем вид, что ты сам написал что-то более осмысленное и по сути треда. Преисполнись уже до конца своей борьбой с абстракциями и начни писать на машинном коде.
>>2382600 Я подозревал, что у кого-то могут быть интенции, отличные от бесполезного пердолинга. Но долбоёб выше сказал, что абстракции и "фреймворки" не нужны, а значит каждый должен написать свою библиотеку для решения стандартной задачи.
>>2297526 (OP) Приветствую всех в этом чатике. Надеюсь у вас здесь достаточно лампово. Не против, если здесь немного посижу с вами? Тред пока не читал, планирую откиснуть в АСМе на какое-то время, потом сюда, забронирую пока здесь местечко.
>>2385768 >>2385779 Только сегодня видел вакансий 4-5 из около 400 только по СПб. Одни СУБД разрабатывают, другие какое-то сетевое ПО, третьи игровой движок. Кидать ссылки я, конечно, не буду.
На проходящей в эти дни конференции Open-Source Summit 2022 в секции ответов на вопросы Линус Торвальдс упомянул о возможности скорой интеграции в ядро Linux компонентов для разработки драйверов устройств на языке Rust. Не исключается, что патчи с поддержкой Rust будут приняты в ближайшем окне приёма изменений, формирующем состав ядра 5.20, намеченного на конец сентября. Запрос на включение изменений в ядро ещё не был отправлен Торвальдсу, но набор патчей прошёл дополнительное рецензирование, избавлен от основных замечаний, уже достаточно давно тестируется в ветке linux-next и доведён до состояния, пригодного для создания слоёв абстракции над подсистемами ядра, написания драйверов и модулей.
Мой вопрос: стоит ли теперь вкатываться в embedded c в linux?
>>2386166 Да. Даже если Раст окажется полной заменой С (что вряд-ли), то на это уйдет много времени. Тем более что зная embedded C, можно будет если что легко пересесть на такой же Раст.
Если жепа паникует, никто не мешает учить и то и то
>>2386166 >интеграции в ядро Linux компонентов для разработки драйверов устройств на языке Rust Интересно, когда появится первый, не переписанный на раст, драйвер?
Если переменная = sizeof(void ), это мне гарантирует свободную адресную арифметику по ней? Допустим, беру size_t и кручу-верчу его. Потом загоняю обратно в void . Всё будет в порядке? Нету там каких-нибудь скрытых сегментов за пределом 4...8 байт?
>>2297526 (OP) >Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) >"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Дайте список подобной литературы, также особенно дайте годных мемуаров, документальных драм, бородатых баек и т.п. необязательно про Си
>>2386388 >Допустим, беру size_t и кручу-верчу его. Если размера хватит, то все будет хорошо. >Нету там каких-нибудь скрытых сегментов за пределом 4...8 байт? Диапазон стандартом не установлен.
Есть массив mask, это просто массив данных карты, который не хочется выносить из структуры. Как-то не то выйдет, если сначала создать объект map со всеми характеристиками, обращаться к ним как map.lenght и одновременно иметь отдельный массив с данными этой карты, инициализированный где-то в main. Что можно сделать?
>>2386866 Я хочу чтобы у меня был объект map структуры maps, к которому я бы смог обращаться как map.mask[4][12]. Как так сделать? Создавать в мейне отдельный массив char mask[][] не хочется, потому что он будет отделен от объекта map.
>>2386888 Я хочу перед запуском игры в настройках менять размер карты и поэтому там придется ставить переменные. Но это запрещено. Как это исправить? Это же не должно ничего ломать, если объект структуры maps создавать после инициализации всех нужных переменных?
>>2386895 Наверное с её помощью можно сделать, но нет способа попроще? Мне же не нужно менять размер карты в ходе игры. Нужно менять только 1 раз до старта в настройках. Всё равно что define перед запуском поменять.
>>2386896 >нет способа попроще? Это самый простой. >1 раз до старта в настройках В каких настройках? >define Это константы, которые Си-код не может менять.
>>2386902 >В каких настройках? Которые я потом сделаю. Сейчас там просто значения переменной. >Это константы, которые Си-код не может менять. Я просто привел пример. Я хочу не залазить постоянно в код, чтобы #define lenght 30 поменять на #define lenght 50 , а хочу в красивом меню написать цифру 50. >Это самый простой. Почему нельзя в момент создания объекта структуры задать размер массива mask? Память же выделяется, когда ты пишешь struct maps map, а не когда просто объявляешь структуру. Это должен быть самый простой способ
>>2386917 >создания объекта >struct maps map Это не создание объекта. >Память же выделяется, когда ты пишешь Она может выделиться когда угодно, главное, чтобы в момент выполнения этого кода она была.
>>2386917 >Я хочу не залазить постоянно в код, чтобы #define lenght 30 поменять на #define lenght 50 , а хочу в красивом меню написать цифру 50. #define maxlength 10000, а пользоваться в пределах значения length структуры.
>>2386816 Это абсурдный код. Структура определяется объявлением, ты не можешь объявить одну структуру, а потом наплодить из неё разных структур лишь присваивая значения полям.
Думаю, ноги этой шизофазии растут из непонимания что такое компиляция, нативный код, долбоебом привыкшим к скриптовой динамикопараше.
Объясните, пожалуйста, почему результат функций и проверок в си выдаёт 1 как удачный, а во взаимодействии между программами и в ос 1 - это наоборот, ошибка? Почему это не унифицировали?
>>2388500 >прочитал хуйню нихуя не понял Функции в Си здорового человека должны возвращать -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; }
>>2388500 Что и кто должен унифицировать? Разработчики компиляторов? Или те, кто стандарт выкатывают? Это вопрос конвенции, принятой в конкретном ПО на любом языке, не обязательно на Си. 228 будут возвращать on success, если захотят, и ничего ты им не скажешь.
Гарантируется ли, что все поля структуры идут сразу друг за другом, не считая выравнивания, т.е. что в неиспользованные промежутки ничего не запишется? Могут ли в эти промежутки записаться другие данные?
>>2391984 Сам нашёл. Просто добавь --verbose Покроссконпелировал, нахуй, ебать, ваш сишный мирок убог, пиздец. Конпелятор решил, что эта инклуда - не инклуда, заебок. Как вы с этим живёте, вообще?
>>2397776 Ошибаешься, я о макаке залезшей в си не зная что такое байт, и еще код пишет.
>sizeof здесь просто лишний Лишнего ничего нет, код полностью функционально полноценен, показывает что этому индусу в си не место. Потому что это не проблема кода, а проблема самого человека, дефективного способа мышления.
>>2397836 Борцун с библиотеками, ты? Узнал тебя по твоим шизоидным высерам. Дефективность твоего мышления мы ранее уже выяснили, уж не тебе точно об этом судить.
Как правильно оформить суперминималистичную документацию для хеловорд библиотэки? Надо определить требования по аргументам, использованию возвращаемых значений, доступу к полям структур и т.д. и собрать где-то в одном месте, чтобы было красивенько, в комментариях не вариант. Как делают такое?
Что правильно (или лучше) делать, когда нужно получить несколько значений (в общем случае - разных типов) от функции? Запаковать в структуру на хипе и через указатель возвращать её с последующим высвобождением памяти в вызывающем коде? Звучит по-уебански, но ничего лучше я не придумол
>>2404149 можешь через аргументы ебануть. объявил переменные вне функции, сам решил стек или хип, передал их указатели в функцию, функция по этим указателям все заполнила и вернула какой-то код (ошибка, либо все ок).
>>2404149 Структуру размером два слова почти все возвращают эффективно (на регистрах). Если больше, то передай указатель на локальный массив или структуру. Если совсем большая, выделяй в хипе.
Тут пока смотрел видео на Ютубе, попался видос про паттерны. И теперь у меня вопрос - а в любимой сишечке есть какие-то гайды про то как стоит/не стоит строить приложение в целом и почему? Пока нашел только книжку Patterns in C adam Thornhill Но она платная.
Хелло байтаны, извините за глупый нубский вопрос, кто из вас знаком с gdb и отладкой в нем кода - каким образом случился переход со строки 2204 (1787 к store_get отношения не имеет, там начало зацикленного блока кода)? Плюс/минус первый раз взял в руки этот отладчик, прижало вкурить как exim парсит несколько специфических DKIM заголовков и чет приуныл
>>2406406 Выглядит как то, что исходник поменялся а бинарник остался тем-же. Попробуй там перекомпилить и запустить или lldb или что ещё использовать, если не починится
>>2406406 На всякий случай пересобрал без оптимизаций, но все равно такой же прыжок там после присвоений/обнулений еще куча if блоков, должны же они были проверится?((
>>2406406 >>2406475 >>2406482 В общем отказался от идеи собрать из src.rpm что безусловно было бы удобно - бахнул rpmbuild и вот тебе на выходе и бинарный пакетик, и debuginfo, и всем этим можно жонглировать пакетным менеджером в пользу старого доброго git-а + make + install. Пришлось конечно поприседать с ручной установкой зависимостей, путями/конфигами, но зато удалось добиться нормального поведения в отладчике - на этом все, спасибо помогавшему анону
>>2386166 Зачем эта параша нужна, когда у тебя системная параша будет вся в unsafe'ах, а пруфать ты нихуя не будешь, история с раст белтом просто охуенно показательна.
Заранее прошу прощения, если несу хуйню и путаюсь в терминологии, хотя вроде не должен. Приму конструктивную критику и пойду курить дальше.
Пишу свой двухколёсный дебаггер. Вот есть процесс, ему соответствует программа и слинкованные с ней в рантайме библиотеки (libc, ld и прочее); сегменты программы загружены в выделенную процессу память, библиотеки отображены и я всю эту красоту могу наблюдать в /proc/{pid}/maps. Всё, что мне нужно сделать, это найти запись в таблице символов файла программы/библиотеки по адресу вызванной функции. Я парсю инфу о сегментах из /proc/{pid}/maps, смотрю, какой сегмент соответствует адресу функции и для соответствующего имени файла с помощью libelf подгружаю нужные мне заголовки. Дальше это работает так: https://pastebin.com/0rLUpUWF (код сырой; на данном этапе нужно было, чтобы это просто работало) data содержит маппинг файла программы/библиотеки, addr = адрес_функции - адрес_сегмента. Для самого executable код вроде работает, но не для слинкованных с ним либ. Что я упускаю?
>>2408399 Короче правой кнопкой щелкни получившийся файл, нажми в выпадающем меню кнопку Переименовать. Способ удобен тем что ты можешь назвать файл как ты захочешь и когда захочешь, этих даунов не слушай, они промыты пропагандой командной строки, будущее за графическим интерфейсом.
>>2412058 А мне нравятся его теперешние стримы, особенно по templeOS, да и сам он чел крутой. Правда в хохлошизу ударился поле 24, но это ничего страшного.
>>2297526 (OP) Анчоусы, как вообще грамотно переводится "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..."
Привет, Анон. Мне очень нравится "низкоуровневое" программирование, нравится С, нравится изучать операционки и всё что связано с сетью.
Но я не могу для себя понять, какова область применения у языка в целом и какие существуют вакансии в реальном мире в этой области? Может вы что-то подскажите, отталкиваясь от интересов, которые указал выше, куда мне стоит двигаться и как искать что-то подобное в плане работы? Заранее благодарю.
>>2417684 >какова область применения у языка в целом и какие существуют вакансии в реальном мире в этой области Никаких, ты умрешь с голода, если будель писать на Си. >>2417684 >куда мне стоит двигаться и как искать что-то подобное в плане работы? Пробовать вкатиться в ОС проекты, а после пилить деньги с пожертвований крупных корпораций.
Хелпаните по сокетам. Есть несколько адресов и один порт. На все это дело шлется udp инфа с сервера, и есть клиент который читает данные с этих сокетов каждый в отдельном треде Че я делаю: создаю для каждого треда отдельный сокет, ставлю setsockopt опцию реюза для порта, бинжу адрес INADDR_ANY и моим портом, потом ставлю setsockopt опцию с адресом уже конкретным Собсно я че то не так делаю или в логике какая то проблема? Потому что у меня каждый тред читает все адреса вместо одного конкретного
Анон, вкатился в эмбедед, пытаюсь ковырять байты, вкатываюсь в RTOS потихоньку. Но щас понимаю что вообще почти ничего не знаю о компиляции. Даже простой мейкфайл наверное не смогу сделать, а тут еще и диплом по графам потока управления дали. Где лучше почитать инфу про все это чтоб вкатиться? Есть книги какие или источники мб?
Объясните пожалуйста. Вот есть сортировка слиянием, на этапе когда нужно найти середину массива имеется формула m=l+(r-l)/2. Но не пойму, почему не просто m=(r-l)/2? Зачем +l еще?
такой вопрос. когда начался курс ооп на плюсах попался не самый требовательный препод (на похуй вела в принципе, но чето рассказывала). но вопрос сишный короче запомнил от неё, что для размеров массива лучше всегда использовать size_t, звучит разумно. точно формулировку не помню, но как-то все это перешло в то, что я почти год писал циклы for используя size_t(for (size_t i = 0...blabla) только сегодня услышал, что не рекомендуется использовать беззнаковый тип в условии цикла фор (при size = 10: size_t i =0; i < size - 11... будет бесконечный цикл из-за переполнения) , но источник тоже так себе(видос на ютубе - отрывок со стрима)
так вот, всё таки че использовать в цикле, тупо int? выгдядит как то хз для размера массива вроде size_t нигде плохо не влияет
если переменная в функции не меняется, внутри какой нибудь принт или просто обработка значений, то нужно ли явно в сигнатуре прописывать, что переменная const? является ли это хорошим тоном или же загромождает код
>>2422365 и что это значит? вопрос про любой стандартный обход с нуля до значения какой то переменной, а не вырожденный случай. действительно ли плохо i делать беззнаковым или это сильно редко приводит к ошибкам
>>2422389 Это не хороший тон. А очень хорошая практика, и её нужно использовать всегда. Во-первых, это обезопасит твой код от случайных и нарочных выстрелов в ногу. Во-вторых, покажет пользователю функции что она никак не изменит переменную, а следовательно безопасна на чтение, ну если у тебя в нескольких потоках идет работа. Ну и в третьих расширит применение твоей функции, ведь её можно будет вызывать как для волатильных переменных так и для константных Ну и один спецификатор в 5 букв. Как это загромождать что то может
>>2422389 Если оно не меняется, это константа. const можешь навесить, если внутренний голос подсказывает тебе, что какой-нибудь долбоеб, не разрбравшись в 100 строках макарон с goto, рано или поздно присвоет твоему pi новое значение. В остальных случаях это сомнительная практика.
>>2422391 У тя массив или заведомо маленький (< 30000) или нет. В первом случае можешь брать инт. Во втором что-то большее, что подходит: for (long l = bigsize; --l >= 0; )
>>2417684 Одна из областей - стык железа и софта. Например, как уже сказали, драйвера. Сегодня появляется дохрена новых китайских процессоров, дрова к которым пишут китайцы очень плохо, и для использования в реальных проектах их придется переделывать. Другая облать - программирование микроконтроллеров: IoT, промышленные изделия. Бортовые: автомобильные и не-авто (и тут запросто прилипнешь к воякам, а платят они не оч). Промка: как умная с современными протоколами по типу iec61850, так и тупая с одним rtu-modbus, например мегаваттные приводы. Рядом с приводами - контроллеры преобразователей энергии, например контроллеры заряда-разряда батарей мощностью опять же в районе мегаватта.
>>2421979 Так-то есть ещё и знаковый, ssize_t, но >i < size - 11 11 - уже волшебное значение, которых лучше вообще не пользовать в коде.
int - самый быстрый тип. Для небольших массивов - самое то. Или байтоебствуй, используй типы явного размера из <stdint.h> типа int64_t, чтобы не стрельнуть себе в ногу как >>2423734 забыв что на x86_64 sizeof(long)==sizeof(int) и указатель в них не лезет
>>2425949 >забыв что на x86_64 sizeof(long)==sizeof(int) и указатель в них не лезет Я линуксоид, у нас сделано правильно. На вин строго посрать, там все и так работает через ж, даже если обмазать int64_t.
Не смог нагуглить решение проблемы: Есть некая функция abcdef. Она может быть в зависимости от флагов компиляции как функцией из библиотеки, так и просто макросом, который ничего не вызывает. Собственно, можно как-то определить, чем является abcdef во время компиляции, не имея доступ к флагам компилятора? Зачем это мне - захотел применить указатель на функцию abcdef в моей структуре (когда она определена как функция из библиотеки). Тип в структуре - указатель на void, конечно же.
Аноны, я решил не вкатываться в С, простите меня пожалуйста. К сожалению так и не смог подыскать для себя подходящий язык. Раст пробовал, карбон можно и не пробовать в 2к22.
Хорошие новости в том, что достаточно много интересных областей, в которых интересно бы покопаться. Поживём увидим. Буду заглядывать к вам иногда, чтобы поглядеть на вырвиглазный синтаксис, но вы всё равно молодцы, важное дело делаете, нет ничего лучше старого, доброго С.
>>2431964 Алгоритмы подсчета количества символов зависят от типа кодировки, для переменных свои алгоритмы, а для постоянных просто делением размера массива на размер символа.
Про printf %ls, насколько я помню он пребразует широкую в стандартную кодировку и может потерять смысл.
Вчера написала хр-юша с вакансией embedded разработка на С нахой.
На похуях залетел на собес, директором попиздел. Нужно писать софт для сетевого оборудования. Стек крайне примитивен Linux+C+Git+твой любимый редактор. Позадавал вопросы по теории сетей, по линуху и по Си.
Сегодня хр-юша пишет что хотят ещё на одно тех собеседование пригласить, сказал что завтра смогу.
Вот вопросы: 1. Что нужно знать для этой работы? Я бля на си пишу скрипты в Loadrunner и то, это примитивные скрипты.
2. Насколько сложная работа?
3. Смогу ли я совмещать две работы? Если и текущая и то что мне предлагают являются удаленками
Анончики помогите плиз!
Я даже тред в /b сделал но там никто не пишет. Решил сюда залететь
>>2436613 Чтобы во время компиляции проверить, что ты нигде не проебался и правильные типы используешь
прикладное vs 49системное программирование
Аноним17/08/22 Срд 15:38:32№24371541123
Привет! У меня кризис.
Я изучал js и научился писать программы в том числе и с бэкэндом, распологать их на сервере(арендованном), чуть чуть питон поизучал - могу собрать собрать что-то по библиотекам.
И вдруг я "понял" что это "ненастоящее" программирование - это натягивание интерфейса и логики на бизнесс идею из реальной жизни, я имею ввиду что написание приложений на мой взгляд сохранение и сортировка информации ее отображение, поэтому я посмотрел в сторону системного программирования.
Но я даже не понимаю как подлезть к системному программированию, мне посоветовали изучить ядро (естественно linux) а потом читать документацию к железу и например писать свои драйвера - у меня интерес к сети и к графике. Я прочитал Тоненбауна и извлек такую вещь как системные вызовы. Pнаю о lfs(linux from scratch) - очень много всего расписано, но к понимаю ядра не приблизился. Еще начал изучать си,как понимаю этот язык более чем полезен.
Как мне дальше быть? Как перейти на следующий уровень? Все слишком сложно и смотрю на весь материал который нахожу(в том числе и на lfs), как баран на новые ворота.
In file included from list.c:7: ./kek2.h:1:5: error: redefinition of 'zaloopa' int zaloopa() { ^ ./kek1.h:1:5: note: previous definition is here int zaloopa() { ^ 1 error generated.
>>2431356 wchar_t и wstring для винды, и char и string для линукса. В линуксе string поддерживает юникод, а в винде эта ебучая однобайтовая кодировка. Алсо, есть галочка в региональных стандартах винды, использовать юникод для поддержки языков во всем мире(UTF-8), если ее включить то можно будет в принципе и string с char использовать в винде. Только вот потом не удивляйся что у тебя во многих приложениях будет хуйня вместо русских букв.
Копаюсь в реализациях протоколов TCP/IP, и тут есть такой код, как на пике. Зачем так написано, я нюфак и у меня глаза ломаются от такой записи? Мб я вообще не так понимаю эту запись?