Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
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)
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
>>2030478 Люди серьезные. Си требует дисциплины, отваги, вагона знаний, твердости и четкости ума. Пишутся вещи непростые, для реализации коих требуется и смекалка, и немеренные знания предметной области, изучение лоулевел-программинга — это тебе не паддинги править, сынок, ты тредом ошибся. Здесь тебе не питонотред или жс, обсуждать целыми тредами примеры из начала сраного byte of python не намерены, здесь люди ебашат K&R в одиночку без лишних вопросов, в их сторону достаточно кинуть парочку книг, все остальное лежит на их плечах, без лишнего пиздежа свое дело сделают.
Анон, вопрос. Мне нужно считывать с микросекндной точностью некий ресурс (размаплен через mmap). Ось типа убунты без рт ядра способна это сделать?
Я хотел делать чтение, останавливать поток на сон (правда, на c++, но итт пацаны знают работу операционки), и через заданный интервал считывать значение заново. Короче, рилтайм. Я знаю, что есть системный high resolution clock, и как-то система потенциально знает, сколько прошло времени.
>>2030918 Нет, как раз потому что линукс не реалтайм. Он может провести хоть секунду в системном вызове, если захочет, и твой слип сработает гораздо позже, чем ты того хотел бы. Более-менее точно попасть в нужное время ты можешь так: выставить себе приоритет повыше, выставить affinity, и таким образом, отожрав целое ядро у процессора, крутиться в цикле безо всяких снов.
>>2030987 Хорошо. А есть какой-то подход о блокировке ядра (типа nop вставлять) на известное количество времени, а не тактов, с учётом плавания частоты ядра? Чтобы не выжирал энергию в простое?
Алсо, unix овский nanosleep() тоже не гарантирует микросекундную точность?
>>2031178 Нанослип ничего не гарантирует, он может округлять время вверх. Искользуй цикл с clock_gettime CLOCK_MONOTONIC. Может потребоваться что-то подкрутить в настройках ядра, чтобы таймеры работали точнее.
>>2032955 Достаточно сложно, если ты хочешь серьезное что-то, а не поиграться. Для начала man setjmp, но вообще есть всякие готовые либы для green threads.
лол, ну если тебе нужна многопоточность в духе эрланга, может тебе прост оэрлангом и воспользоваться?
если нужна сишная многопоточность - гугли pthread, там, в принципе, ничего недоступного нету, есть какая-то старая книжка, есть годный мануал от почившего sun. чё там, защищаешь общие ресурсы мьютексами, синхронищируешь кондишн-переменными. хуё-моё. сложность - дело относительное. но многопоточность требует немного иного понимания, иного взгляда, там memory order'ом фонит по низам. Знаешь, один великий спец сказал, что распределённые вычисления есть наука о том, как на нескольких процессорах решить задачу, для которой достаточно одного.
Есть ли разница и как лучше возвращать структуры из функции? Например есть код, в котором мне нужно получить заполненную структуру данных просто struct с переменными. И вот я могу сделать функцию, которая будет возвращать MyStruct/const MyStruct&, или сделать воидовую функцию, которая будет принимать MyStruct& и там его заполнять. Я чёт пытался сам пример себе собрать, но не понимаю до конца, что конкретно происходит с структурами, когда я референсы на них возвращаю из функций? В первых двух вариантах с пикрила в функции и в вызывающем коде адреса у структур разные. Это типа что, на return'е функции структура копируется в памяти и в вызывающем коде референс уже на копию? При этом у struct3 в вызывающем коде адрес такой же, как и в создающей функции
>>2033117 Возвращай по значению. В современных крестах возврат оптимизируется по стандарту и функция реально работает внутри с той памятью в которую типа как эта структура вернётся из функции.
>>2033117 Возврат по значению быстрый только если у тебя размер не больше 8 байт (или 16 для 64-битного кода), и даже в этом случае есть подводные камни. Если тебе нужна скорость - функция с явным указателем/ссылкой лучше, при этом ты можешь заодно еще и статус вернуть нормальным способом.
чо вы несёте, если компилятору меньше 20 лет, то он оптимизирует возврат любой структуры. это будет почти гарантированно быстрее доступа по указателю. при возврате структуры по значению получается более простая семантика для человека, и для компилятора, второе позволяет лучше делать кросс-оптимизацию. далее, для возврата структуры по значению, ты её наверняка будешь маллокать где-то - дополнительный вызов функции, потенциально кэш-локальность идёт по пизде.
>>2033117 На самом деле можно писать и так, и так. Это зависит от того, чего тебе нужно достичь. Если, например, ты пишешь код для сдачи лабораторки какой-нибудь, то пиши так, как в методичке. Если же код для чего-то более серьёзного, то...
Я в подобных случаях смотрю на то, какой смысл у этой структуры данных. Если это какая-то не очень большая временная структура либо если это какой-то не очень большой математический примитив фиксированного размера (например, вектор или матрица из трёх или четырёх float'ов - частые примитивы в компьютерной графике), то лучше возвращать целиком. Потому что вот такая запись > mat4 c = Mat4xMat4(a, b) гораздо приятнее и органичнее, чем > mat4 c; > Mat4xMat4(&c, a, b); А ещё она позволит тебе перемножать много матриц по цепочке.
С другой стороны, если твоя структура олицетворяет собой некий объект "реального мира", даже если она очень небольшая, например, это частичка от огня или взрыва в той же компьютерной графике, описываемая тремя координатами и парой чисел сверху, то тут уже лучше работать с ней как с полноценным объектом. > particle p; > CreateFireParticle(x, y, z, &p); Потому что этот код банально лучше масштабируется, ты можешь дописать к нему в будущем код возврата и тому подобное.
В плюсах есть свои способы сделать это, разумеется: классы, конструкторы, перегрузка операторов и всё такое, но это плюсы. Насчёт оптимизации же - я не думаю, что тебе оно надо, ведь сегодня машины слишком мощные, чтобы печься о каждом такте. А даже если и надо, то при вменяемых ключах оптимизации современный компилятор всё равно подставит (inline) твою короткую функцию куда надо, и разницы в производительности не будет в принципе.
В хуях 86 gcc даже без флагов оптимизации вызываемая функция будет писать в структуру на стеке вызывающей функции, если структура большая. А чё стандарт говорит?
>>2027897 (OP) Анонасы, кто умеет в OpenMP, нужна ваша помощь. Можно ли каким-то образом "открепить" паралельную секцию от основного потока и, не дожидаясь её завершения, продолжить выполнение дальше?
Вопрос может звучать максимально глупо, но ведь нормально и полезно использовать unsigned short int/uint16_t и uint8_t, а не int, если в моём коде переменная гарантированно будет принимать только беззнаковое значение соответствующего размера? А то смотрю на чужой код, читаю различные туториалы/статьи и вопросы на SOF, и всем как будто похуй, что они тратят память впустую.
Привет, ребят. Сразу говорю за программирование не шарю, просто по инфе нужно лабу со структурами сделать. Сама суть задания, с помощью структуры найди самую старую книгу и сколько книг из области физики
>>2036630 Почему нет - используй на здоровье. Но есть одно "но", а именно - выравнивание. > struct s { > uint8_t a; > uint32_t b; > }; Занимает в памяти не 5 байт, а 8. Это происходит из-за того, что процессор умеет обращаться к переменной b только если её адрес можно поделить на 4. В связи с этим после переменной a компилятор тебе добавит три байта, которые не будут использоваться в принципе. Ты можешь легко проверить это в духе: > printf("%lu\n", sizeof(struct s)); Примечание: x86 может работать с невыровненными данными, но медленнее, из-за чего по умолчанию выравнивание всё равно применяется. А другие архитектуры могут тебя с такими запросами вообще напрямую послать, выдав address error и отказавшись работать.
>>2036887 > if (p.obl == 'Физика') if (!strcmp(p.obl, 'Физика'))
>>2036630 В структурах (если экономишь память) - да. Если хочешь переполнение по модулю 2n- тоже можно. В остальных случаях нарвешься на сравнение знакового с беззнаковым или внезапно неэффективный код.
Сап сисеры. На связи бумерок, надрачивающий на олдфажные игори. Занимаюсь моддингом Return to castle Wolfenstein. Столкнулся с тем, что на современных компах игра вылетает частенько в процессе загрузки миссии из сохранения (если загрузка происходила во время игры). Отловил в Оле. Пишет якобы access violation. Но схуяли там пустая переменная, если в норме этот код постоянно работает? Предполагаю, что это связано с тем, что в ходе завершения миссии игры из памяти выгружается много переменных, а из-за криворукости кодеров, какой-то параллельный поток на быстрых компах успевает снова попытаться прочитать уже выгруженную переменную.
Исходник есть. Место локализовано. Строка 84. Чтение одной из этих переменных во время выгрузки миссии приводит к крашу.
Вопрос собсно такой: как это лучше всего пофиксить? Не хочется отрубать функцию полностью. Как программно предотвратить access violation на уровне сишного кода? Есть ли аналог try-catch? Или не поможет????
ну по честному, наверное, стоит добавить семафорчик, если ты правильно описываешь ситуацию, заблокироваться перед чтением, пока не подгрузится корректный объект.
>>2037395 А вообще мне вот от чего бомбит. Там выше по коду на 77 идёт чтение точно тех же самых переменных и почему-то они не вылетают. Как это возможно???
>>2037136 > Разница в бенчах на x86 была почти незаметна, а сейчас и вовсе сошла на нет О как. Значит, мои данные слегка устарели.
Впрочем, тест по ссылке производился на локализованных данных. Невыровненное слово может всё равно попасть на границу двух кэш-линий, и тут уж как ни крути, а придётся грузить две линии вместо одной.
Но это уже такое. Больше теоретическое, нежели практическое.
>>2037279 >>2037381 Дело не в многопоточности, как я понимаю. Шанс того, что в условии > if (g && g->something) произойдёт переключение потоков сразу после проверки g, но перед g->something, ничтожно мал, никак не "частенько". И действительно, глянь в отладчике, у тебя там [EAX+248], но при этом в EAX лежит нифига не ноль.
Вероятно, в client->gentity лежит какой-то мусор. Я бы проверил, инициализировано ли это поле, и не испорчено ли оно где-нибудь.
>>2037540 Ты должен смотреть, чтобы у тебя неинициализированных полей в программе вообще не было.
Но, как мне кажется, у тебя дело в том, что где-то gentity портится. Может быть, в другом потоке, или в твоём же. Либо память, на которую ссылается gentity, была уже где-то освобождена, но в NULL поле gentity после free() установлено не было.
>>2037709 Ты фигнёй маешься, бро. >как проверить инициализированность В общем случае на твой вопрос ответ - никак, если речь про указатели, то обычно проверка против 0. Пиши отчёт автору, ну или кинь ссылку на исходники, у тебя там выше анон правильно сказал, что некий use after free (судя по виндовому сообщению) как минимум.
>>2037730 Ты с ума сошёл? Это компьютерная игра. Там десятки тысяч строк. client это указатель на протагониста, а gentity - на его состояние. gentity меняет чуть ли не каждая воида во всех проектах.
тредом ниже грозился взяться за бутстрап. и неделю назад дошли лапки. всю эту неделю тупа курил маны, статьи на осдев, так как почти нихуяшеньки не знал, тем неимение за это время узнал об архитектурах больше, чем за пару лет вузика. и вот первые успехи уровня /пр на пикриле если нажать ку, то пека и правда вырубится далее буду учить стартовый буткод распозновать сигнатуру лини и попробую загрузить бут ядра. асло если кому-то понадобится - http://www.ctyme.com/rbrown.htm (тут всё "апи" бивуса).
>>2042942 Это функция отправки сообщений клиентам сервера. Смысл проверки (gentity->r.svFlags & SVF_CASTAI) в том, чтобы выяснить, является ли данный клиент ботом. Потому что ботам отправлять сообщения не нужно, и поэтому нужно сделать continue. Но у нас сингл-плеер игра, т.е. на сервере могут быть либо боты, либо протагонист. Я нашёл, что отличить игрока от бота можно ещё одни способом. В структуре gentity есть поле name в котором хранится имя клиента и оно всегда инициализировано. Я сделал проверку, что если gentity->name равно WolfPlayer (так сервер называет протагониста), то вот эту ёбаную проверку на вылетающем r.svFlags я перепрыгиваю.
>>2041738 Тоже вкатываюсь в осдев, сделал вывод для себя что асм в пользовательском пространстве даже рядом не стоял с асм в режиме ядра. Если будут какие успехи пиши тут, интересно понаблюдать до чего дойдешь, а лучше линк на гитхаб с своим загрузчиком скинь
>>2029476 Си живее всех. Это скорее русскоязычное сообщество мертво. Это и не удивительно, что с такой культурой дискуссии все давно разбежались по англоязычным платформам. Зашёл тут на /pr/ со скуки, а тут Си-тред валяется в самом конце, при этом в топе JS, бугурт-тред и чьё-то нытьё. Позорище.
Аноны, всем привет. Я вкатываюсь в си и офк первым делом полез в >The C Programming Language Но не старая ли она в 2021? Например пикрил, сейчас же пишут int main(), да и компилятор ошибку выдавал когда я без инта вводил. И таких примеров я заметил несколько за первые 100 страниц. Мнение тредика какое? Мб стоит схавать для начала пикрил 2? >C Programming: A Modern Approach
>>2052476 Это старый стандарт, там int считался дефолтным, поэтому его можно было не писать. Если очень надо, то посмотри доки к компилятору, там должно быть написано про включение поддержки старых стандартов. >Но не старая ли она в 2021? Сам язык в 2021 году старый.
>>2052603 А нет, оказывается во втором издании ничего не поправили, почему-то думал что там все нормально По С кстати есть годный короткий плейлист от Хирьянова https://www.youtube.com/playlist?list=PLRDzFCPr95fLjzcv6nNdjMu_9RcZgIM9U, тут не только сам Си но и смежные к нему области вроде алгоритмов, теории компиляции рассматривают
>>2045593 >сделал вывод для себя что асм в пользовательском пространстве даже рядом не стоял с асм в режиме ядра.
Ну я пока только пару строк вывел; и с текстовыми и графическими модами немного поигрался. А разницу лишь в сегментной модели реального мода увидел, ну и вместо сисколлов - слой биоса.
>Если будут какие успехи пиши тут, интересно понаблюдать до чего дойдешь,
Я напоролся на архитектурную диллему в чейн-лодинге, сродни про яицо и курицу. В некоторый момент неизбежно потребуется загрузить второй стейдж (очевидно чем раньше - тем лучше). Вопрос, где хранить второй стейдж? На одном из разделов - плохая идея, так как инсталяция загрузчика потребует запиливание нового раздела, что не есть адекватно хотя вроде загрузчик NT так делает.
В /бут/ ? Тогда потребуется вскрыть файловую систему на разделе, загрузить соответствующие дровишки (опять же, откуда?) и уже через них искать бинарь со вторым стейджем; причем все эти действия могут и не уместиться в 446 байт.
Есть правда такая штука, VBR (volume boot record), то же что MBR только на разделе, а не на диске. В ней же инфа о файловый системе. Можно делать следующим образом:
1. смотрим следующий раздел 2 если он активен, тупа (как БИОС) грузим его VBR в другую локацию и передаем контроль туда 3 смотрим файловую систему 4 смотрим 2stage грузим его и благополучно передаем контроль Если что-то не так - откатываемся к п.1 (т.е. возврат к 1 стейджу)
Но во-первых согласно osdev, VBR "не совсем стандартен". И во-вторых, прописаться в этот верхний кусок раздела во время инсталяции возможно тоже не самая адекватная идея.
Одним словом подсказки бы не помешали.
>>2050336 >Через APM небось? Через ACPI. А если честно, то нужный int на стэк-оверфлоу нашел и просто копировал наудачу. Асло где-то слышал, что ACPI - точное надмножество над APM.
В чём проблема помимо моей необучаемости? Как сделать, чтобы всё работало так, как я хочу? Нужно, чтобы внутри программы test существовал объект (или ссылка на него) foo_list из моей библиотеки без его явной декларации (чтоб красиво было), состояние которого можно было бы менять через соответствующие функции. У меня, насколько я понимаю, получается, что он где-то в загруженной в память библиотеке существует без возможности его изменения. Я в C полный нуб, сильно палками не бейте.
Подскажите, каким образом можно на си+линукс реализовать такой обработчик сигналов извне (наподобие прерываний), который бы обрывался на следующем приходящем сигнале?
Я попробовал через signal(..) - получилось, что он ждёт полного выполнения кода обработчика, что неприемлемо. Однако выгружать программу нельзя - просядет производительность из-за сервисных издержек.
Мне нужно, чтобы клиент отправил всем строку, а сервер, прочитавший и понявший, что это к нему стучатся, начал общение. Вот, но я не понимаю, как это широковещательное сообщение от клиента отправить.
>>2058422 Блин, может я чего-то недопонял. Это за тебя уже придумали, отправляй на широковещательный адрес твоей сети, это самый последний адрес в сети, но он вычисляется в зависимости от маски. Проще воспользоваться сетевым калькулятором. Например - https://ipcalc.co/ вставляешь какой-то адрес из твоей сети вместе с маской, в результате смотришь broadcast.
Если тебе нужно отправить в другую сеть, то там уже нужна маршрутизация, маршрут до другой сети прописывается на роутере.
Анон, если код часто работает с файлами через стандартную либу, то нужно постоянно проверять эту работу (на количество прочитанных/записанных файлов, возврат ошибочных значений)?
>>2059845 Даже если не часто, а всего один раз и всего лишь на полшишечки — возвраты надо проверять у любой функции, которая может закончиться не очень успешно.
>>2052497 Старый то старый, но до сих пор активно используется минимум в паре сфер. И, помимо этого, есть еще куча аматоров в Linux и MCU (настоящих MCU аматоров, не соевых письтеров пердуинщиков), которые этот самый язык юзают.
>>2054264 > А если честно, то нужный int на стэк-оверфлоу нашел Значит через APM.
> ACPI - точное надмножество над APM Никаким местом. Мало того, на новых компах, особенно ноутах, CSM в APM не умеет. Есть только APM installation check, который говорит, чтобы ты шел нахуй.
> 446 байт У нас EFI давно, на разделе дохуя места под любой лоадер, который ты только можешь себе вообразить.
>>2064088 Плюсую тебя. Ещё добавлю, что половина софта в обычном дистрибутиве GNU/Linux точно написана на Си. И разные *bsd системы тоже сюда же. И эти вещи кто-то поддерживает, и софтины по типу mesa, wine, которые цветут и развиваются. А значит и какой-никакой спрос на толковых разработчиков на Си будет.
C на первом месте, пиздос и вакансий как на яву, если выбросить мусор, а может еще больше. https://habr.com/ru/company/skillfactory/blog/531360/ Я конечно понимаю, по сравнению с убогим C++ сишка ахуенна да и вообще низкоуровневый язык.
Как у вас тут дела, что программируете, работаете ли? Одно огорчает, что в вакансиях обязательно всякий мусор, как вышка и знания ОПП(его вообще кто-то не знает?). Зато все такие тру программисты. Выделяете память, следите за ядром линукса, работаете с системной поебенью и костылями.
Мимо зашел студент год назад бросил c++, начал учить джаву
>>2066014 >Как у вас тут дела, что программируете, работаете ли? Переписываю сейчас один микросервис с питона на Сишечку. Вообще-то кабанчик хотел С++, но я ему по красоте пояснил, что плюсы там как собаке пятая нога.
- Поступает информация потоком (с файла или с клавиатуры). - Из этой информации нужно извлечь только double, а прочий мусор игнорировать - Триггер прекращения чтения: EOF или последовательность символов "end"
Как реализовать это более элегантно?
Вроде бы ничего сложного, можно читать даблы с помощью fscanf'a, но всё портит "end" который нужно детектить чтобы прекратить чтение
ребят помогите пожалуйста. Нужно понять как реализовывать односвязные, двусвязные списки на СИ. Что это такое и как они работают примерно разобрался. Но вообще не понимаю с точки зрения кода. Как создать, добавить и т.д.?
https://learning.oreilly.com/library/view/smaller-c/9781098100322/ Понравилась мне идея подучить си, балуясь с железками, а то просто так неинтересно после высокоуровневых языков. Там тип рекомендует девборды от каких-то американских хипсторов, но они за любую хуйню дерут втридорога. Я посмотрел на али, там полно копеечных штук и досыпают ведро всяких проводков, лампочек и датчиков заодно. Но хуй знает, что конкретно брать. Есть у кого опыт?
>>2070708 Если речь идёт именно про элегантность, то подобные вещи лучше всего решаются при помощи конечного автомата. Погугли, что такое конечный автомат и как он работает. Это прямо то, что тебе нужно.
Разумеется, реализация КА довольно массивная, и если тебе это нужно на один раз, то проще и впрямь через fgetc() сделать и пару костылей. А если у тебя такие задачи возникают постоянно, подумай о том, чтобы подключить библиотеку регулярных выражений. Но самое элегантное решение, на мой взгляд - это конечный автомат.
>>2070708 Я бы предложил построчно читать и парсить строки (fgets). Проверяешь (switch) на 'e' -> проверяешь (strncmp) на "end"; проверяешь на цифру, плюс, минус, точку -> делаешь strtod, он либо вернется с ошибкой, либо даст новый указатель; если что-то сфэйлилось, инкрементишь указатель. Будет одновременно читабельно и не слишком медленно.
>>2072134 На девборде уже все распаяно, отлажено и документировано. Периферия именно та, с которой ты захочешь поиграться (экранчики, тачи, кнопочки-крутилки и светодиоды, само собой). У китайцев нормальных отладок с периферией нет, будешь собирать на dupont-кабелях с бредбордой и гадать, почему у тебя не заводится - то ли контакт плохой, то ли модуль тебе дохлый прислали, то ли подключил не туда или не так (нужен какой-нибудь подтягивающий резистор, а ты проглядел), то ли дело все же в коде. На первых порах такое часто встречается. В первом варианте ты получаешь удовольствие, во втором - опыт.
>>2072649 А что в книжке советуют? Вот подобное и ищи.
>>2048279 Да нет, решение уже принято. Все корпорации активно начали топить против Си. К 2025 Си станет нишевым языком для энтузиастов, а к 2030 отомрет вовсе.
>>2073935 > К 2025 Си станет нишевым языком для энтузиастов, а к 2030 отомрет вовсе. Да он прав тащемта. Си никогда не был хорошим языком, а сейчас он к тому же устарел и плохо подходит для современной разработки. Даже на микроконтроллерах его активно вытесняют. Исправить Си нельзя, не сломав совместимость, без совместимости он нахуй никому не нужен. Но к обеим датам лет десять я бы смело прибавил.
>>2074028 Тебе же по-русски вроде сказали, съеби из треда. Что не понятного-то? >>2074028 >Можно, разрешаю. Еще и жалкие пуки свои тут оставляешь, олень.
>>2074028 >Си никогда не был хорошим языком, а сейчас он к тому же устарел и плохо подходит для современной разработки. А что тогда хороший язык для этих целей? Я думаю, что Сишка даже условный раст переживет, который через пару лет на мусорку отправится.
>Даже на микроконтроллерах его активно вытесняют. Это чем же? Питоном, жабаскриптом, растом? не смеши пожалуйста.
>>2074093 > Питоном, жабаскриптом, растом Да, да и да луа забыл, лол. А главным образом крестами.
> Сишка даже условный раст переживет, который через пару лет на мусорку отправится Вот это как раз очень возможно. Хотя про пару лет ты загнул.
> А что тогда хороший язык для этих целей? Это такой, в котором чуть меньше UB, чуть больше неймспейсов и есть что-то хотя бы чуть-чуть получше _Generic. Ах да, и в который настоящий const завезли, а не вот это самое.
>>2073932 По этой логике отомрут компьютеры, останутся веб-страницы в проприетарных корпоративных сетевых терминалах это такие мониторы с кклавиатурами, подключенные удаленно к мейнфрейму в датацентре. Только Си тут ни при чем.
Сап, Есть функция, внутри которой создаётся определённой длины массив структур. shape shapes[10]
И после заполняется данными. Внутри функции все данные заполнены корректно, и всё отображается как надо.
Мне нужно вернуть этот массив, но когда я возвращаю указатель массива return shapes*. Если попытаться обратиться к любому полю любого кроме первого элемента массива - то там какая-то нёх (мусор в памяти)
>>2076639 наверное по конвенции будет то, что завалялось в контрольном регистре. а скорее всего ещё на конпеляции транслятор в ебло харкнет за такие дела
Где почитать про функции write read из unistd.h . Какие параметры у них? Ато есть подобное типа write(1, &n, 1) что это значит и можно ли пропускать параметры?
>>2079217 > Ну и как они его используют Точно так же, как в крестах, только вместо наследования - композиция: struct myobject { struct list_head list_of_something; int mydata; } И сразу гугли CONTAINING_RECORD, чтобы понять, как из list_head сделать myobject.
Анон, есть такая функция в файле UART.c void UART(void) {
X_sample = (int) ReadFromRXBufFL(RXBufAddrParsing+14); Max_sample = (int) ReadFromRXBufFL(RXBufAddrParsing+18); } Которая принимает данные из буфера. В заголовочном файле UART.h она указана как void UART (void); Как мне в файле programm.c заполучить содержимое переменных X_sample и Max_sample при выполнении цикла for(i=0;i<10;i++). Я объявлял переменные extern'ом в заголовочном файле programm.h, но данные из этих переменных приходят одни и те же.
>>2080489 > ReadFromRXBufFL Моя карманная ванга намекает, что данные ты либо не получаешь вообще, либо этот буфер надо poll-ить. В любом случае надо знать, что за МК, что за либа, как она работает.
>>2080657 LPC 2138, uart написан каким-то васяном и он работает, когда надо получить одно значение, в program.c я делаю вещь типа tempX=X_sample (X_sample - глобальная переменная, объявлена как extern в program.h, но как только я оборачиваю это дело в цикл, то весь цикл пишется одно и то же значение X_sample. В связи с этим и возник вопрос, насколько я всё делаю неправильно.
>>2080693 Не уверен что тебя понял, но: >объявлена как extern в program.h volatile не забыл? Либо компилируй с -O0. >весь цикл пишется одно и то же значение Если в цикле нет значительной задержки, то все логично. По UART данные приходят сравнительно медленно.
Прикол этого движка в том, что можно выставлять значения толщины и высоты пикселей, что используется при ретро гейминге.
В частности, в этой строчке: Construct(int32_t screen_w, int32_t screen_h, int32_t pixel_w, int32_t pixel_h, bool full_screen = false, bool vsync = false, bool cohesion = false);
Как я не пытался, не смог найти связь между этими значениями и вызываемой WinAPI (или OpenGL?) функцией для "зернистости" физических пикселей. Гугление pixel scaling, pixel resolution, pixel ratio, custom pixel size ничего не дало. Использование brush и pen не помогает, так как в вышеприведенном файле во-первых они не используются, а во-вторых не позволяют установить неквадратные пиксели.
>>2083927 Я, например, понятия не имею, где искать низкоуровневые вызовы из конструктора класса. В С, я бы увидел объявление Construct() в .h файле, открыл .c файл, и прочитал бы определение, и там были бы все вызовы. В каком .cpp это искать здесь?
>>2083991 А кто тогда долже определения функциям давать? В этом единственном .h файле только объявление. Я так понял, что это я не смог найти определения для Construct(), а ты утверждаешь, что его вообще нет?
Кароче есть старая карта 7 серии нвидиа и так получилось что её нужно воткнуть в систему с 10 виндой. Дрова под карту есть только для 8.1 винды. Собственно что делать? Почитал что можно конвертировать проект для 8.1 до 10 винды автоматически, но для этого ведь исходники нужны, а нвидиа проприетарные. В общем есть какие-нибудь предложения у анона?
Пытаюсь скомпилить вот этот код: https://github.com/engineer-man/youtube/tree/master/062 $ sudo make Получаю: make -C /lib/modules/5.12.14-arch1-1/build M= modules make[1]: Entering directory '/usr/lib/modules/5.12.14-arch1-1/build' scripts/Makefile.build:43: arch/x86/entry/syscalls/Makefile: No such file or directory make[2]: No rule to make target 'arch/x86/entry/syscalls/Makefile'. Stop. make[1]: [arch/x86/Makefile:223: archheaders] Error 2 make[1]: Leaving directory '/usr/lib/modules/5.12.14-arch1-1/build' make: * [Makefile:4: all] Error 2
Алсо, пикрил (проверил в /usr/include/linux, файла там и правда нет), но пакет с заголовками накачен: $ sudo pacman -Qe linux-headers linux-headers 5.12.14.arch1-1
Если быть точнее - ты передаешь int ××a в функцию аргументом, как int ××x, по сути ты NULL копируешь в функцию, и там его уже в стек фрейме заменяешь, не меняя значение самой ××a. Тебе надо в create передавать тройной указатель и a передавать как &a в него.
>>2086575 >ls -l /usr/lib/modules/`uname -r`/build/include/linux/init.h Так, вот здесь имеется, значит. Тогда получается всё правильно. И как тогда заставить его работать? Или не правильно. Он вообще должен быть там, или это на арче навасянили так?
Анон, происходит какая-то чертовщина. ГЦЦ пишет, что LLONG_MAX udneclared. Хотя limits.h подключен, в самом хидере этот макрос тоже есть.
Не стандартных хидеров неподключено. Пробовал включать limits.h последним, тот же результат (хотя было бы странным, если какие-то другие хидеры раздефайнили). Также если поставить другой лимит, например LONG_MAX, то всё работает.
Парни, такая ситуация. Программирую под мк, чистый си. Недавно вот захотел попробовать uclinux-ng, не спрашивайте зачем, мои цели за гранью. Думал там простая либа, но что-то вообще не въеду как её собрать под cortex-m4? Есть хоть какой-то гайд, не знаю с какого конца подходить, там мэйкфайлы какие-то, что с ними делать непонятно, гугол масоны засрали говном, ничего не нашёл. Среда программирования - IAR EWARM.
Господа, насколько я понимаю, если fread при считывании очередной порции данных натыкается на конец файла, то данные до него будут сохранены в указанной области памяти, ведь так? Если так, то я не понимаю почему у меня эти данные куда-то утекают при считывании большем, чем по одному байту.
Я же правильно понимаю, что эти ваши линки - статические адреса на этапе компиляции? Если да, то какой в них смысл? Они же экономят одно адресное слово, а также несколько копирований, но путаницы в исходнегах могут внести куда больше мимо-неофаг
А я вот тут подумал, и мне показалась интересной (своя) идея с таким билдом, чтобы как указатель (типа адрес), но при попытки модификации всё бы наебнулось (в рантайме). Не знаю зачем, но интересно
>>2027897 (OP) На чем вы бля дебажите в 2021? Это же пиздец, нужно посмотреть память и стеки вызовов, накатил Visula Code, какое то говно для пориджей нихуя не показывает, стер. Накатил Code::Blocks это говно сыпет программные ошибки. Vusula Sdudio этого ебаного монстра даже ставить не буду. Остался Eclips он точно работал...
>>2089343 >Ты наверное в Vim или Emacs пишешь да В НотеПад++ >>2089344 >Тогда бы он спокойно дебажил в гдб Я могу конечно GDB запустить, но бля 2021 год.
Господи, какую кислоту в своих 70-х жрали Денис Ритчи и Кен Томпсон, когда придумывали синтаксис объявлений указателей на функции. Это же просто абсолютно контр-интуитивная хрень. Почему, сука, я не могу объявить массив указателей на функции так?!
char ()(int) a[10];
Даже так, чтобы убрать любые неоднозначности
(char ()(int)) a[10];
Почему, блять, во всех остальных ситуациях, я слева пишу тип, потому пишу имя переменной и в квадратных скобках размер массива, а тут так не могу? Ебаный в рот. Указатель на функцию, возвращающую чар и принимающую инт - ЭТО И ЕСТЬ ТИП, БЛЯТЬ. Почему он должен подчиняться иному синтаксису?!
>>2090025 > когда придумывали синтаксис объявлений указателей на функции Никто ничего не придумывал специально. Объявление отражает использование.
> я слева пишу тип, потому пишу имя переменной и в квадратных скобках размер массива, а тут так не могу Ты неправильно об этом думаешь. Например, у тебя есть char ∗abc[10] (десять указателей на char): ты берешь имя переменной abc, индексируешь его квадратными скобками abc[10], дереференсишь указатель ∗abc[10] или с явными скобками ∗(abc[10]), получаешь char. Да, я знаю, что 10 за пределами массива, суть не в этом.
То же самое с функциями: берешь имя abc, индексируешь abc[10], дереференсишь указатель ∗abc[10] или ∗(abc[10]), получаешь функцию, вызываешь (∗abc[10])(int), возвращается char. Полная декларация: char (∗abc[10])(int) или с избыточными скобками, более явно показывающими последовательность действий: char (∗(abc[10]))(int). Дереференс ∗abc[10] приходится класть в скобки из-за приоритетов операторов, чтобы char не отожрал звездочку себе: иначе получится массив из 10 функций, возвращающих char ∗, но массив функций (а не указателей на них) в сишке сделать нельзя по определению, и компилятор пошлет тебя нахуй.
Алсо, двачую тайпдефы. Если тайпдефать не указатель на функцию, а сам тип функции, то даже скобки не нужны, и все получается максимально читаемым, точно таким же, как и для объявлений данных. Тот же самый процесс, что и выше, но два шага: typedef char MyFuncType(int); MyFuncType *xyz[10]; Когда отдереференсим xyz по полной, получаем значение типа "функция принимающая int, возвращающая char", ее и вызываем. И вот только здесь могут возникнуть сишкопроблемы и некоторое недопонимание: вызовы (∗xyz[n])(k) и его аналог с избыточными скобками (∗(xyz[n]))(k) абсолютно очевидны, но xyz[n](k) и (xyz[n])(k) работают ничуть не хуже. И это последствия неявного каста объекта типа "функция" к указателю на него и того, что оператор вызова функций () работает именно с указателями на функции. К сожалению, это правило работает в выражениях, но не работает в декларациях, поэтому MyFuncType xyz[10], как я уже говорил выше, написать нельзя.
>>2027897 (OP) Слышал что c99 сломан в сравнении с c89, а с11 исправил его, но никаких подробностей не было в источнике этого утверждения. Шарящие, поясните что там к чему и как родилось такое утверждение? Только не оспаривайте, блядь, это утверждение, я его не защищаю, мне просто интересно.
>>2092070 > Только не оспаривайте, блядь, это утверждение Как же не оспаривать? В C11 не так много нового появилось, и ничего коренным образом не изменилось по сравнению с C99. Хуй знает, может быть, это про какие-то детали формулировок? Вот C17 тоже вышел без фич, просто всякие мелочи поправили. Стоит ли утверждать, что C11 тоже был сломан?
>>2093083 Во-первых, это Microsoft, у них отношения с Си всегда непросто складывались, несмотря даже на то, что ядро на Си написано. Они постоянно пытались что-нибудь хорошее выбросить или не поддерживать, а какое-нибудь свое говно наоборот притащить. Во-вторых, в семидесятых ни про какие аннотации не слышали. Тем более в языке, который недалеко от ассемблеров ушел. Так что да, приходится костылями, хотя нормальные люди пишут подобные проверки в теле функции в assert. Вместо in/out пишут const и иногда restrict, и в C2x атрибуты появятся, можно будет их использовать, если очень охота.
>>2093120 > в C2x Вот бы получить сахар из крестов, но без анальных ограничений... Заебали пилить языки либо без производительности с зумерскими GC, либо ржавый кал с проверками всего что можно, не дающий раскрыться полёту фантазии.
Пацаны, есть один unsign char buffer[512*n], где n от 1 до 4096; Время от времени приложение написанное на gcc падает с ошибкой Segmentation fault (core dumped), гугл говорит что это из-за неправильной работы с памятью. Вопрос можно ли как-то совладать с этой ошибкой или нужно урезать размер буфера?
>>2093997 У тебя offset не инициализируется никогда, а используется в куче мест. Мусор какой-нибудь прибавляется к индексу в массиве, и он улетает за груницы и в sigsegv.
>>2094498 Открыл рандомное видео (v7OcOW7NrLs), тыкнул в рандомное место: sockaddr.sin_addr не присваивется вместо этого куча мемсетов везде, ну ладно INADDR_ANY как раз ноль, повезло; TCP, но код возврата send/recv не проверяется отправили 200 байт, ушло 100; буфер размером 200 символов распечатывается после recv без обработки, просто printf("%s\n") т.е., если отправить 200 символов без единого \0, получим выход за пределы буфера. И это только несколько секунд одного видео. Закрыл. Это точно-точно нужно в шапку?
сори если хуйню принес в тред, я только щупаю сишку на уровне любителя. Кто-нить юзал/ет http://libcello.org/ вот случайно наткнулся, вроде прикольно, но там какой-то рантайм добавляют (по сути уже не си), курить дальше эту либу, или это шляпа какая-то?
>>2093323 блядь, этих ноунейм языков уже наплодилось zig, odin, nim, beef, v, crystal ...
когда уже нормальное че появится не раст, как бы си люблю, но реально уже морально устарел. Да и виден запрос общества на модернизацию сишечки, раз столько япов развилось, которые до нормального продакшна все никак не дойдут
>>2095620 когда ты в 2000-х был мелкий, наверное с тамогочиком ходил, или лизуном-сасуном каким-нибудь. ну это другое совсем, твое поколение явно умней было, а сейчас зумеры эти - дегенераты.
Сам считаю odin наиболее интересным из всего что ты перечислил, жаль наиболее хайповый из них zig.
Так то к сишке многого не нужно, нормальные дженерики и может еще несколько стандартных контейнерова и все впрочем, по желанию трейты добавить еще можно.
>>2095643 там в том-то и прикол что не надо там что-то супер новое. даже синтаксис не надо менять
просто мб методы для структур как в го интерфейсы как в го дженерики как-то продумать обработку ошибок и инфраструктуру нормальную запилить, что-то типо cargo ну и мб как-то отказаться от .h файлов
>>2095563 Crystal и Zig заслуживают ознакомления, но Crystal - это не про сишку.
>>2095689 > и инфраструктуру нормальную запилить, что-то типо cargo Это провоцирует лефтпады. Диды вон писали без карги, и нам она не нужна.
> как в го Возьми го и пиши в го, как в го. Тут должна была быть шутка про продумывание обработки ошибок.
> не надо там что-то супер новое Надо. Современное программирование сильно отличается от того, как писали раньше. Даже тупо железо отличается. А в сишке вон многопоточность только-только появилась.
>>2095775 > Возьми го и пиши в го, как в го. не хочу го, пробовал - хуйня
> А в сишке вон многопоточность только-только появилась. не понял прикола, ты про что? системными вызовами создаешь свои потоки, что значит недавно в си появилось? если че - да, я нуб в си, чисто для души вкатываюсь
>>2095872 шаблоны, лямбды, корутины, модули, наймспейсы, скоро еще завезут pipeline-operator и pattern matching все твои любимые сишные библиотеки работают без танцев с FFI что еще нужно?
>>2095869 Ага, оно работало примерно как 1 << 31. Все знают, что получится, но у стандарта другое мнение. Та абстрактная машина, под которую пишется сишный код, ничего не знала о потоках. Соответственно, ни сам язык, ни стандартная библиотека ничего не гарантировали, были только местные фокусы, работавшие на честном слове.
> А в сишке вон многопоточность только-только появилась.
я не гуру, но знаю только pthread, если еще какие-то имплементации, есть даже кроссплатформенное решение какое-то. А че у же в стандарт си завезли потоки?
это норм что в h файле я определяю структуру, ну прям полностью, с полями?
просто иначе если я объявляю ее в h файле но определяю в .с, у меня сыпят ошибки разные типо storage size of ‘point’ isn’t known. оно и понятно что файл видит только то что в хедер файле. Но раве в хедер файле что-то определяют?
>>2096726 > это норм что в h файле я определяю структуру, ну прям полностью, с полями? Это зависит. Вообще норм. Но есть способ скрыть реализацию, когда ты в .h говоришь: struct yoba; // тайпдефы по вкусу а в .c ты уже объясняешь, что: struct yoba { int fileno; char ∗somename; }; И да, в этом случае тебе нужно будет сделать свой "конструктор", struct yoba ∗yoba_create(void), потому что код снаружи не будет знать ни размера, ни каких-либо других деталей о структуре, кроме того факта, что она такая есть. Класть ли структуру в .h как есть, или прятать детали - дело твое, зависит от того, где и как будет использоваться эта структура.
> Но раве в хедер файле что-то определяют? Да. Даже код кладут, когда это inline-функции, например.
>>2098730 Тебе же написали: запускать сначала Developer Command Prompt от вижуал студии (консолька с выставленными переменными окружения), а потом из нее VS Code. Алсо, после этого ты можешь спиздить переменные окружения, и выставить их либо глобально, либо как-нибудь в этой вашей VS Code наверняка можно для билда указать.
>>2098886 Там переменных окружения столько, что ты охуеешь. Пару десятков. И все они с консольки этой выставляются пачкой bat-ников. Сука, ощутил на собственной шкуре за что индусов ненавидят.
>>2098940 Да. Мне совершенно не на чем проверить, но на самом деле нужно что-то вроде PATH/LIB/INCLUDE плюс VisualStudioVersion/VCINSTALLDIR, чтобы оно смогло задетектить наличие студии.
>>2102089 Тому что так сложилось. Ты уверен, что тебе не хватает точности даблов? Ты уверен, что хочешь медленно считать 80 бит на FPU, а не 64 бита быстро на SSE?
>>2102090 Я хочу контроль. double когда нужна скорость и long double когда я сам решил, что мне нужна повышенная точность. Оправдания виндовому поведению просто нет. gcc в MinGW ведет себя правильно, но я боюсь что там в качестве workaround вообще программная реализация, а не просчет на FPU.
>>2102092 > Оправдания виндовому поведению просто нет Оправдание есть: из существующего и распространенного железа только x87 из 1980 года умеет в хардварные 80 бит. Повторюсь, современный софт на x86 считает плавающую точку на SSE (даже если это обычные, не векторизованные вычисления), в x87 ходят только по большой нужде.
> боюсь что там в качестве workaround вообще программная реализация Нет, там честные 80-битные даблы с выравниванием (лежат в 96-битных переменных), математика естественно на FPU, все ∗l() функции реализованы.
>>2102092 Алсо, я вот не понимаю, когда int и long int синонимы в 32-битном коде, тебе почему-то норм, а вот когда double и long double, так сразу оправданий нет.
Алсо, не сразу увидел и поэтому не сразу проиграл: > double когда нужна скорость Посоны-то не знают, не флоаты, ХАЛФ-флоаты используют (там, где завезли), а он даблы, скорость.
>>2102697 >Алсо, не сразу увидел и поэтому не сразу проиграл: > double когда нужна скорость >Посоны-то не знают, не флоаты, ХАЛФ-флоаты используют (там, где завезли), а он даблы, скорость. Кек, теперь и я проиграл, тоже не сразу увидел.
>>2027897 (OP) Какого хуя ёбаный CMake, при сборке под MinGW Makefiles генерирует мне сука makefile в котором все пути указаны с \ а не с / (пикрил 1)? В итоге при попытке запустить этот makefile, вызываемый make'ом cmake эти слеши не правильно обрабатывает и удаляет их нахуй (пикрил 2). Я просто не могу понять это я так обосрался или все эти системы сборок и системы сборок для систем сборок тупое ебаное костыльное кривое говно? make из состава MinGW, CMake качал с оф. сайта. Собираю libTMX библиотеку (https://github.com/baylej/tmx), всё это результат следующей команды https://pastebin.com/VjnpSREQ
Привет, вообщем недавно, начал изучать си, осилил синтаксис и понял что для написания программ недостаточно, когда ничинаешь писать что либо, испытываю страх за незнание, и собственно ответ прост, нужно писать код много гуглить, но времени у меня нет, так как чувствую что си уже никому не нужен, а я хочу найти работу в айти(
>>2104208 >а я хочу найти работу в айти( Проще и быстрее будет выучить JS за полгода и идти работать низкосортной макакой за копейки. Ну а лучше подсуетись кабанчиком и устройся куда нибудь охранником или грузчиком, нервы сбережешь
>>2104212 >Проще и быстрее будет выучить JS за полгода Никак ты не научишься программировать быстрее от того что будешь учить синтаксис джаваскрипта вместо синтаксиса си — это просто так не работает. А то может быть и дольше будешь пердохаться с дохуя управляемыми языками, ведь там где си даёт понимание того, как работает компьютер, динамические языки заставляют ньюфага с собой работать как с чёрными ящиками разумеется компьютер тоже в какой-то степени чёрный ящик, но чем эта степень ниже тем лучше для обучения.
>>2104257 Дед, пей таблетки Программирование это на 70% дизайн, и только на 10 попердольки (в среднем по индустрии но не суть). Научиться программированию можно только погружаюсь в проблематику домена. Чем ближе к юзкейсам и чем высокоуровневей — тем лучше.
>>2104257 >понимание того, как работает компьютер Тут учиться надо, время тратить, мозги напрягать. Человеку вон, надо поскорее "вкотиться в ойти и рубить бабло", а ты ему про Си загоняешь
>>2104208 Да си как раз-таки довольно простая хуйня, как и ассемблер. А вот войти в айти с сей действительно не получится, особенно если нет опыта даже в сопутствующих областях
Пиздец просто почему ни где не написано про порядок линковки библиотек? Пол дня нахуй мучался, не понимая почему у меня undefined reference на функции из libxml2, а оказывается сука, вопреки законам логики, библиотеку вызывающую libxml2 надо ставить ДО линковки libxml2. Какая же хуйня боже просто пиздец
Впервые в жизни я решил вкатиться в С ответ очевиден - у меня НИХУЯ не получилось я открыл Кернигана и Ричи, стал всё читать, пробовать, компилировать. и что вы думаете??? ХУЙ!!!! нихуя у меня не получилось а я могу даже пояснить почему я не могу скодить ДА ПОТОМУ ЧТО Я НЕ ВИЖУ В ЭТОМ СМЫСЛА делаем типа переменные lower upper obosrupper и типа хуярим переводчик из фарингейта в цельсий, НАХУЯ МНЕ ЭТИ ЦЕЛЬСИИ ЕСЛИ У МЕНЯ В ГУГЛЕ ЕСТЬ ПЕРЕВОДЧИК В ЛЮБУЮ ЗАЛУПУ БЛЯТЬ ГОТОВЫЙ может я странный человек?? я не знаю. всем удачи с этим ёбаным си
>>2106750 > ЕСЛИ У МЕНЯ В ГУГЛЕ ЕСТЬ ПЕРЕВОДЧИК В ЛЮБУЮ ЗАЛУПУ БЛЯТЬ ГОТОВЫЙ Я так понимаю си это твой первый язык? Потому что любые другие языки преподают на таких же простых и сто раз решённых примерах.
Почему так часто именно Си советуют в качестве КМБ? Если у человека желание расти в эмбеддед, то не логичнее ли начинать с асмы под отдельно взятую архитектуру, а уже несколько позднее браться за K&R? Если обезьянство, то лучше наверное сразу с интерпритируемых ЯПов или нет?
>>2107009 Это от того, что принципы, на которых построен Си, более или менее явно встречаются во всех промышленных языках. При этом, в отличие от Scheme и Smalltalk (принципы которых составляют >80% принципов "современных" интерпретируемых языков), он всегда был популярен в мейнстриме.
>>2107009 Под эмбеддед на асме пишут только уебки, школьники на ютубе "я так могу" и старперы, которые выучили в 90-х архитектуру какого-то 8-битного PIC и там застряли.
В эмбеддед давно царствуют плюсы или сишечка, но для особо упоротых оптимизаторов, если надо ебать много байтов и регистров с очень маленькой памятью.
>>2106544 Я бы взял плюсы, на плюсах такое писать в разы проще, т.к. там есть полиморфизм, темплейты, разные абстрактные типы в стандартной либе и т.д. На сишке такое писать стоит только в учебных целях. >>2106529 Загрузчик, ведро, фирмфарь, драйвер.
Как разделить код на си в несколько строк? Вот например int a = ananas; Если разделение будет между командами то без проблем, а если я хочу разделить вот так: int a = ana nas; или так: in t a = ananas; Что за йоба символ использовать?
поясните по хардкору почему все так люто выступают против ютуб туториалов? вот например https://www.youtube.com/watch?v=KJgsSFOSQv0 вроде норм объясняет последовательно и интересно. а Керниган и Ричи сразу начинают ебать мозг и приходится не обучаться, а посути догадываться. а после туториалов можно и книги почитать
>>2107463 Тем более кресты лучше. На сишке тебе придется пердолиться в воид поинтеры, в крестах компилятор сможет сгенерировать оптимальный код под конкретный тип. В сишке ты притащишь виртуальные функции в виде указателей в структурках, в крестах компилятор тоже притащит, но там он их еще и девиртуализовывать умеет. И вот так вот все. Кресты всегда в состоянии обогнать сишку просто потому что у них выразительных возможностей больше, но поэтому же писать быстрый код на крестах гораздо сложнее, чем на сишке. Не умеешь - получишь тормоза, скатишься в необдуманные абстракции всего и вся - получишь тормоза.
>>2107463 Ты упускаешь что оптимизированный компилятором код игровых движков на крестах обычно производительней реализации на чистом C. Посмотри даже какие-то бенчи языков программирования, кресты чаще всего впереди с реализацией того же алгоритма. Маргинально конечно, но все же. Учитывая это и более простую работу со структурами данных и ты прийдешь к выводу что без крестов никак.
>>2107829 Литералы константные и лежат в секции данных (обычно). То есть, фактически твой код: static const char anonymous_string[] = "hello world"; char *a = anonymous_string; return a; Потому и работает. Освобождать нужно только то, что ты выделял маллоком или то, что другие выделили и сказали, как освобождать (fopen/fclose и т. д.).
>>2107735 >На сишке тебе придется пердолиться в воид поинтеры Не пердолься в воид поинтеры >В сишке ты притащишь виртуальные функции в виде указателей в структурках Не тащи виртуальные функции >писать быстрый код на крестах гораздо сложнее Именно.
>>2107887 > не пердолься qsort(), далеко ходить не надо. Сейчас ты скажешь реализовывать все стандартные алгоритмы, а для поддержки разных типов - копипастить, да? > не тащи А придется, потому что это единственный нормальный способ менять поведение в зависимости от типа объекта. Портянки из switch или ifelse ну никак не альтернатива.
>>2108018 Кресты все равно будут протекать в твой мир, даже если тебя возьмут исключительно на сишку. Смирись и выучи хоть как-то.
>>2108026 >Сейчас ты скажешь реализовывать все стандартные алгоритмы Нет, сейчас ты такой перечисляешь мне все стандартные алгоритмы с войд поинтерами. Про qsort все знают и он гуглится легко, а остальные приведёшь, раз уж >реализовывать все стандартные алгоритмы ? qsort скажу реализовать, но qsort это не все стандартные алгоритмы, это один стандартный алгоритм. >а для поддержки разных типов - копипастить Ну ты можешь копипастить конечно, если по-другому не умеешь, но обычно это делают с помощью макросов.
>>2107807 >>2107809 Открыл ссылку. Исходники по ссылке для си и плюсов почти всюду разные, и чего они там по итогу сравнивают? Алсо, вот такого вот > _mm256_setr_pd(...) в геймдеве никто лепить не будет, лол (если ты, конечно, работаешь не на эпиков каких-нибудь, но тогда чего ты забыл на сосаче?).
>>2107463 Не-а. Сегодня геймдев - это хуяк-хуяк на юнити или чертежами на анриле и в продакшн, сражаться за каждый такт как в девяностых никто уже не будет. По вопросу: уж игры и даже движки пишите на чём вам удобнее, хоть на руби. Машины у юзверей сегодня мощные, пережуют. Если, конечно, ты не UE5 собираешься с нуля писать.
>>2108284 >По вопросу: уж игры и даже движки пишите на чём вам удобнее, хоть на руби. Машины у юзверей сегодня мощные, пережуют. Ну знаешь ли. Я вот думаю дропну нахуй Outer Wilds, юнитипараша графона не содержит ноль целых хуй десятых, зато комп во время её работы протапливает хату будь здоров (когда на улице 41 особенно заебись). Там вопрос был плана "что бы такого написать на си", а писать на си надо очевидно то, где сишка с лучшей стороны себя покажет. Игровой движок это как раз такая штука, но лишь одна из многих. Игры целиком писать на си наверное всё же не стоит, как и на крестах кстати. Не сильно жрущую игровую логику лучше реализовывать на динамических языках имхо. Даже майнкрафт немного страдает от того что там моды на джаве, а это джава, это не кресты и даже не си.
>>2108317 Это-то как раз объективно понятные вещи. Но тут просто проблема в том, что пока что ты будешь писать на си или плюсах, конкуренты уже давно выпустят свой говнокод на говноюнити и твой продукт никому нахуй будет не нужен. И плевать, что код на юнити превращает пекарню в обогреватель.
Сишка - это, увы, для многих сегодня забытые технологии предков. Но не для меня.
>>2108367 Ну вот пока что выходит что мне как потребителю говнокод на юнити не нужен, по крайней мере пока я в Норвегию не перееду. Это вполне себе один из факторов, бьющих по продажам. Может я уникальная снежинка, но почему-то кажется что не я один сношу парашу, греющую квартиру. А игры крупных издателей почему-то часто нормально оптимизированы, значит на оптимизоний спрос есть, взгляни на рдр2, дум тот же. А там ведь ещё соснолечки, на которых без байтоебства вообще никак.
>>2108317 >Там вопрос был плана "что бы такого написать на си", а писать на си надо очевидно то, где сишка с лучшей стороны себя покажет. Игровой движок это как раз такая штука, но лишь одна из многих. >Игры целиком писать на си наверное всё же не стоит, как и на крестах кстати. Не сильно жрущую игровую логику лучше реализовывать на динамических языках имхо. Двачую, простой спрайтовый движок написать на C не так уж сложно, многие кстати пишут инди- разработчики своё, да просто потому что проще в итоге выходит и в поддержке, и фишки можно реализовать уникальные, и если ты делать будешь десяток игр то это просто выгодно. Инди кстати которые на своих движках, почему то почти все успешны и игры у них круче. Сам либу писал на С графическую 2д, просто летает на 1% загрузки процессора, вот думаю ещё простую аудио- либу приделать и скриптовый движок lua и будет игровой движок. Все студии нормальные имеют свой движок, а это что то да значит.
а есть какой еще стайл гайд что-ли? вижу есть кто как в парашном камел кейсе пишут кто-то в божественном снейк кейсе, вот я люблю в_снейке_писать. мне руки не оторвут, если я на си буду тоже так делать?
я в свое время обблевался от ебаного голанга, потому что там на уровне синтаксиса публичные штуки надо с большой буквы писать
>>2108700 >а есть какой еще стайл гайд что-ли? В каждом проекте свой, выбирай из них что считаешь нужным. Я например все переменные пишу слитно в нижнем регистре, а функции с _ ебой, имена структур с Большой буквы, ну и наименования без сокращений кроме счетчиков и индексов. А вот в крестах как раз КемелКейсом, там норм.
>>2108384 Это тебе. Недавно вон в /v/ был бугурт про пикрелейтед. 8 гигабайт ОЗУ для вот этого вот, тогда как у сеги было 64 килобайта на борту. Но всё равно сожрут ведь, куда они денутся-то.
>>2108140 > а остальные приведёшь, раз уж bsearch и qsort - это единственное, что есть в стандартной библиотеке, так уж получилось. Это еще одна проблема Си - нужно переизобретать мир, даже примитивный динамический массив заново писать, тогда как в крестах все из коробки. Но не суть. Обе функции с воид поинтерами. Но остальное реализуется так же, любые сортировки, любые структуры данных, у тебя либо частная реализация, либо где-то торчит войд поинтер.
>>2108901 >Это еще одна проблема Си - нужно переизобретать мир Это не проблема. Это чистая вкусовщина и никакого консенсуса на тему что же должно быть в стандартной либе а чего там быть не должно попросту не существует (в контексте любого языка). Кому-то надо раздутую либу и раздутый язык с кучей говна к которому никогда не прикасаешься, и для него даже сишка со своими гото и волатайлами могла бы быть поменьше. >у тебя либо частная реализация, либо где-то торчит войд поинтер Либо ты генерируешь код макросами. Никто и ничто тебя не заставит копипастить код, если ты этого сам не пожелаешь.
>>2109092 Из-за ностальгии, скорее. Но эта дискуссия совсем нерелейтед.
>>2109127 Постараюсь попроще. Внутри функции result действительно выделяется на стеке. Но при этом, float2 является структурой данных, и при возврате из функции она копируется целиком. Поэтому v3 - это по факту полная копия структуры result, которая располагается уже на стеке функции main.
Проблемы у тебя возникли бы, если бы в функции у тебя было бы, например, > char string[10]; И ты бы вернул из функции char * - в этом случае при возврате скопируется только указатель на массив, а сам массив будет потерян, ведь он располагался на стеке. То же самое происходит, если ты пытаешься из внутренней функции вернуть > const char string[] = "Hello"; Механизм работы точно такой же, но при этом поскольку константный литерал "Hello" лежит не на стеке, а в секции данных, то проблем в этом случае уже не возникнет.
В Си простые типы (int, float) копируются целиком, структуры копируются целиком, а вот массивы передаются только по указателю. Как-то так.
>>2109131 ну ты боженька, спс большое, дай господь тебе долгой и счастливой жизни.
Тогда, я так понял, такие фокусы не получатся уже, если у меня в структуре будут указатели либо массивы, тогда уже под эти поля надо выделять динамическую память, иначе данные потруться когда выйду из функции? я правильно понял?
Всё верно понимаешь, но там есть ещё одна тонкость, связанная с массивами и указателями. Если у тебя есть структура > struct yoba_s { int a[4]; int * b; } И какая-то переменная этого типа, например, yoba_1. То это означает то, что у тебя есть где-то область памяти, в которой подряд идут четыре целых числа int (в структурах массивы располагаются прямо "внутри" них), а затем указатель на массив из int. Соответственно, если ты напишешь > struct yoba_s yoba_2 = yoba_1; То у тебя появится где-то на стеке вторая такая же структура, в которой будет точно такие же четыре int (опять же, структуры копируются целиком) и точно такой же указатель на массив int, указывающий на ту же самую область памяти, что и оригинальный.
Чтобы сделать полную "глубокую" копию этой структуры, тебе нужно будет после присваивания отдельно выделить память под поле b структуры yoba_2 и скопировать поле b в эту память из структуры yoba_1. В противном случае, если этого не сделать, массив a скопируется как ты ожидаешь, а вот массив b при изменении в структуре yoba_1 будет изменяться и в структуре yoba_2.
Допустим, есть функция, которая пушит элемент в конец связного списка, обращась к нему по его "хвосту": void push(int value) { __struct node_t *node = malloc(sizeof(struct node_t)); __node->value = value; __node->next = NULL; __tail->next = node; __tail = tail->next; }
При последовательном вызове push() вне цикла всё нормально - элементы добавляются в список как надо. В цикле for или while вызов на первой итерации добавляет элемент, а последующие переписывают его по тому же адресу. Объясните нубу, как это работает?
Что делать когда надо вводить много общих переменных? По ходу разработки сверху main ебнутый список образуется, где сложно орентироваться. Это нормально?
>>2109243 Ну это какбэ основной вызов программирования, что у тебя общего стейта становится больше и больше и в какой-то момент ты уже перестаёшь в нём ориентироваться. Для этого и придумывают всевозможные паттерны и парадигмы. ФП, например, минимизирует протечку стейта, декларируя что функции должны быть чистыми. ООП максимально изолирует стейт, распиливая его на кусочки и распихивая по объектам, где им сравнительно легко управлять. Вот и думай.
В общем массивы они встроены в структуру, и т. к. структура копируется полностью то и массив в ней тоже, а указатели - по сути число (адрес на память), при копировании структуры копируется и указатель, но копия указателя указывает на тот же блок памяти.
вроде даже как-то просто все фух, вот это меня осенило, спс еще раз, анончик
>>2109271 Всё верно понимаешь! Удачи тебе ещё раз в грызне гранита науки
>>2109143 Проблем не вижу, если честно. Выкладывай полный код, как вызываешь внутри цикла.
>>2109151 > tail = tail->next; > tail = node Так это одно и то же ведь.
>>2109243 Смотря чего ты пишешь, но обычно нет, не нормально. Объявляй переменные по ходу, сишка уже давным-давно позволяет так делать. Разбивай функцию main() на подфункции или хотя бы на { блоки }, объявляй локальные для блоков кода переменные внутри этих самых блоков - они не будут видны для кода вне блока. Сливай переменные в структуры, если какие-то из них по смыслу кода лучше смотрятся вместе.
>>2109471 >Проблем не вижу, если честно. Проблем и нет; после дебага оказалось, что дело вообще не в этом.
>>2109151 Да, ты прав, я тут >>2109411 тупанул немного, думая, что ты весь цитированный тобой код хочешь на tail = node заменить. Так-то конечно то же самое, но изначального вопроса это не касается.
>>2109549 я глупенький, еще раз объясните пожалуйста, только языком, понятным для аутистов почему >> tail->next = node; >> tail = tail->next; >отличается от >> tail->next = node; >> tail = node; ?
>>2109973 та всмысле? вон братишка чет спизданул, правда я нихуя не понял, там написано на эльфийском, видимо > Тем что это node->next текущего узла которое вероятно 0 или говно, ты глупенький? второй братик рапортовал что он обосрался
>>2110002 >кресты в 500 раз сложнее, Кресты кстати легче чем Си. На Сях иной раз нужно городить костыли под 1000 строк, в то время на Крестах тоже самое можно сделать через какой-нибудь темплейт с лямбдами где все это займет 200 строк.
>>2110086 Количество кода = сложность, понял тебя. Я-то думал что количество нативного языкового барахла и объём стандартной либы определяет сложность, т.к. их надо ещё изучать и знать где и как применять, но раз так значит так.
>>2110028 Чел, ты просто двух анонов перепутал. Другой анон подумал, что там в первом случае tail->next не проинициализирован. На самом деле всё инициализировано предыдущей строкой - ну ошибся, ну с кем не бывает?
Код действительно ничем не отличается, только лишь читаемостью.
Аноны, есть говнокод из >>2093997 который не делает ничего сложного(открыть порт, получить данные, записать их в файл). Вопрос, какой самый простой способ написать к нему gui( использовать visual studio?), который будет работать на семействе операционных систем win xp - win 10?
Аноны, есть говнокод из >>2093997 который не делает ничего сложного(открыть порт, получить данные, записать их в файл). Вопрос, какой самый простой способ написать к нему gui( использовать visual studio?), который будет работать на семействе операционных систем win xp - win 10?
>>2110270 Гуглишь: DialogBoxParam, сам диалог нарисуешь в Visual Studio (там можно .rc создать) или в Pelles C (100 метров вместо 6 гигов вижуалстудии) или в ResEdit (2 метра, http://rsdt.free.fr/ResEdit-win32.7z сайт https://resedit.net/ умер в этом году, есть в вебархиве).
> есть говнокод из >>2093997 Это под линукс, в винде никаких дев-тетивай нету. Нужно будет CreateFile("COMxx"...), SetCommState, Read/WriteFile, возможно WaitCommEvent, вот это все.
>>2110247 да я дейсвительно братишек перепутал, с кем не бывает на двоще
>>2110076 да братик, я не доебался, я за тебя распереживался я тоже обосрался, еще хуже чем ты, я братишек перепутал, за что категорически извиняюсь вообще-то обидно было, что ты нахуй послал меня
в общем откопал тест фреймворк criterion написал функцию, написал для нее юнит тест он в общем упал, ну и хер бы с ним, решил подебажить достаю гдб натравливаю на тест, ставлю бейкпоинт на свою функцию, а эта падла как-то хитро либо в тредах либо хуй пойми как запускает, что мой брейкпоинт не срабатывает в общем нужна хелпа с гдб, почему не работает брейкпоинт
>>2111463 нашел у них ишью на гитхабе, можно с агрументом --debug запустить бинарник с тестами и с гдб удаленно подключиться и дебажить, но гемор тот еще. а я только в виме настроил гдб, а тут через какую-то шляпу надо запускать. Нормально что-ли сделать нельзя было. Эх, горе конечно ( хотелось бы найти способ чтобы просто скормить тесты гдб и стопнуться на брейкпоинте
>>2111511 хз, тип хочешь подебажить в определенных условиях функционал свой, написал тест, нужные аргументы проставил, вызвал метод, брейкпоинт поставил и погнал, удобно. Я так на рубях привык, тут даже дело не в тесте, а именно в возможности продебажить, нашел пофасту свой тесткейс, брейкпоинт поставил и погнал. да и на будущее юнит тесты остаются, полезно тоже
А что, на си нет культуры тесты писать? мне кажется как раз наоборот, на каком нибудь питоне или руби можно хуй забить, а в си надо.
>>2111514 >хз, тип хочешь подебажить в определенных условиях функционал свой, написал тест, нужные аргументы проставил Все правильно, но на Си писать тесты это жопа, бери любой скриптовый язык который может с Си. Я в обще все на Перле прототипирую, потом на Си перекидываю. Си это ммм, вишенка на твоем разработанном и отлаженном торте.
>>2111514 > А что, на си нет культуры тесты писать? Это не культура, это бескультурие. Лучше потратить время на написание качественного кода, вместо кучи некачественных тестов. Вообще, достаточно сделать отдельный main с ассертами внутри #ifdef TEST, какие еще нахуй фреймворки.
>>2111548 >Это не культура, это бескультурие. Лучше потратить время на написание качественного кода, вместо кучи некачественных тестов. я же говорю, что для дебага, как ты можешь написать качественный код не отладив его? и почему идет сравнение качественного кода и некачественных тестов, все равно что сравнивать свежий кексик с черствой печенюхой.
>Вообще, достаточно сделать отдельный main с ассертами внутри #ifdef TEST, какие еще нахуй фреймворки. ну можно и так, я ж поэтому и спрашиваю, как принято. В рубях тоже можно сделать test.rb файл и в нем ебошить что-то типо raise "Test failed" unless actual == expected но никто же так не делает. Да и вон видишь как допустим этот тест фреймворк тесткейсы запускает, в потоках или форках хуй знает, видимо изолирует как-то их друг от друга. Хотя я подозревал что в си сидят суровые дядьки с компилятором в голове, и они не отлаживают, они видят все проблемы сразу как только посмотрят на код Но я же не такой (( пока)
>>2111517 не понял немного подхода, ты тип пишешь на перле и потом все на си переписываешь? либо какой-то функционал переписываешь на си, но в общем это все равно перл? и как это спасает от написания тестов?
>>2111679 > почему идет сравнение качественного кода и некачественных тестов Потому что тестировать strlen("x") == 1 глупо. Чтобы в тестах был смысл, нужно увидеть и проверить граничные условия и специальные случаи. Если ты их не видишь или видишь не все, то твои тесты некачественные. Это во-первых.
Во-вторых, вот у тебя есть код: int values[3] = {0}; for (i = 0; i <= 3; i+=) values += 2; Вот ты написал тест, assert, memcmp, все дела и пошел спать довольный. А завтра у тебя код падает, тест работает. Или наоборот. А потому что в Си есть UB. Это скорее всего та причина, по которой твой фреймворк запускает тесты в потоках. Но потоки все равно ничего не гарантируют, на то оно и UB.
>>2112397 да я согласен что юнит тесты вообще не дают никаких гарантий. Я на практике это знаю. но ты просто так говоришь что вот не будешь ты писать тесты, и код качественней станет за счет того что ты больше времени на него потратил. я с этим категорически не согласен. Во первых тебе все равно надо как-то прогнать/запустить то что ты написал, как ты можешь быть увереным в том что код твой рабочий, если ты его не запустил. Юнит тесты отличное этому применение, я для этого их и юзаю, а не для уверенности что я обработал вообще все состояния и исходы. Во вторых пока ты тестишь вручную, по сути тоже самое что и тестами, только в случае тестов, они у тебя остаются на будущее. В случае какого-то рефакторинга, добавление каких-либо данных или фичей старые тесты помогут понять не сломался ли старый функционал, как минимум то что было покрыто. Да и как по мне когда у тебя описаны основные кейсы тестами то отладка ускоряется, тебе всего лишь в нужное состояние надо брейкпоинт вставить, и сиди колупай что происходит. Сам тест написать не сложно, хуле вызвал ассерт свою функцию что ожидается. Разработка как по мне ускоряется когда рука набита тесты писать.
>>2112476 > как ты можешь быть увереным в том что код твой рабочий, если ты его не запустил Я сейчас скажу страшную вещь, адепты TDD от нее рвутся обычно. Ты не поверишь, но я свой код читаю. В особо сложных случаях (реализации алгоритмов, а не перекладывание байтиков из одной переменной в другую) еще и комментирую возможные входные данные и реакцию на них, потому что спустя полгода нихуя не очевидно, почему оно написано именно так.
> старые тесты помогут понять не сломался ли старый функционал Вот это реальный юзкейс, но рефакторинг еще не факт что будет. Это как с избыточными абстракциями в ООП: чаще всего интерфейс не имеет больше одной реализации, код не переиспользуются, но все равно пишется куча ненужного кода на тот невероятный случай, если вдруг когда-нибудь понадобится сделать что-то странное. Будет рефакторинг - тогда придет время писать тесты (для публичного апи), без этого никак. Не будет - останется больше времени на написание кода.
>>2112532 >Ты не поверишь, но я свой код читаю. ну я так пока не могу, я только вкатываюсь в си. я не могу быть уверен на 100% что я написал код, который работает как надо, просто потому что у меня опыта на си толком нет. и я не адепт TDD, скорее R(epl)DD, но так как репла в си нет, я пытаюсь сделать реализацию, запустить ее с какими-то входными данными и пройти в гдб по шагам. Но запускать мне проще через тесты, чем все время менять тело main функции, да и других причин хватает. Возможно я пытаюсь применить подход не применимый к си.
>>2112624 Тесты не нужны, я живу активной и полноценной жизнью. Каждая отладка занимает 20 минут. А потом я иду писать void ptr, я не писал void ptr неделю!!! Пойду попишу.
>>2112624 Тесты не нужны, я живу активной и полноценной жизнью. Каждая отладка занимает 20 минут. А потом я иду писать void ⚹ptr, я не писал void ⚹ptr неделю!!! Пойду попишу.
>>2112624 Тесты часто проверяют банальщину, что тратит время, а сложное протестировать ты всё равно не сможешь, ибо обычно прогер всё проверяет на работоспособность и если ошибка возникает, то она такой сложности, что ты заебёшься придумывать тест для неё.
>>2113177 Так, как будто никакого UTF-8 не существует. Он вполне прозрачен, особенно пока твоя обработка ограничивается ASCII-символами (ну там путь к файлу по слешам порезать или текст на строчки разбить). Если нужно будет всякое там регистронезависимое сравнение, возьмешь ICU уже по-взрослому, но обычно это означает гораздо больше ебли с юникодом, чем ты можешь себе представить.
>>2113185 > часто проверяют банальщину Не банальщину, а edge cases, чтобы при очередном рефакторинге тебя банальной off-by-one error по невнимательности не убило нахуй. > сложное протестировать ты всё равно не сможешь Сложное руками тестировать не нужно, для этого есть fuzzing. Руками нужно тестить то, на чем уже погорел, т.е. удостовериться, что все найденные баги действительно пофикшены. > если ошибка возникает, то она такой сложности, что ты заебёшься придумывать тест Это указывает на проблемы в дизайне кода. Функции надо делать размером поменьше, абстракции попроще, а state локализовывать. какие же сишники дегенераты, пиздец, подумать только, я лет 10 назад сам таким же был
>>2113521 > edge cases Я уже говорил об этом выше. Если знаешь, что тебя тут может ебануть - проще перепроверить условие, а не писать тест. Если не знаешь или предполагаешь неверно - и код, и тест будут неверными.
> fuzzing Это называется рандом. Или найдет проблему, или не найдет. Второе вероятнее, зато можно говорить работодателю модные слова и уверять, что ты не занимаешься хуйней вместо написания кода.
> Функции надо делать размером поменьше Начинаются своих макконнеллов, а потом у них хром с одной вкладкой тормозит. Надо, да. Еще бы это было всегда возможно, вообще было бы здорово.
>>2113548 Ты ему про Ерёму, а он тебе про Фому. > Если знаешь, что тебя тут может ебануть - проще перепроверить условие А если не заметишь и проебёшься? А если это не твой код, и ты не знаешь? Такими темпами и код-ревью давай в пизду, а то что время на какую-то хуйню новомодную тратить, кабану код выкатывать ещё вчера. Прелесть тестов именно в том, что то, что ты предлагаешь можно автоматизировать: вместо того, чтобы всем постоянно делать это вручную, достаточно запрограммировать один раз. > Если не знаешь или предполагаешь неверно - и код, и тест будут неверными. Это всё детский максимализм. Вот у тебя и еще сотни разработчиков проект на 10 миллионов строк, какая-нибудь залупа из твоего кода дергает функцию, написанную 10 лет назад чуваком, который уже помер, а она тормозит. Можно пойти, выбросить к хуям так любимые сишниками связанные списки и воткнуть туда хеш-таблицу. Тебе не надо тратить время и разбираться как эта функция работает, тебе лишь интересно убрать десяток миллисекунд латенси в своей API или что там у тебя. Если функция покрыта тестами, то у тебя на подобный фокус уйдет минут 15, дальше ты можешь дальше идти заниматься своими делами, а иначе нужно сидеть и изучать бизнес логику, играть сам с собой в виртуальную машину и т.п. Нахуя? Ну ок, вот решил ты полностью переписать этот старый кусок говна. Молодец, а что дальше? А дальше, если у остальных есть тесты, то быстро всплывет, что то, что ты посчитал в коде придурью и выбросил за ненужностью оказывается было необходимо для какой-то хитрой ебанины, про которую ты вообще раньше и не слышал даже. Проблема, безусловно, в ебанине, которая, возможно, неверно понимает контракт, но фишка в том, что баг удалось поймать до релиза. А не было бы тестов - уронил бы прод, потому что полез своими ручонками куда не следует.
>>2113521 >Функции надо делать размером поменьше Это вот эти вот легендарные погромисты "мам функция слишком длинная, разделю-ка я её на три и вызову их последовательно, ну и что что они у меня больше нигде в программе не вызываются", превращающие нормальный структурированный код в лапшу.
>>2113624 Все с точностью до наоборот: превращают лапшу в структурированный код. Банально потому, что у функций есть осмысленные человекочитаемые имена. Но меру тоже надо знать, это да. Писечка, конечно, вся именно в правильно выбранных абстракциях и композиции.
>>2113642 >у функций >осмысленные человекочитаемые имена Более читаемые, чем комментарии в длинной функции? Сильно сомневаюсь, что названия функций способны достичь такого уровня читаемости, которого способен достичь обычный английский (да и любой человекочитаемый) язык, со всеми словоформами и знаками препинания. Если по замыслу большое количество кода выполняется последовательно (например инициализация в игре или ещё где), то так оно и должно выглядеть, представление же длинной последовательности кода в виде лапши снижает читаемость и вводит читателя в заблуждение — если некая часть длинной функции изолирована, ты заставляешь человека держать в голове, что эта функция может вызываться откуда-то ещё, и ему прежде чем исправить баг в твоём коде придётся ещё всю лапшу изучить и убедиться, что это именно лапша а не хитровыебанный код, в котором можно что-то поломать.
>>2113739 > чем комментарии в длинной функции Возможно, я для тебя сейчас сделаю великое открытие, но комментарии зачастую являются индикатором как раз-таки хуёвого кода. В самих комментариях, разумеется, нет ничего плохого (за исключением того, что на практике их никто никогда не поддерживает, и, как следствие, они мгновенно протухают), это именно недостаток экспрессивности твоего кода, что толкает на их написание. Пиздатый код выезжает уже на грамотном именовании сущностей, не зря шутка про two hard things in computer science ни хуя не шутка. Исключениями являются docstrings, пояснения за контринтуитивные вещи (с номером бага, ссылкой на литературу и т.п.) и пруфы указанной асимптотики или корректности кода.
>>2113739 И да, забыл добавить. > ты заставляешь человека держать в голове, что эта функция может вызываться откуда-то ещё Это глупость, не надо так думать. Функция это просто последовательность команд. Точка. В идеале она должна делать ровно одну вещь и её контракт (вход, выход, внутренний стейт включая эксепшены) должен быть предельно понятен. Если что-то имеет права быть функцией, оно должно быть функцией, и похуй, что она вызывается в одном месте. Сегодня в одном, а завтра дохуя где. Ты код для людей пишешь, а не для компилятора. Компилятору поебать, он все эти функции заинлайнит, если имеет смысл. > придётся ещё всю лапшу изучить и убедиться, что это именно лапша а не хитровыебанный код, в котором можно что-то поломать Для предотвращения ровно этого и нужны юнит-тесты, лол.
Так-так, тесты не делаем, комментарии не пишем, всё нужное помещаем в одну большую функцию void zdelat_zaebis(), и вызываем её один раз. То есть тратим всё время на написание кода, а не на эти всякие шуры-муры бесполезные. Я все правильно усвоил? Кто-то из вас уже готов меня нанимать?
>>2113852 >Возможно, я для тебя сейчас сделаю великое открытие Возможно я после этих слов пост просто скрою. Хотя какое "возможно" — так и сделаю. Оставь свои великие открытия при себе, когда о них не просят.
>>2114013 Понятия не имею, причём тут твоё горение, на самом деле. Ну просто вот взял и порвался. Кто-то попрал твою догму, а ты загорелся, судя по всему. Тред предполагает дискуссию, а не грустные попытки в троллинг с горелой жопой. Потушись сначала, а потом уже отпускай саркастичные комментарии.
>>2113616 > Если функция покрыта тестами, то у тебя на подобный фокус уйдет минут 15 И об этом я тоже уже писал. Если тебе надо трогать чужой код, ты можешь покрыть его тестами предварительно. Именно если, потому скорее всего то, что ты усираясь покрывал тестами, будет выкинуто через пару лет целиком вместе со всеми тестами. Я видел очень много разнообразных "заделов на будущее", и практически никогда они не использовались.
>>2113852 > комментарии зачастую являются индикатором как раз-таки хуёвого кода Давай ты нам напишешь что-нибудь нетривиальное: какое-нибудь сжатие или обработку сигналов с кучей математики, и мы посмотрим на твой хороший и понятный код, в котором нет комментариев, зато есть охуенные понятные имена функций. И еще на то, как ты в имени константы опишешь, почему она равна двум, а не трем. Вся эта хуйня с двустрочными функциями (заголовок и return) - это когда ты на жабке из одного сервиса другой дергаешь. А когда ты начинаешь писать программы, а не прослойки и обертки, комментариев вполне может быть строк по десять на одну строчку кода.
> пояснения за контринтуитивные вещи То есть практически весь код, который что-то делает. И так как мы тут пишем на сишке, а не на жабе, у нас такого большинство.
>>2113863 > внутренний стейт включая эксепшены А, ну точно жаба, так бы сразу и сказал.
>>2113852 Вижу что Фаулер у тебя от зубов отскакивает, молодец. >>2113863 >Это глупость, не надо так думать. Функция это просто последовательность команд. Точка. Глупость это как раз твоя проповедь. Вот есть в ЯП такой выразительный инструмент, как процедурная абстракция. Где-то его нет, а у тебя он есть. Как его применять? Ну наверное когда у тебя копипаст кода начинается, а ты такой херак пишешь функцию и вызываешь её во всех тех местах, где у тебя была копипаста. Как ты его предлагаешь применять? Ты предлагаешь написать функцию и тут же её вызвать единственный раз и больше никогда нигде не вызывать. Можно ли так сделать? Кто ж тебе запретит. Нужно ли? Для этого надо ответить на вопрос "чем это будет лучше, чем если ты комментариями пояснишь что у тебя делает кусок кода?" Для меня ответ "ничем", причём функция даже хуже, т.к. в её названии особо не разгуляешься. Дальше копипастишь хуйню из книжки фаулера: >за исключением того, что на практике их никто никогда не поддерживает, и, как следствие, они мгновенно протухают Скажи мне, а чем в этом отношении название функции лучше комментария? Типа комментарий можно не поддерживать, а название функции не поддерживать нельзя? А кто тебе запретит? Ну точно так же влезешь ты или кто-то ещё в твою функцию, сделает так, что она будет делать совершенно не то, в честь чего названа, и какой тест тебе это поймает? >В идеале она должна делать ровно одну вещь Что понимается под одной вещью, о великий гуру? Так-то даже функция возведения в квадрат не занимается никакой одной вещью, ведь возведение в квадрат можно представить как умножение числа само на себя (а это ведь одна вещь), ну а умножение по крайней мере в контексте целых чисел можно представить как суммирование, что является не одной операцией, а последовательностью операций. Вся эта хуйня про одни вещи дико субъективна, а я не должен заниматься философией во время программирования. Если книжка просит меня становиться философом во время программирования — это плохая книжка. >Если что-то имеет права быть функцией, оно должно быть функцией А что понимается под "иметь право"? Я не только философом, но ещё и юристом должен быть? >Ты код для людей пишешь, а не для компилятора. Ну а комментарий для кого пишется, сладкий, для компилятора разве?
>>2114026 > Если тебе надо трогать чужой код, ты можешь покрыть его тестами предварительно. Блядь, что ты несешь, ты же просто поехавший. > Давай ты нам напишешь что-нибудь нетривиальное Давай ты не будешь передёргивать: про наукоёмкие вещи я написал двумя предложениями дальше твоего гринтекста. Ссылку на whitepaper в комментарии оставить за милое дело. > И так как мы тут пишем на сишке, а не на жабе, у нас такого большинство. Возьми репу любого Пинус-дистра и подсчитай сколько долей процента сишного кода приходится на сжатие или обработку сигналов. > А, ну точно жаба, так бы сразу и сказал. У тебя какая-то нездоровая фиксация на жабе. Эксепшены с раскруткой стека есть в десятках если не сотнях языков, начиная от крестов, заканчивая питухоном. >>2114109 > Вижу что Фаулер у тебя от зубов отскакивает Понятия не имею кто такой и чем знаменит. > Как его применять? Ну наверное Свое наверное себе в жопу засунуть можешь. > Типа комментарий можно не поддерживать, а название функции не поддерживать нельзя? На практике так и выходит, на поддержку комментариев даже при наличии код ревью все забивают хуй, и уже спустя пару лет от них больше вреда (т.к. дезинформируют), чем пользы. > Что понимается под одной вещью, о великий гуру? Иди перечитывай SICP, там во всех примерах практически эталон того, как надо писать код. Если ещё ни разу не читал, просто уёбывай с этой доски, сука. > Ну а комментарий для кого пишется, сладкий, для компилятора разве? Зачем вы такие тупые? Я же написал: в самих комментариях нет ничего плохого, но зачастую это индикатор того, что у твоего кода недостаток экспрессивности, что, собственно, и толкает тебя на их написание. Вместо этого нужно подумать ещё раз правильно ли выбраны абстракции и хорошо ли согласована схема именования сущностей.
>>2114494 > Ссылку на whitepaper Ни разу не дает понимания того, как именно ты это реализовал и почему именно так.
> подсчитай сколько долей процента сишного кода приходится на сжатие То есть написать в коде драйвера, почему мы тут блокируемся, а тут никакой гонки быть не может по определению, нельзя, потому что недостаточно наукоёмко?
> У тебя какая-то нездоровая фиксация на жабе Ладно бы жаба, так ты еще и лисп принес. Жаба - отличный пример языка, где исключительно по экономическим (не техническим!) причинам отношение количества логики к количеству классовметодов стремится к нулю.
> на поддержку комментариев даже при наличии код ревью все забивают хуй Ну конечно. Может быть, потому что слишком долго обсуждали на ревью, правильно ли названа функция, и не стоит ли ее разбить еще на три?
>>2114867 Почему ты уверен в своей правоте, когда эти переносы и были придуманы для тогл, чтобы не запутываться. И миллиарды людей ими пользуются именно по этой причине. Но появляешься ты, и считаешь, что все вокруг идиоты.
В общем случае нихуя не ускоряет (context switching же). И нужно больше не для этого, а для того чтобы выполнение одной задачи не блокировалось выполнением другой в real-time ПО типа физических движков, где при однопоточности программы движущиеся объекты обновлялись бы неравномерно; или в тех же апишках, где из-за очень тяжелого метода запросы на другие висели бы до ослиной пасхи.
Чтобы сформировать большой массив bigdata для дальнейших нужд, но возникает проблема - данные в нем не копятся, а размер самого массива не растет. Вопрос как мне собрать данные в один массив при условии что я не знаю его конечного размера.
>>2115930 Это не си, а кресты, и тебе буфер наполнения данными надо создавать где-то уровнем выше, скорее всего в конструкторе класса, а не в функции приема данных.
Господа, есть неделя на изучение чистого C, из языков знаю только Python и JS, Что кто может посоветовать для максимальной скорости? Не буду подробно описывать ситуацию, просто срочно надо изучить, уделять буду часов по 10 в день. От себя: Точно прочитаю книгу "C Programming Language", больше ничего в голову не приходит. нужно максимально быстро с нуля за неделю научиться писать нормальный код на чистом C
>>2030872 >вагона знаний Это какого же, интересно? Я на чистом Си (без крестов) писал в 12 лет для DOS. Там не нужен ни матан, ни теория категорий, ни лямбда-исчисление. Си и Ассемблер - языки для тупых даунов, которые не могут осилить функциональное программирование.
подскажите книженцию для 3 попытки вката в Си. в первый раз пробовал по книге кернигана и ричи, забросил, дальше была подробная и объемная книга стивена прата, до какого места там продвинулся не помню, но продвигался по ней медленно и мучительно, хотя книга на самом деле мне нравилась, т.к. там описывались низкоуровневые штуки. такая ситуевина, стоит ли снова кернигана и ричи читать? я туповат для тамошних заданий которые продвинутого уровня. мог долго сидеть и просто тупить в экран или что-то похожее. судя по воспоминаниям хочется сказать что у меня математическая/алгоритмическая база не очень хороша для них. . извиняюсь за мелкобукву и несвязность мыслей, я - еблан.
>>2117415 сори за правду, но походу Си это не твоё. Пробуй дальше Прату. По кернигану и ричи у тебя выйдет хуёво, там нужно прям хуярить на мотивации, а ты тут забрасываешь.
>>2117443 Если прата и в правду не нравится, то тогда можно совершить небольшое отступление во время и почитать книгу дейтелов (https://vk.com/doc7608079_448866001) так то по сути тоже 1000 страниц, но упражнений больше чем в прате. Короче главное - чето делай.
Если тебе вот хуево поставь себе цель каждый день или через день садится читать главу и осиливать упражнения. Прочитал, сделал - пиздуй делать другие дела, в игорьки там поиграй. Мотивация хоть и важна кодеру но на ней далеко не убежишь, нужна дисциплина(как в армии)
>>2117396 ну не всем же быть такими невероятно пиздатыми как ты кстати, какого хуя ты тогда тут с тупыми даунами сидишь? пиздуй в тред по хаскелю для вундеркиндов, который сдох и его не перекатывали когда тебе еще 12 лет было
>>2117390 так доп переменные наоборот добавляют негигиеничности же?
я наверное просек почему на самом деле, если закидывать в макрос какое-нибудь выражение, или вызов функции, то она буудет вызвана 2 раза при #define max(a,b) (a) > (b) ? (a) : (b), а если выражение с сайд эффектом то тогда вообще попизде может все пойти
>>2117415 Не очень понятно, что учить в Си, язык простой. Из зубодробильного там разве что какие-нибудь сложные типы указателей, указатели на функции со сложными параметрами и т.п.
В целом язык о том, что просто берёшь и пишешь. Если умеешь программировать, то сможешь писать на Си.
Но вот программировать надо учиться, конечно. И ещё поправку делать, что на Си в основном всякую низкоуровневую системную хрень делают, надо чтобы к этому душа лежала.
чет почитал про дженерики в си - имхо это какая-то шляпа. это просто какой-то свитч кейз для типа переменной. и примера на пике все равно же придется писать миллиард имплементаций для каждого типа. Или эт пример хуевый и я не понял истинной мощи это залупы?
>>2117682 Это не полноценные дженерики, это просто способ писать acos(value), не задумываясь о типе value. Но реализации - да, сам. Обычно, если типы скалярные, реализации не сильно отличаются и поэтому делаются макросами или инклудами: #define STREAM_IMPLEMENT(type) \ bool stream_write_##type(stream ∗s, type value) { ... } \ bool stream_read_##type(stream ∗s, type ∗dest) { ... } \ // и потом: STREAM_IMPLEMENT(int) STREAM_IMPLEMENT(double)
Либо ты можешь сделать отдельный файл с реализацией: // some_impl.tpl.h bool stream_write_##type(stream ∗s, type value) { ... } bool stream_read_##type(stream ∗s, type ∗dest) { ... } #undef type // и потом в каком-нибудь main.c: #define type int #include "some_impl.tpl.h" #define type double #include "some_impl.tpl.h" Результат ничем не отличается от макроса. Инклуд удобнее, когда кода много (нет ебли с \).
И вот потом уже ты можешь автоматически выбирать с помощью _Generic из stream_write_int и stream_write_double в зависимости от типа значения и писать просто stream_write, а он уже там само. Но особенного удобства это не добавляет, да и все равно все вышеперечисленное - это очень кривые костыли. Включая сам _Generic.
>>2117782 с инклюдами прикольную тему ты рассказал, почти как шаблоны в плюсах, только вручную #define type int регистрировать типы надо. но в целом да, собирать надо залупу какую-то из говна и палок.
>>2117396 >Си и Ассемблер - языки для тупых даунов, которые не могут осилить функциональное программирование Мне всегда наоборот казалось — фп чистое и понятное, а в си и тем более ассемблере стейт распидорашивается по всей программе и мгновенно становится непонятно что у тебя откуда взялось. Недаром про Forth говорят что он write-only. А люди типа Криса Касперски всегда вызывали глубочайшее уважение своей степенью аутизма, позволяющей им разбираться в дизассемблированных экзешниках, даже не будучи их авторами. Тут свой же собственный высокоуровневый код через полгода читаешь как в первый раз, а эти титаны ковыряют чужой ассемблер.
>>2118285 >врети Посмотри стату не на хабре, а в любом другом месте, результат будет примерно такой же. Прогеры на Си действительно зарабатывают меньше всего.
>>2118370 >Посмотри Ну посмотрю, отчего ж не посмотреть https://lvivity.com/top-highly-paid-programming-languages >перл на первом месте >джава и пыха ниже сишки >сша >сишка топ 8 Сдаётся мне, что все эти сраные графики пиздец какие условные, если не откровенно с потолка взятые.
>>2118399 Настолько привык самоутверждаться на дваче, что даже не заметил >в скобках можно блоки кода хуячить Дед, я прекрасно понимаю, как работает препроцессор. Я просто не знал, что можно полноценный блок кода со своими локальными declaration, statement и т.д. сделать внутри выражения, и последний expression statement станет значением выражения. Даже мысленно всплакнул по всем этим штукам, когда целые дни валял дурака на иждивении у родной матушки, а не работал не крестах.
>>2118400 1) Во-первых, речь шла о зарплатах разрабов в Россиии. 2) Во-вторых, даже в твоей ссылке восьмой он только "at the US". А в "According to Developer Survey Results 2020, conducted by Stack Overflow" он 4-й снизу.
>>2118584 > А в "According to Developer Survey Results 2020, conducted by Stack Overflow" он 4-й снизу. Я не слепой, я обратил внимание на то, что там все остальные языки переместились в рейтинге на десятки позиций, и >джава и пыха Те самые, которые у русни якобы были в топе, оказались >ниже сишки которая внизу. И всё это навело меня на мысль, что рейтинги эти копирайтеры сочиняют.
>>2118406 Чел, не проецируй, я не настолько чмо чтобы подобного рода >>2118399 шутки были для меня "самоутверждением", было желание про жирную мамашу пошутить и пошутил. Не надо там такое значение придавать будто я тебя хотел унизить, лол, нахуй ты мне нужен унижать тебя ещё.
вот учу сейчас си, скучно пиздец, через силу смотрю туториалы, про чтение книг вообще молчу. думаю, может заказать с Алика какой нибудь Ардуино и по чужим проектам попробовать чтот-то своё сделать, а походу уже учить теорию. так хоть движуха какая-то будет
>>2118850 >вот учу сейчас си Зачем? Си самый низкооплачиваемый язык в России эвар >>2118158 лучше выбирай языки которые хорошо оплачиваются и по которым есть много вакансий, вроде тех же Go, JS и Java.
>>2118906 >Зачем? Попытка не быть быдлом. Ведь сколько бы ни платили, эти жс, пхп, жава, шарп и т.д всего лишь макакины скрипты. Даже если на словах пациент яро отрицает, в глубине души всё равно понимает, вот и стремится вылезли из помойной клоаки, а значит в си. Это что касается "почему?".
То, что такие попытки обречены на провал, это немного другой вопрос. Постосту говоря, люди не меняются. Если родился макакой, неизбежно вляпаешься в макакинфы скрипты ради денег, и никуда больше от этого не денешься до гроба. А кто родился человеком, придет в си естественным образом, так что "вкатываться" не требуется.
я имено тот макакен про которого ты говоришь. работаю на руби, и понимаю что это дно. но не вкатываюсь ни во что другое нормальное, потому что даже если и смогу перекатиться, то потеряю нормально так в зп.
вот недавно пришел в си. мне нравится, хотя думаю мне мозгов не хватит полноценно вкатиться. так что наверно останусь все-таки макакой
>>2119134 Нет конечно, давай сначала кампутер сайнс учить неск лет, потом микропроцессорную технику, потом асм и паскаль/си, потом теорию алгоритмов и данных, и только потом учить жс. Только вот за это время ероха просто пройдет курс по жс, вкатиться и станет мидлом, пока славка сычев будет тратить время на "саморазвитие".
>>2119037 Такие рассуждения хороши только когда ты малолетний долбоеб и сидишь на шее у мамши, а когда станешь взрослым поймешь, что люди программируют не ради программирования или каких-то своих принципов, а ради денег. > стремится вылезли из помойной клоаки Так они уже выползли из помойной клоаки, потому что нормальные специалисты с многолетним опытом по этим языкам имеют те самые 300к, квартиру в нормальном районе или хороший дом, дорогой автомобиль, могут позволить себе все что нужно для нормальной жизни. А в помойной клоаке живут С/С++ программисты которые за зарплату польского дворника пашут с переработками на кабанчика в офисе, где зимой нет отопления а летом кондиционера, живут на шее у родителей или отдают половину за аренду, добираются на работу в общественном транспорте или на б/у-шном корыте или того хуже, жигулях, и терпят это, потому что если уволяться будут нахуй никому не нужны, а здесь хотя бы стабильно платят, вот где помойная клоака. Зато в отличии от тупых скриптомакак они заняты великим делом - ебут байты указателями! А у тебя еще есть шанс не влезть в эту помойную клоаку.
>>2119499 Долбоёб — твой отец. Твой аргумент уничтожили не выкладыванием зарплаты по чему-либо, а демонстрацией того, что эти статейки друг другу резко противоречат — а значит, либо они все неверны, либо одна из десяти тысяч верная, и у тебя нет никаких оснований утверждать, что та самая одна из тысячи — именно та что ты принёс.
>>2119592 >Твой аргумент уничтожили не выкладыванием зарплаты по чему-либо, а демонстрацией того, что эти статейки друг другу резко противоречат — а значит, либо они все неверны, либо одна из десяти тысяч верная, и у тебя нет никаких оснований утверждать, что та самая одна из тысячи — именно та что ты принёс. Хорошо, где по твоему достоверная стата по зарплатам в России? На hh.ru? Так она идентична той, что представлена на хабре.
>>2119594 ой блять как будто рокет сайнс , дерево развренуть ахаха потренеруется перед этим решать задачки для собесов вроде чернобелых деревьев и сортировки пузырьком и всего делов