Это копия, сохраненная 9 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/, https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №57: http://arhivach.ng/thread/563334/
- №58: http://arhivach.ng/thread/573804/
- №59: http://arhivach.ng/thread/597021/ >>1754859 (OP)
Несколько сотен миллиардов не будет, а 50 тыс строк — вполне будет. Так и наберется пара тысяч анонов на весь мир, которые в итоге все что будет нужно перепишут.
Тут еще сложно определиться, считать ли Сиси++/Си-с-классами/Си-с-расширением-cpp крестами или няшной.
Все что компилирует компилятор крестов это кресты. А личные шизоклассификации никому не нужны, они у каждого свои.
Я просто помню сколько было только книг по ним. И сколько приложений с говноформами на дельфях и вижуал бейсике. В каждой фирме по нескольку было.
Или вот например COBOL который в банках
Bank of New York Mellon, he is responsible for the health and welfare of 112,500 Cobol programs, 343 million lines of code, that run core banking and other operations.
Так это только ОДИН банк. Понимаешь?
Все равно прикладного кода написано в разы больше, чем системного. А если вспомнить, в каком стиле принято писать например на Java, то по такой синтетической метрике как LOC она улетит очень далеко вперед тупо на бойлерплейте
> 50 тыс строк
>за 3 года двачевания капчи в нии
Нафиг ты там пахал как не в себя? Тебе там что, 70к платили?
Поясните, откуда появились зумерки, дрочащие на стандарты и UB?
Раньше, во времена дидов, прогали так - прочитаешь K&R, изучишь стандартную библиотеку, порешаешь задачки и вперед прогать. Диды писали качественный код (в стиле MISRA C) который будет одинаково работать на любом компиляторе и легко читается.
Сейчас же зумерки обмажутся своими стандартами, а потом пишут нечитаемый говно-код, аля:
Z = (X >= Y & Z) ? X * Y + Z : X + Z / Y | Z;
а когда им говоришь, что их код - говно, то они возмущаются и говорят "здесь все по стандарту, ты не шаришь, иди читай стандарт, чтобы понять, что я написал".
Не пойму, откуда они взялись, они перекатились в Си из Джавы или из новомодных параш типо Го и Раста?
>Диды писали качественный код (в стиле MISRA C) который будет одинаково работать на любом компиляторе и легко читается.
Ха-ха-ха. Какой бесстыдный манямир. Не обманывай зумеров, урод. То, что какой-то старый код качественный - это ошибка выжившего. За 30 лет хороший и нужный код почистили, а вот те залежи говнокода так и остались в истории.
>а потом пишут нечитаемый говно-код
Диды в их возрасте время писали что-то типа
void initcializacia() {
int peremennaya1, peremennaya2, peremennaya3;
//200 строк кода
if (peremennaya1 >= peremennaya2 & peremennaya3)
peremennaya3 = peremennaya1*peremennya2+peremennaya3
else
peremennaya1 = короче ты понял
Как же я ненавижу даунов, которые реально думают, что они родились уже опытными кодерами и всерьез сравнивают себя со школьниками.
>откуда появились зумерки, дрочащие на стандарты и UB?
с хабра
>Z = (X >= Y & Z) ? X * Y + Z : X + Z / Y | Z;
Эта хуйня иногда компилятором лучше оптимизируется чем цепочка ифов.
деды не были security aware от слова совсем. Деды писали код, который могла взломать даже тупая обезьяна.
Что-то типа такого:
char buffer [228];
gets(buffer);
Когда у людей открылись глаза на то, что можно делать нехорошие вещи таким образом (уже во времена зумерков), то эти самые зумерки начали писать куда более чистый и безопасный код, нежели пердеды.
Твои программы дидов были по сегодняшним меркам почти идеально защищенными, ибо машины не были подключены к сети круглосуточно, как теперь. Тогда такой стиль кодирования грозил разве что багами и сегфолтами.
>Диды в их возрасте время писали что-то типа
program abc;
uses crt,graph;
var a,c,d:integer;
begin
a:=100;
b:=200;
d:=300;
writeln('otsosi u programmista');
end.
>Z = (X >= Y & Z) ? X Y + Z : X + Z / Y | Z
Для дедов это было читаемо и абсолютно понятно, потому что они попросту обладали бо*льшим математическим бекграундом, чем современные макаки, и нотация выражений ими воспринималась очень легко.
>читаемость
Это по большей части мем, придуманный корпоративными погонщиками в годы первых бумов программирования, просто простой способ увеличить эффективность макаки, и при этом уменьшить ее ценy. Естественно писать понятно важно, но зумерки и сами не очень понимают почему.
Да это и сейчас читаемо и понятно, хз у кого могут быть с этим проблемы, может у школьника с дефицитом внимания у которого моск не может сосредоточиться на одном символе и взгляд начинает скакать туда-сюда?
Еcли коpотко
ДЛЯ TЕX, КTО НЕ ПОНЯЛ, что cейчac пpоизошло - объяcню нa пaльцax: пpедcтaвьте вы пpиxодите нa cобеcедовaние водителем гpyзовичкa в Мaгнит
1. Cнaчaлa тебя мyчaют вопpоcaми, почемy мaшинa едет вообще, можно cлегкa cпpоcить физики об yгловой cкоpоcти пpи движении нa выпyклом моcтy, дaдyт пpоcтyю зaдaчкy вычиcлить ее для опpеделенной кpивизны моcтa и cкоpоcти гpyзовичкa
2. Зaтем вопpоcы по ycтpойcтвy гpyзовичкa: кaк пеpебpaть движок или cнять коленвaл. B целом, ты когдa-то этим зaнимaлcя или влaдеешь нa ypовне "я видел, кaк это делaетcя", поэтомy нa cловax можно донеcти оcновнyю идею
3. Зaодно cпpоcят, кaк вообще paботaет тpaмвaй, нy и кaкой-нибyдь дизель-поезд TЭП-70, и до кyчи велоcипед. Xоть ты дaвно и не кaтaешьcя нa велике, yже лет 10 кaк, но что-то в пaмяти оcтaлоcь и ты paccкaзывaешь, кaк пеpебpaть втyлкy, вилкy, cпицы и вcе тaкое. B оcтaльныx вопpоcax делaешь лишь кaкие-то пpедположения, т.к. никогдa не был мaшиниcтом поездa или тpaмвaя. Но дaть пpaвильный ответ кpaйне желaтельно
4. Зaтем тебя caжaют нa тaбypеткy, дaют бapaнкy в pyки, и говоpят “поеxaли, зaбеpем тaм cо cклaдa нечто и отвезем нa aдpеc тaкой-то”. Aдpеca зapaнее неизвеcтны. B это вpемя ты должен изобpaзить, кaк едешь по yлице в ycловияx огpaниченной yзкой yлочки, вcе повоpоты должен помнить нaизycть по пaмяти без нaвигaтоpa, зaтем paзгpyзитьcя y мaгaзинa. B это вpемя нa тебя cмотpят, кaк ты пеpеключaешь пеpедaчи (веpбaльно, без мaшины), оценивaют cтиль вождения и количеcтво нapyшений. Потом говоpят, нy окей, вpоде пpиеxaли. A потом дaют обpaтнyю cвязь, что вот, во вpемя интеpвью вы тaм по доpоге выеxaли paзок зa cплошнyю, a в конце и вовcе окaзывaетcя пеpеxaли пешеxодa. Пpи этом пpодолбaлиcь по вpемени и не пpиеxaли вовpемя нa cклaд.
Поэтомy по внyтpенним pacпоpядкaм компaнии мы вac не можем взять кaк водителя кaтегоpии ЦЭ
Джунoв ебут как никoгда раньше. Кoличеcтвo вкатывальщикoв мнoгoкратнo превыcилo пoтребнocти рынка и требoвания к нынешнему джуну - этo middle+ в какoм-нибудь 2016.
Чтo парадoкcальнo, тех же senior, пo прежнему не избытoк и их еще бoлее-менее хантят. Ho дo этoгo ещё надo дoжить.
Middle прoпал как клаcc и теперь в перехoде из junior в senior oтcлеживаетcя c трудoм.
Вcё так, рабoтаю миддлoм (5 лет oпыта) фрoнтoм в миллиoннике, летoм ycтраиваем cтажирoвкy, на 10 меcт каждый гoд приxoдит бoльше coтни резюме c выпoлненным TЗ. Зарплата cтажёра c каждым гoдoм тoлькo yменьшаетcя, лoл. Как же я прoигрываю c джyнoв нынешниx, кoгда пoнимаю, чтo oни бyдyт зарабатывать на yрoвне oфиc менеджерoв, а c вкатышей, кoтoрые тoлькo начинают шевелитьcя и бyдyт пoлyчать как прoдаван в пятёрoчке - вooбще co cмеxа пo пoлy катаюcь. Mне-тo пoвезлo, я вoвремя влез.
Читaю нoвoсти, и вижу, чтo кoe-гдe ужe нaхуй пoслaли джунoв. Кoe-гдe зaмopoзили зapплaты, нe гoвopя ужe o тoм, чтo дoллap пoднялся. Дaлeкo нe всe в бaксaх пoлучaют. Щaс aйтишникaм зapплaты peжут нa 30-40%.
>дpoпнyл BУЗ
Te, ктo yчатся в баyманкe, на карандашe y кадрoвикoв всяких майкoв да цискo
Te, ктo yчатся в МИСИСe, тe на карандашe y 1С и прoчих Group-IB
Te, ктo врываются, - на карандашe y OOO Bазгeн и сынoвья
>>1772778
За копейки и работа должна быть простой и легкой, копеечной. Если же хотите хорошей работы, извольте платить.
>Te, ктo yчатся в баyманкe, на карандашe y кадрoвикoв всяких майкoв да цискo
>Te, ктo yчатся в МИСИСe, тe на карандашe y 1С и прoчих Group-IB
Хуйня, я учился в 5 разных вузах Москвы, в том числе и Бауманке, и МИСИСе, и МГУ, и ВШЭ - пока ты сам жопу не поднимешь, никто тебя на карандаш не возьмет, пусть даже если ты неебаца отличник с ФКН
>пока ты сам жопу не поднимешь, никто тебя на карандаш не возьмет,
Никогда не понимал, что значит "поднимать жопу, крутится, подскакивать кабанчиком".
Какой конкретно порядок действий подразумевается под этими словами? Что именно мне нужно сделать?
мимо 1-курсник программной инженерии мухасранскава вуза...
Общаться с преподами, подписываться помогать во внеучебке, посещать конференции, всякие межвузовые взаимодействия, делать исследования просто по кайфу и показывать преподам, участвовать в студенческой внеучебке (клубы по интересам), ну и естественно хорошо учиться
Не знаю сколько из этого есть в мухосранских вузах.
Ну, как минимум нужно походить по собеседованиям, чтобы тебя взяли.
Но раз ты на 1 курсе, найди себе корешей и ходи с ними на хакатоны и студенческие конференции. Обычно их организуют местные айти конторы, может и вас заметят.
И самое главное - если просто пинать хуй, то ты останешься говном после любого вуза.
В 1988 году червьпидор Морриса, который распространялся через эксплуатацию переполнения буфера в fingerd, положил больше половины тогдашнего Интернета (если не 80%). Что еще расскажешь?
Деды говнокодили. И да, если твоя программа сегфолтится, да еще и не при диких edge кейсах, то ты говнокодер. И большинство дедов ими и были.
Ты сам-то подумай, если бы кейсы а-ля чеврь Морриса были чем-то серьезным, то они бы такую хуйню не писали. А на деле все пользовались антивирусами. И еще рекомендую почитать всякие аналоги Мейерса тех лет, там были всякие ебанутые примеры в духе "а тут мы удаляем буфер два раза, смотрите не охуейте, дети. Прост компилятор писали мудаки и в нем баг, ничо потерпим"
> если бы кейсы а-ля чеврь Морриса были чем-то серьезным, то они бы такую хуйню не писали
Так именно после Морриса все и заговорили об эксплуатации buffer overflow, и начались попытки научиться писать так, чтобы их не было.
А то сижу, угрюмый, и думаю -- что делать следующие лет пять:
а) дальше пердолить Сишку, POSIX, задрачивать computer science в целом, лысеть и слепнуть;
б) идти садиться в какой-нибудь веселый node.js - хайпо-поезд, где все красочно, быстро и идиотично, люди смеются просто так и заливают себе смузи прямо в штаны.
мимо джун пять лет стажа
Какие юзвери, если атакованы были рабочие станции/сервера? Какие нахуй эвристические анализаторы? Это сейчас железки могут трафик в реалтайме мониторить, а раньше они маршрутизировали-то с трудом.
Какой нахер эвристический анализатор в 1988? Ты там че куришь? Там дай боже первые антивири в принципе появились, а ты уже приписал маняфантазии что они у всех стояли.
Эвристические анализаторы работают через раз в лучшем случае, особенно когда полезная нагрузка зашифрована, что нередкость в 2к20 году. Компании не просто так боятся зиродеев, и не просто так ведут учет CVE каждый год. Решал бы антивирус эти вопросы по-настоящему эффективно - проблема зиродеев отпала бы сама собой, но на практике АВ эффективен только против файлов, на которых есть сигнатура. Тем более, есть немало случаев, когда в самом антивирусе была дыра, которая позволяла запускать от его лица произвольный код, лол.
Офк на тебя, васяна, никто зиродей тратить не будет, но вот высокопоставленные чины, компании, люди, которые слишком много чего знают - мишени. И определенный круг людей это великолепно понимают.
>Про эвристические анализаторы не слышал, мань?
В 88 году? Мань, у тебя сейчас под столом компьютер, который мощнее самого мощного суперкомпьютера в 1988. Какие эвристические анализаторы, им бы байты успеть по портам разложить и не обмякнуть.
Пиздец конечно стареть и видеть, как комплексующие ровестники выдумывают какую-то хуйню про прошлое, а потом находятся какие-то зумерки, которые им верят, и дальше на этой цепочке самоподдува возникают какие-то легенды про героическое прошлое с летающими драконами. Старый код - говнокод. Старый неговнокод - исключение, за 30 лет много раз пропатченное и переделанное. Средний дед программировал крайне хуево, потому что источников знаний о том, как программировать правильно, у него не было - потому что не нашлось того, кто написал книгу. Никаких драконов в прошлом не существовало. Школьники в прошлом вели себя как школьники, долбоебы как долбоебы, а гениев как было 1 на миллион, так и осталось.
Ну на компах до ПеКа где я начинал, пиксели и правда были попроще. Да и шлака на самом деле тогда делали столько же.
>webassembly этот -- оно про нас?
А смысл вебассембли? Все равно сайтики на си и си плюс плюс в здравом уме никто писать не будет.
А что короткая запись это какое-то новшество которого раньше не было?
Как по мне вполне нормально читается, если дать нормальные имена переменных.
>идти садиться в какой-нибудь веселый node.js
Это нужно было 10 лет назад делать, сейчас node.js уже не модный и не веселы, провалился как бэкенд и остался лишь запускалкой тулзов для вротенда.
А во вротэнд нужно было года 3 -2 назад вкатываться, до ковидлы.
Смысл в том, что в вебассембли можно срать в память, что открывает потрясающе огромный attack surface
Т.е. убили няшный флэш только ради того, чтобы сделать свой особенный открытый швабодный флэш, в котором от оригинала оставить только дыры, а остальное выкинуть нахуй? Збс, чо.
Ну... Рассказывай.
Во-первых, нужно использовать операторы if else, а не тернарный оператор ? : .
Во-вторых, блоки инструкци должны быть заключены в фигурные скобки.
В-третьих, приоритет арифметических и логических операций нужно указывать скобками.
Но нет, зумерки напишут говнокод, а потом громко кудахчут, "у меня все по стандарту, я стандарт читал, ко ко". И им похуй, что что бы разобрать их код, программистам, которые поддерживают их код, придется открывать стандарт и пытаться понять, что имело в виду это "юное дарование", и похуй, что их код, написанный по стандарту, скажем, для языка С11 будет работать одним образом, а на компиляторе С99 и С89 по-другому.
>нужно использовать операторы if else, а не тернарный оператор ? :
Не нужно.
>блоки инструкци должны быть заключены в фигурные скобки.
Это потому что ты только что выдумал блоки вместо выражения.
>приоритет арифметических и логических операций нужно указывать скобками.
Не нужно, приоритет арифметических операций проходят во 2м классе школы.
Пидор, нахуя ты продолжаешь кудахтать про стандарт, холоп?
Стандартобоярам и так понятно, что у тебя жопа уже насквозь прогорела.
"I use Linux as my operating system," I state proudly to the unkempt, bearded man. He swivels around in his desk chair with a devilish gleam in his eyes, ready to mansplain with extreme precision. "Actually", he says with a grin, "Linux is just the kernel. You use GNU+Linux!' I don't miss a beat and reply with a smirk, "I use Alpine, a distro that doesn't include the GNU coreutils, or any other GNU code. It's Linux, but it's not GNU+Linux."
The smile quickly drops from the man's face. His body begins convulsing and he foams at the mouth and drops to the floor with a sickly thud. As he writhes around he screams "I-IT WAS COMPILED WITH GCC! THAT MEANS IT'S STILL GNU!" Coolly, I reply "If windows was compiled with gcc, would that make it GNU?" I interrupt his response with "-and work is being made on the kernel to make it more compiler-agnostic. Even you were correct, you wont be for long."
With a sickly wheeze, the last of the man's life is ejected from his body. He lies on the floor, cold and limp. I've womansplained him to death.
>work is being made on the kernel to make it more compiler-agnostic.
Справедливости ради, ядро написано не на Си.
Большинство из следующих используемых в ядре конструкций отсутствуют в языке Си
Вывод типов - typeof(x)
Ассемблерные вставки - asm volatile("pxor %xmm5,%xmm5");
Диапазоны в свитче - case 1 ... 7:
Массивы нулевой длины - some_variable_len data[0];
Адрес вызывающего - ptr = __builtin_return_address(0)
Определение константности выражения - if __builtin_constant_p(c)
Различные атрибуты функций - __attribute__((always_inline))
Подставляемые функции - inline void fun()
Имя текущей функции - my_func_name = __func__
Инструкции-выражения - ({ int a = b + 1; a; })
Переменное число параметров в макросах - __VA_ARGS__
Арифметика с указателями на void - ++void_ptr
Неконстантные инициализаторы - int arr[2] = { x, y }
Хочу кодить маленькие хуевинки под разный mips, управляемый древним как говно линуксом и прочими бизибоксами. Желательно ветси разработку под вендой, в уютной студии не старше 2015.
Во что придется вкатываться, в си или в плюсы, и есть ли у меня выбор? Если есть, то что посоветуете?
> Справедливости ради, ядро написано не на Си.
Справедливости ради, в Си есть расширения, их использование делает программу (и компилятор) не соответствующими стандарту, но язык от этого не меняется. Некоторые расширения (для справки) перечислены в стандарте (Annex J), многие из них настолько распространены, что их реализуют абсолютно все.
> __builtin_return_address
Никак не нарушает стандарт, можно реализовать библиотекой.
> __attribute__((always_inline))
Скоро будет стандартом, но с другим синтаксисом.
> inline
> __func__
__VA_ARGS__
Лолшто?
> int arr[2] = { x, y }
Если переменная arr автоматическая - все ок.
>>73547
> Желательно ветси разработку под вендой
Нежелательно. Бери линукс, бери qemu-mips, подавай ему рутфс и не страдай с кросскомпиляцией. Или бери шланг под виндой и страдай.
> в уютной студии
Будет максимально неуютно.
Зависит от компиляторов которые код для твоего говнеца генерировать умеют. Скорее всего Си, только вот совсем не факт, что нормальный, лол.
Ну в прошлый раз я сделал CC=gcc и скросскомпилил хуйнюшку (чужую).
> нормальный
Что именно ты имеешь ввиду под нормальностью? Я в нюфажестве из 8086 сразу на формочки Борланда съебал, так что в этим вашем си-лоре разбираюсь слабо.
Если ты делаешь пет-проект только для личного пользования - можешь делать, как хочешь, но в продакшене придерживаются определенного code-style, который включает в себя большинство правил MISRA C или хотя бы CERT.
>>нужно использовать операторы if else, а не тернарный оператор ? :
>Не нужно.
А вот в MISRA сказано, что нужно. И в CERT тоже.
>>блоки инструкци должны быть заключены в фигурные скобки.
>Это потому что ты только что выдумал блоки вместо выражения.
Заключать тела операторов if, else, for и т.д. в фигурные скобочки придумали еще Керниган с Ричи, а не я.
>>приоритет арифметических и логических операций нужно указывать скобками.
>Не нужно, приоритет арифметических операций проходят во 2м классе школы.
В Си арифметические операции включают в себя еще и операции булевой алгебры. Со скобочками сразу понятно и код быстрее читается.
В стандартной библиотеке С89 нет <stdint.h>.
А MISRA требует в обязательном порядке её использовать.
Выходит, что на С89 нельзя написать программу, которая бы соответствовала MISRA?
MISRA не запрещает тернарные операторы, ты в очередной раз обосрался, иди стирай штаны.
> и какие есть варианты
Нет вариантов. Обычно мипсы и бизибоксы означают единицы мегабайт памяти, какие тебе там нахуй кресты, бери сишку.
>>73600
> А вот в MISRA сказано
В MISRA сказано, что маллок нельзя. Иди пиши без маллока, сука! Ты заебал. В MISRA для таких дебилов как ты специально есть раздел Applicability, там рассказывают, для какого конкретно кода предназначены правила, и где именно этот код будет запускаться. Эти правила не о том, как тебе писать свои хелловорлды.
>>73605
> А MISRA требует в обязательном порядке её использовать.
В MISRA-С:1998 предлагают свои типы определять, так во времена C89 и делали.
>В MISRA сказано, что маллок нельзя. Иди пиши без маллока, сука!
Я и так его не использую. Использую только массивы под конкретные нужды, при этом слежу, чтобы при работе программы не произошло переполнение массива и выход за его пределы.
>для какого конкретно кода предназначены правила, и где именно этот код будет запускаться. Эти правила не о том, как тебе писать свои хелловорлды.
Так об этом я и писал.
Свои пет-проекты для гитхаба ты можешь писать, как хочешь, но в продакшене, коде, используемом в промышленности и медицине, будь добр, придерживаться общепринятых правил.
>лолшто
Я написал - большая часть из списка. Что со временем стандартизировали. inline и __VA_ARGS__ стандартизировали только в 1999. __func__ это не стандарт. Поинт в том что ядро можно собрать именно GCC, а не любым компилятором Си если в нем нет расширений.
>А потом к тебе приходит N+1-ый юзер, и тебя увольняют.
Как я писал, я делаю защиту от переполнения массива. Один из вариантов защиты от переполнения массива представлен ниже.
Логика кода может быть разной, но принцип защиты от переполнения один - нельзя прочитывать и перезаписывать элементы, которые превышают размер массива.
>/ User came /
>/ To write user to array /
i++;
>/ Overflow protection /
if (i > size_array)
{
i = 0;
overflow_array = 1;
};
array = user;
> я делаю защиту от переполнения массива
Я о том же.
- Наша программа поддерживает только 32 юзера! Для изменения этого количества нужно пересобрать ее и развернуть на всех 100500 машинах.
- Уволен!
> if (i > size_array)
> i = 0;
Можете писать это на рекламных проспектах, чтобы люди знали, кого обходить стороной!
Чо вдруг? цпп всегда были "плюсами", а "крестами" как раз шарп. Ты не зумерок случаем?
Только ты обосрался потому что в арифметическом выражении не пишут if-else.
Шарп всегда был решеткой, а плюсы всегда были крестами, на что даже "кресты" во множественном числе намекают, зумерок.
Другой анон.
> плюсы всегда были крестами
> плюсы были крестами
> плюсы
А вот это реально тройная рукалицо.
>на что даже "кресты" во множественном числе намекают,
Так-то, решетка это вообще четыре креста, зумерок.
Совсем другой анон.
Один красивый скриншот богатого интерфейса на Qt будет лучше тысячи слов.
Вы вообще от балды выбираете тред куда срать? Ладно в C++ Qt еще с натяжкой можно писать (хотя это не С++), но в Си тред?
>Вы вообще от балды выбираете тред куда срать?
Я об этом подумал, но перевставлять скрины было уже впадлу, к тому же здесь хотя бы кто-то онлайн. А че, на сях с кутэ нельзя писать?
>>73691
Перекотился: https://2ch.hk/pr/res/1765587.html#1773694 (М)
Вангую, что если в цпп-треде кто и ответит, то это будут те же самые аноны, что отвечали бы в си-треде.
Выбираю для написания своих хеллоуворлдов и прочих велосипедов.
FLTK проще, имеет няшный код на си с классами, маленький размер бинарников. Из минусов не поддерживает нативные контроллы, и мало готовых виджетов. Также попадаются баги, которые не фиксят годами.
gtk практически единственный кроссплатформенная либа для создания окошек на сишке. Она жирная почти как QT, при этом пилить интерфейс на голом си довольно геморно. Ещё она не собирается статически, под виндой придется таскать с каждым твоим хеллуворлдом пачку ДЛЛок мегабайт на 50.
> имеет няшный код на си с классами
Ты тут имеешь в виду C++ или обычные костыльные структуры си с указателями на функции?
C++, но из модных модерновых крестовых фич там ничего нет. Вроде даже STL не используются. Только сишные строки, массивы, указатели, только хардкор.
плюсы так-то так или иначе будут удобнее. На плюсах ты можешь писать чуть ли не чистый сишный код, а вот наоборот, увы, нет.
Можешь отказаться от большинства плюх, оставив классы (но не юзая динамический полиморфизм, упорись в CRTP, если позарез нужен бесплатный по рантайму полиморфизм), темплейты, перегрузку функций, дефолтные переменные и прочие зиро-оверхэд конструкции. При компилировании можно вырезать весь балласт исключений вдогонку, например. На выходе получится легкий код, который гибче сишного, а главное ООП (как бы ООП не обсирали, но даже линух, написанный на чистой сишке, активно использует конструкции из ООП через костыли, ибо родного ООП в сях нет).
Звучит интересно. Непонятно только
> При компилировании можно вырезать весь балласт исключений вдогонку
Как это можно сделать? Можно ссылочку?
>Nuklear
>imgui
Это для игор и прочих 3д приложух работающих в полноэкранном режиме. Для десктопа не очень подходит, т.к. рендерит всё в одно окошко.
Большинство программ однооконные.
> Не получается найти пример без лишней хуиты
Потому что все не очень просто. https://pastebin.com/raw/aYmU52FS
Это что, ты для какого-то мимокрокодила взял и сам наваял?
Хз как в других компиляторах это делается, но в clang и gcc просто передается флаг -fno-exceptions
По большей части только эмбедщина. Прикладуху перестали писать на сях еще в 90ых, а вебпараша - другой манямирок и параллельной вселенной.
Хорошо мы тебе очко в прошлом треде намылили. Так будет с каждой неграмотной макакой
В прошлом треде разве что тебя всем тредом обоссали, шизик стандартный.
То, что ты знаешь стандарт, не даёт тебе права писать говнокод, вот какую мысль я хотел донести.
Неужели тебе настолько лень разобраться в стандарте языка, на котором ты пишешь, что проще защищать какую-то совершенно идиотскую точку зрения на анонимном форуме? Хуёво, наверное
>нуб обоссался
>Иди в крестотред и шарпотред и спроси, что такое кресты.
Чтобы там ты же мне то же самое ответил, семен? Я и без двачеров знаю, в чем состоит истина, еще и вас поучить смогу.
Тот первый анон.
Благодарю, анончик
Я и так знаю что к чему, свинья.
>лень разобраться в стандарте языка, на котором ты пишешь
По работе(я околоэмбеддер) мне приходится иметь дело и с С11 и с С89, и с С99.
Общее у них одно - они все поддерживают то, что есть в K&R. В остальном они отличаются. Поэтому я придерживаюсь MISRA C и пишу код, который не зависит от компилятора (то бишь код, в котором нет unspecified behavior и undefined behavior).
Вот ты выучил стандарты С89, С99, С11, знаешь, в чем они отличаются друг от друга?
Приоритет и в k&r есть, шизик, я его знаю.
Но лучше не писать длинных выражений без скобок, это говно-код, он плохо читается.
В той же книге из шапки треда:
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
советуют так не делать.
>По работе(я околоэмбеддер) мне приходится иметь дело и с С11 и с С89, и с С99
Работу нормальную найти не пробовал? Где не нужно программировать под некрожелезо
Клоун, открой ка K&R параграф A.6.4. Убедись что UB сущесвует прямо в K&R и захлопнись.
Я вкурсе, что UB существуют, что с того?
Суть в том, что они не должны отражаться на работе программы.
Ну и чего ты слился, маня?
ОРУ СУУКА
Именно так. Причем это был ассет флип из игры по Звездным Войнам.
Ох уж эти расто тролли
Это из Праты пример у него так, и написано что будет случайными цифрами забито. Я так понимаю что где то эти зачения сохраняются.
>неверный термин (там нет рандома).
С чего это вдруг?
У тебя проц и озу выполены в радиационностойком исполнении что-ли?
Может нейтрино пролететь и изменить биты в ячейке ОЗУ, такое бывает.
В бородатых 90ых не одна сотня прог была нагнута раком через уязвимость форматной строки - это как раз то, что есть сейчас в программе на пикриле. То, что у тебя в четвертом принтэфе, позволяет спиздить 2 значения из стэка. Само по себе это не является прямым путем к произвольному исполнению кода (именно в твоем случае, ибо есть случаи, когда саму форматную строку можно контролировать, и написав туда %n можно добиться примитива на запись произвольных данных в произвольные участки памяти - т.н. write-what-where), но в твоем случае, эксплуатируя данный баг, можно обойти рандомизацию адресного пространства из-за того, что у тебя из-за неправильного принтэфа утекают данные из стэка. Если в такой программе, помимо этого бага, есть еще один, позволяющий произвольно писать в память, то такую программу можно довольно легко взломать (исполнить произвольный код от лица данного процесса).
Но уязвимость форматных строк уже осталась в прошлом, этот баг легко заметить, компиляторы срут ворнингами на этот счет, статические анализаторы кода тоже легко видят такие баги, поэтому в серьезном современном байтоебском софте ты форматную строку не увидишь, разве что в заброшенном легаси, который не трогали с конца 90ых.
Но, понятное дело, не пиши такой код, ибо это небезопасно.
Не пизди, у всех сборочках с али стоит.
в сях им все же пользуются, просто обосраться стало куда сложнее - компиляторы стали сложнее, умнее, программисты тоже стали более security aware. Ну и многие компании пользуется статическими анализаторами кода, которые находят такие оплошности моментально.
> Как работает ввод и вывод?
В сишке у FILE есть свой собственный буфер (если не stderr и если не отключишь setbuf()/setvbuf()), fread/fwrite работают с этим буфером, а если он опустошается/переполняется, сишка делает какой-то сорт системных вызовов ОС (read/write), чтобы его наполнить/опустошить соответственно. Как оно там реализовано - зависит от реализации. В какой-нибудь embedded железке оно может тупо по байту читать/писать UART и висеть, пока не закончит. В "больших" ОС системные вызовы реализованы в ядре, ядро выделяет кусок памяти, чтобы туда читать или оттуда писать и выставляет на ожидание операцию ввода-вывода с этим буфером, процесс помечается как ожидающий IO и спит (или не спит, есть неблокирующий IO). Когда драйвер по какому-то событию получает ввод/завершает вывод, он помечает операцию ввода-вывода законченной, ядро снова начинает выполнять соответствующий процесс, системный вызов завершается, fread/fwrite получают управление, а ты получаешь свой ввод/вывод.
>дальше не читал
Фронт - html+css, хотелось бы обойтись без js совсем.
Бэк - Си, платформа - linux.
Дай советов мудрых.
Я так понимаю, что мне понадобятся:
1. fastCGI https://github.com/kristapsdz/kcgi какой-нибудь, не знаю.
2. http parser https://github.com/nodejs/http-parser
3. посты, юзеры и говно будут хратиться в mongo, допустим
4. когда настанет время их выдавать, учитывая, что у меня нихуя не rest api, делать буду как в джанге - заполнять данными html шаблон. Что же, получается, нужен какой-то движок под шаблоны? https://gitlab.com/jobol/mustach/ вот эта херня подойдет?
P.S. делать ничего не буду, просто спрашиваю.
Мне очень нравится такой интерфейс.
В других поисковиках тоже?
> делать буду как в джанге - заполнять данными html шаблон
>хотелось бы обойтись без js совсем
Самое смешное, что тормозить-то будет посильнее чем сайты с жсом, потому что ботлнек всё равно будет в сети, лол.
А если задумаешь сделать что нибудь вроде форумной системы — то будет уровень хабра, где комменты без пагинации рендерятся по 2 минуты, лол.
Короче, это лол и лол, удачи тебе.
И что там есть низкоуровневое? Самое низкое, о чем могу подумать, это непосредственная обёртка сискола write, пишущая байты по адресу, но даже она работает ровно так, как сказал анон, и собственно и находится под капотом у всех ИО функций.
Говно без задач, зачем тебе это, ананас?
На сях пишут веб-сервера (типа nginx или apache), ибо там хуйлоуд и нужно упороться в весь возможный перформанс, но ты же просто блять пишешь сайт, зачем?
Ты бы еще на чистом ассемблере пытался его написать, пиздец.
Ну дак я думал fastCGI интерфейс nginx'у и скормить.
Хорошо, тогда другой вопрос: если программист на Сях решил сделать себе бложик, какой стек ему можно выбрать?
1) Генераторы статичных веб-страниц, CMS - практично, но это как бы создание контента ради создания контента. Полное отсутствие удовольствия от инженерного процесса.
2) Django - охуенно и быстро. Плюс, питон - это, как-никак, наш младший брат-дебил, который часто выручает. Но Django делает все сама (в т.ч. то, о чем ты ее и не просишь), поэтому удовольствия примерно как от CMS.
3) MERN-стек. Ну, джавоскриптерская тема. Я начал ковырять, но там в джаваскрипте буквально всё ебало, причем 85% кода - это фронт. А почему все ебало в джаваскрипте? Потому что rest api
4) flask - точно так же будет все ебало, потому что rest api
Короче, хоть это и оффтоп, но наверняка у многих из нас есть веб-дев в качестве хобби - поделитесь, что используете.
Без обид братиш, но ты какую-то фигню пишешь. Рест это не какой-то интерфейс, а просто набор архитектурных принципов, а rest api - это любое АПИ, используеющее рест архитектуру. Это не какая-то технология, и ты можешь реализовать рестфул ни имея ни строчки жыэс в проекте. Ни фласк, ни мерн, ни меан тебя рестфулы писать не заставляют.
А все что тебе нужно - это открыться на 8080 и написать простой хендлер запросов, хтмлку можешь хоть в const char• хранить, хоть спринтфом собирать, хоть парсить из файла, тебе ее просто нужно завернуть в ответ.
Понял (почти). Но ведь на фронте у меня же что-то должно с этим api взаимодействовать, верно?
С каким апи-то? Ещё раз, РЕСТ это не апи. И логика на фронте — это точно не про рест. Почитай лучше про веб и как он работает, потому что у тебя очень странное и отдаленное от реальности представление о нем, как я понимаю.
Поиграйся с wget или curl
Веб это просто отправка текстовых запросов.
В основе там строка типа GET /pr/index.html HTTP/1.1
После которой идут строки с разными параметрами навроде
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
И в случае запроса POST через отступ новой строки отправляемый контент
В ответ тебе приходит другой набор строк, начинающийся например с
HTTP/1.1 200 OK
Или
HTTP/1.1 404 Not Found
Дальше несколько строк с разными параметрами типа
Content-Length: 1488
Content-Type: text/html
И дальше через отступ в строку сам контент
<html><body>hello</body></html>
Этих знаний тащемта достаточно для обработки статики
Реально интересный паренёк =)
Как ты собираешься-то дергать апи с фронта, если ты хочешь без жыеса?
Ну дак я и хотел обойтись без api, и формировать страницу на основе шаблонов, как в джанге.
Чел >>75083 мне начал задвигать, что наличие api на бэке и js'а на фронте никак не связано.
Но выглядит он так, как будто шарит, так что я склонен ему верить.
По поводу того, чтобы слушать 8080 - не вижу смысла делать это за nginx. Ведь если я с ним через fastcgi буду работать, то помимо всего прочего, он возьет еще на себя и работу с ssl-сертификатами. Так ведь?
js на фронте нужен для асинхронности. Чтобы когда уже загружена страничка, она отправила запроса на /api/widget, (по таймеру или нажатию пользователем кнопки) получила оттуда скажем json со списком пользователей, и динамично поменяла контент части страницы.
В старом вебе 1.0 этого не было, поэтому при нажатии на ссылку происходил тупо переход по ссылке и перезагрузка страницы. Какой нибудь gmail до сих пор будет работать с отключенным js таким образом.
Ну, на самом деле если ты так уж хочешь пофаниться можно и на C написать себе фронт — WASM уже поддерживается всеми.
А, ну да.
>api на бэке и js'а на фронте никак не связано
Именно. Старые статик веб1.0 сайты на джаве/крестах так и работали, логика что-то считала на беке и форматила хтмл строку чтобы вставить ланные перед тем как бросить страницу. Насчет джса тебе другой парень уже верно сказал, но можешь особо не париться, потому что я так понимаю что ты только с ванильным знаком, а с ним даже кашу на фронте не сваришь. Ну можешь в кнопки потыкаться.
НАФАНЯ
Сейчас так и делают, лол. Дискорд, вскод - там гуй на электроне. Считай, у тебя не просто окошко десктопной аппки открыто, а вкладка в браузере) Выглядит свистопердельно по-зумерски, но бля...
Но ведь им нельзя
забыл добавить - я линуксоид, поэтому мне вся эта движуха с прошивками в эмбедщине, где если и есть ОС, то какой-то кастрированный дистриб Линукса, который запускается даже на картошке, только наруку.
> В сишке же есть низкоуровневый
В сишке нет. Есть в POSIX, есть в Windows API. И, как я уже сказал, можно просто отключить буферизацию, и оно будет дергать read/write на каждый fread/fwrite.
>>75480
> гайс, хочу вкатиться в разработку прошивок на разную эмбедщину
http://leanpub.com/c_for_embedded_systems (пдф гуглится) Это максимально ньюфажная книга, известные тебе вещи просто пропустишь. Потом можешь взять, например, bluepill и st-link с али за два-три бакса, и, соответственно, Mastering STM32. Или даже просто даташиты, если умеешь читать и гуглить.
> И да, насколько сильно надо вкатываться в хардварь для этого?
Чем больше знаешь, тем проще будет в случае проблем. Умение тыкать осциллографом в плату понадобится без вариантов. Можешь Харрисов полистать и какой-нибудь базовый курс по электронике.
> надо ли для каждого проекта покупать отдельное железо
Что-то надо. Что-то пришлют поюзать. Что-то можно удаленно отладить.
И пс, Си вообще (чистый, не плюсы с классами) актуален на рынке?
> если интересно системное проганье, какой пет проект можно заебашить
Если бы было интересно, то вопрос звучал бы "у меня дохуя идей и нет времени, что делать".
> Си вообще (чистый, не плюсы с классами) актуален на рынке
Не очень. И вакансии с сишкой в любом случае не избавляют тебя от необходимости худо-бедно знать кресты.
Как же заебали такие поучатели как ты. Человек спросил примеры пет проектов, которые можно реализовать не охуев, а ты начала блять «еслиб да кабы». В очко себе это «если» засунь.
>какой пет проект можно заебашить
Из прикладного-полезного на си написать что-то стоящее очень сложно и никто этим не занимается.
Вот драйвера какие-нибудь или пердолинг ядра, это да. Правда опять же, я думаю это не очень интересно. Я вот тоже какое-то время писал на си, понял что хуйня и перешел на джаву. Писать легко и приятно, никаких указателей и ебли с памятью, куча библиотек, можно писать под андроид, сервера и десктопики.
просто лоу лвл это не твое. Как по мне, джава - это уныние, а те сферы, где она юзается в проде (по большей части энтерпрайз) - вообще блевать тянет.
Но тут уже смотря к чему тяга. Если челик в душе байтослесарь, то Си/плюсы ему явно зайдут. А если ему больше по душе чето хайлвльное пилить, не думая ни о чем, кроме бизнес-логики, то да, джава/сисярп - его стезя.
кому как
Кому лоу лвл байтослесарство неинтересно, то скорее всего уныло. Хотя я не понимаю что такие люди делают в С треде, лол.
В общем, я начинал с Шарпа, все такое, решил на ступеньку ниже спуститься.
И вот меня что смутило. Почему постоянно при передаче в функцию массива передают два аргумента? Почему бы не обернуть массив в структуру из которой можно будет узнать его длину и размер элемента?
Подозреваю что это медленнее (лишняя запись/чтение в память)
Потому что в сях массивы не обернуты в классы, как это сделано в шарпе. В Си массив - это просто последовательность из N байтов в памяти, на которую у тебя есть указатель. Если ты не передашь в функцию размер массива (количество элементов умноженное на размер каждого элемента), то как ты будешь знать где массив заканчивается?
Запомни, что в Си весь мемори менеджмент не абстрагирован от программиста. И да, пока ты не разобрался в указателях (а если ты задаешь такие вопросы, то ты уж точно не знаешь что такое указатель от А до Я), то не трогай массивы, иначе ты так и будешь мысленно нахлобучивать понятие массива из сисярпа на Си.
Ну, тащемта, чтобы понять указатели нужно понять адресную арифметику, так что да. Выделяй память, дрочи её указателями, всё как диды завещали.
Ммм, корутинки прямо из в 80-х.
Вообще страшно пытаться понять if(0) case и прочее.
А как будет работать если в скобках несколько операций записать? async(a, b)
пчел, я тебя уверяю, что спрашивающий анон в душе не ебет что означает вот это:
int x = 228;
int ∗ptr = &x;
printf("%d\n", ∗ptr);
Ему надо сначала понять суть указателей, что не так уж и сложно, а потом дрочить массивы (без понимания что есть указатель ты не поймешь что действительно есть массив, а будешь пытаться нахлобучить идею массива из хайлвл языка, не понимая щито происходит, что и случилось вс этим аноном) и арифметику (первый пост про арифметику написал другой анон, если что).
Есть некий общий вопрос по драйверам.
Вот есть у меня железка (хуй с ней, пускай это малинка), вот у меня есть GPIO пины, некоторые из них (смотря что в спеке написано) присобачены, например, к SPI или I2C шине. Прекрасно. Теперь, есть у меня другая хуевина, которую я хочу ПРИШПАНДОРИТЬ. Допустим, это LED дисплей. Совершенно очевидно, что я должен писать драйвер, если я хочу, чтобы на этот дисплей выводился, например, hello world. Вопрос: как мне знать к какой шине мне присоединять дисплей? И вообще, как знать должен ли я железку Х присоединять к пину, который сидит на SPI/UART/I2C (нужное подчеркнуть)? Ибо без знания этой инфы я не знаю какой именно драйвер мне надо писать.
Всем заранее спасибо.
Попробовал скачать библиотеку и установить по инструкции https://www.cs.colorado.edu/~main/bgi/visual/ - выдаёт ошибки.
>Вообще страшно пытаться понять if(0) case и прочее.
Там всё очень просто на самом деле. Вдохновлялся прочитанной мной когда-то давно статейкой https://www.chiark.greenend.org.uk/~sgtatham/mp/
>А как будет работать если в скобках несколько операций записать? async(a, b)
В макросе async не будет работать, там ожидается lvalue (т.е. имя переменной для сохранения стейта).
В остальных случаях можно писать что угодно (кроме того, что нельзя, но это как обычно). Можно писать await (process(task1) & process(task2)) и асинхронно ожидать выполнение двух тасков. После всех макросов допустимы фигурные скобки, которые позволяют писать некоторые вещи более наглядно и удобно, например: if (error_detected) leave { task->error_code = -10; task.error_info = "some info" };
Вот ссылка на код https://ideone.com/oISw4y если интересно самому потестить.
>conio.h
Это устаревшая нестандартная библиотека, в современных компиляторах её нет. Твоя лаба написана под древний компилятор от борланда, поставь его и не еби мозг.
Ну, как. Указатель это просто адрес в памяти, в твоём коде ты, условно, говоришь что ptr это адрес по которому нужно обращаться если мы хотим получить переменную x. При развменовывании мы считаем что надо взять кусок памяти размером с тип указателя, начиная с такого-то адреса. Что не так-то?
Сделать очевидный беб-сервер.
Посмотри код того же nginx, он довольно аккуратный, хотя мало комментариев.
Лучший системный проект есть ядро пинуса или *bsd.
Первый и последнмй раз я такое видел в sslref. Это не так удобно и эффективно, как кажется. Хотя немного снижает вероятность ошибок.
Значит long long
> Вопрос: как мне знать к какой шине мне присоединять дисплей?
Это у тебя шутки такие? Ты берешь дисплей, на дисплее написаны буковки, буковки ты гуглишь, находишь даташит. В даташите написано, куда подсоединять, что туда посылать и много другой интересной информации.
>>76004
> Можно ли сделать graphics.h встроенной библиотекой
Можно, добавь в настройках проекта в Include directories путь. Или ключиком /I. Но лучше сожги это говно и не слушай больше этого препода. Так давно никто не делает, если привыкнешь так - создашь себе кучу проблем в будущем.
>>76206
ptrdiff_t, если указатели на один и тот же объект, и UB, если нет. Абсолютно бесполезное знание.
graphics.h устарел, пользуйся современными библиотеками вроде Vulkan, здесь все хорошо расписано для новичков https://vulkan-tutorial.com/
>ptrdiff_t, если указатели на один и тот же объект
Тогда бы и разницы не было, то есть был бы 0
Есть составные объекты, например, массив. Вот разность указателей и применяется для указателей на элементы одного и того же массива, больше для нее задач нет.
почему вы все тут пишете, что Си сейчас только для эмбедед юзается, а я не увидел НИ ОДНОГО в треде вопроса про эмдедед. (Ну, по крайней мере прямого - крайности ударяться не буду)
Так что вопрос: вы все меня тут наебываете и весь софт на сях ?
Для laba2.c
> весь софт на сях
Много софта использует либы, которые на сях. Кое-какой софт сам на сях.
> не увидел НИ ОДНОГО в треде вопроса про эмдедед
Здесь традиционно обитают ньюфаги и студенты с лабами. В /ra/ есть embedded-тредик.
Алсо, что касается ньюфагов и эмбеддеда, я пролистал книжку отсюда >>75526 и это какое-то максимально бессвязное и одновременно поверхностное днище, из которого сложно чему-либо научиться.
>это какое-то максимально бессвязное и одновременно поверхностное днище, из которого сложно чему-либо научиться
Так там даже название бессмысленное. Си это просто язык, нет никакого специального "си для эмбеддед".
> нет никакого специального "си для эмбеддед"
Оно там в том же смысле, что и 21st Century C из шапки, типа, как именно готовить сишку в ембеддед. Алсо есть овердохуя расширений у компиляторов, которые, например, позволяют функцию как isr пометить в каком-нибудь восьмибитном МК, и которые не имеют смысла вне embedded. Но автор книги о них не знает.
А книга очень хороша, чувствуется, что автор проделал большую работу:
> (В языках) Python и Erlang ... программа не компилируется в байт-код, она интерпретируется на лету, строчка за строчкой.
> В языке Си строгая статическая типизация
> swap(a, b, sizeof(a)); // function sizeof() located in STD library
И вот такое попадается на каждой второй странице.
>программа не компилируется в байт-код, она интерпретируется на лету, строчка за строчкой
Проиграл. Интересно, что бы случилось с мозгами автора, если ему сообщить, что самый первый язык программирования BASIC, в принципе программы хранил только в байткоде, сразу же "компилируя" каждую введенную строчку после нажатия Enter, а потом "декомпилировал" обратно в текст если хочется посмотреть на исходный код. Таким образом, исходного кода и не существовало в принципе, только байткод.
>>76774
>>76729
А нахуй вы вообще открываете всякое пидорашье говнище? "Не читайте советских газет", слыхали такое? Совковую и постсовковую макулатуру можно разве что как сборники кринжовых анекдотов воспринимать. А аффтар наверняка какой-нибудь увожаимый пердподаватель из шарашки, который вчера с турбопаскоколя пересел.
>самый первый язык программирования
>BASIC
>сразу же "компилируя" каждую введенную строчку
>введенную
>самый первый язык программирования
СВАЁ. РАДНОЭ )))) Хоть и мелочь, но не отстаешь от автора, молодец, не посрамил диржаву )))
Ниже будет просто мое мнение, там нет вопросов, просто несколько наблюдений.
Постепенно вкатываюсь в WinApi, т.к. сфера в которую хочу вкатиться (вспомогательно-вычеслительные модули для САПР и визуализация результатов) под Линуксом не существует. Речь о серьезных коммерческих проектах. Точнее, серьезных САПР.
И мне кажется, я понимаю почему.
Мало того, что в мире Линукса дикий зоопарк совершенно несовместимых подходов и тулкитов, так еще и никакой гарантии, что завтра половина из них не окажется заброшенной, потому что разработчики разосрались и каждый теперь пилит свой вариант (как пример).
Просто дикое распыление созидательной энергии.
В то же время винапи - цельная, и, не побоюсь этого слова - красивая структура.
Естественно, я смотрю однобоко - моя нынешняя профессия подразумевает использование САПР и глубокое погружение именно в конструирование. Которое доступно только под винду. По абсолютно тем же причинам что и выше.
Я на протяжении некоторого времени игрался с FreeCad. Я не знаю почему разработчики выбрали именно питон, вместо, например, С++. Я не знаю какие у питона могут быть преимущества в разработке ресурсоемких систем. Я не программист, но даже мне очевидно, что программа с тысячами трехмерных вычислений, трансформациями матриц и векторов, которые к тому же требуют детальной отрисовки - на питоне будет безбожно тормозить. Так и произошло, хотя у меня вполне себе комп.
Короче, несерьезно это все.
Да, некоторые опенсорсные проекты выстреливают, и тогда их берет под свое крыло коммерческая структура - и только тогда появляется хоть какая-то гарантия продолжительности.
Короче, выводов не будет.
>Слишком толсто
Вообще не пытался. Зачем просто так пишешь и повышаешь энтропию? Лишь бы пукнуть?
Посмотри здесь:
http://zetcode.com/ebooks/windowsapi/
Это красиво.
Некоторым вон нравятся волосатые жирухи или старухи. Красиво для них? Безусловно. По факту? Можно поспорить.
Такая же ситуация и здесь, анон. Тебе нравится - да ради чёрта. Только я вот твою простыню выше тоже не понял, к чему это было высрано?
Слишком упитанно.
>Только я вот твою простыню выше тоже не понял, к чему это было высрано?
Для дискуссии, евнух.
Только о чем можно с тобой дисскутировать, если ты не в состоянии понять простой текст?
Ну и еби своих жирух, евнух.
виндошиз, у меня каждое яйцо больше, чем твоя головушка, так что свою евнуховскую боль на других-то не проецируй) Забирай свое ненужное говно и вали нахуй отсюда, в этой хуете никто не заинтересован и тем более никто не восторгается, кроме тебя, аутиста.
>цельная, и, не побоюсь этого слова - красивая структура
Нет
>трехмерных вычислений, трансформациями матриц и векторов
Почему они не напишут скоростной движок на сях и не дтереьят его через питухон? Хотя возможно что это просто прототип
> В то же время винапи - цельная, и, не побоюсь этого слова - красивая структура.
Цельная - более-менее была до висты. Сейчас как в линуксе зоопарк подходов, которые, правда, все худо-бедно поддерживаются, но местами уже ломаются. Красивым это не было никогда, ни на секунду с тех самых времен, как Microsoft получила CP-M/86 сразу с грузом легаси и вынуждена была все это тащить. Не веришь мне - почитай oldnewthing, особенно старые посты (в любом случае полезно будет, если собираешься с Windows API ебаться).
> программа ... на питоне будет безбожно тормозить
Традиционно под вычисления берется нампай+сайпай и прочие сишные либы, или даже своя пишется на сишке, а на питоне остается только менеджмент. Разница в скорости выполнения небольшая, разница в скорости разработки огромная.
>Я на протяжении некоторого времени игрался с FreeCad. Я не знаю почему разработчики выбрали именно питон, вместо, например, С++.
>C++ 54.1%
>Python 41.8%
Чел...
Тащемта, за тем же за чем тот же блендер это сделал. Ядро и всё, что требует перформанса — написано на плюсах, а плагинчики и вёрстка кнопочек делается в питоне, ибо всем похуй насколько это будет медленно, потому что сделается на старте за пару секунд и всё, это во-первых. А во-вторых, они это делают за тем же, зачем разрабы языков переписывают компиляторы этих языков на эти же языки — чтобы проверить сам язык (в данном случае, чтобы видеть как разработка расширений происходит с другой стороны и не писать всякого говна).
>Постепенно вкатываюсь в WinApi
Он нахуй не нужен в САПР, там нужна графика, матан и инженерное дело.
>И мне кажется, я понимаю почему.
Потому что ведноры видеокарт хуй на них клали, что сейчас стремительно меняется стараниями FAANGов, которые инвестируют в облачные вычисления и гейминг.
>Мало того, что в мире Линукса дикий зоопарк совершенно несовместимых подходов и тулкитов, так еще и никакой гарантии, что завтра половина из них не окажется заброшенной
А тебя-то это как коснётся? Ну форкнете тулкит, если такой уж большой гуй. Хотя обычно в таких проектах гуй — хорошо если 10% кода.
А на всё остальное есть стандарты, и стандартизация в общем у юникс-подобных систем несравнимо выше чем у шинды, лол.
>Просто дикое распыление созидательной энергии.
А теперь иди и загугли откуда появился мем про NIH (по русски надо гуглить фатальный недостаток), зумерок. Хотя можешь не гуглить — http://lurkmore.to/Фатальный_недостаток . M$ — это та компания, которая создаёт и убивает фреймворки/тулкиты/итд чаще чем _все_.
> стандартизация в общем у юникс-подобных систем несравнимо выше чем у шинды
У меня epoll обkqueueался от таких заявлений.
И как это противоречит тезису о том, что у никсов стандартизация в целом на голову выше?
На шинде у тебя вообще _всё_ в ебаных ни с чем не совместимых костылях, начиная от ебаных буков в их кодировках (с которыми никто не умеет работать и в 2к20 куча нативного софта может пойти нахуй просто потому что у тебя кириллица в юзернейме), проходя все системные апи (там даже ебаные сокеты и то свои ни с чем не совместимые) и заканчивая концептами самой шинды (вроде реестра и своей залупы на дотнете вместо баша которая прогревается перед стартом чуть ли не 5 секунд, чисто особы путь шинды).
> начиная от ебаных буков в их кодировках
Лал. Ну-ка расскажи нам, в какой кодировке у тебя имена файлов в линуксе лежат?
> ебаные сокеты и то свои ни с чем не совместимые
Обычные сокеты в винде практически ничем кроме WSAStartup/Cleanup от Berkeley не отличаются. А попытки сделать что-то поэффективнее, чем select, мы уже >>77763 обсудили, они у всех свои, и это как раз последствия той самой "стандартизации" в юниксах.
> концептами самой шинды (вроде реестра
А сколько парсеров конфигов у тебя в /bin? Сколько разных синтаксисов в /etc? А про dconf слышал?
> залупы на дотнете вместо баша
Не нравится - не пользуйся. Мне не нравится хочу в командной строке командовать, а не программировать, поэтому у меня cmd и bash в зависимости от задачи. А кому-то доставляет, очень мощная штука, баши даже близко не стояли.
кек, попробуй на этом стандартизованом линуксе запустить гуишное приложение написаное 20 лет назад.
А под виндоус книга Петцольда (написана в 90е) до сих пор актуальная и все примеры из нее будут прекрасно работать под десяткой
Не совсем по Си, но однажды, когдя я упомянул bss, меня спросили: "кстати, как это расшифровывается, не помните?"
Никогда бы не догадался.
Интересный вопрос.
>стоит ли упарываться
Может быть, хорощая IDE (вроде турбо паскаля) удобнее vim+sed+grep+bash.
Но таковой нет на всех машинах, где я правлю код и отлаживаюсь, поэтому я использую то, что есть, и внезапно этого хватает.
>С помощью вим и командной строки линукс точно можно делать всё что с помощью IDE Clion?
Для байтоебских проектов - да, вполне. Если тебе нужны функции автовысирания формочек, окошек с генерацией кода под эту шнягу, то вряд ли, там только IDE.
>Например у меня уже возникает потребность в системах контроля версий
Гит обязателен к изучению, тут и спорить нет никакого смысла. Прогер, не умеющий работать с гитом, некомпетентен.
В книге тебе дадут теорию, тулинг же учится в гугле и методом проб и ошибок. Я вот сейчас с cmake ебусь, могу только в основы, такая хуйня из-под коня, но делать нечего. Шарить в тулинге - мастхэв.
char getword(char str)
Конкретно вопрос по поводу первого указателя. Для чего это и что он делает?
У тебя объявлена функция getword, которая получает указатель на char в качестве аргумента и возвращает указатель на char. В чем вопрос-то заключается?
Правильно писать char• function(char• argument), потому что звёздочка в данном случае — это часть типа, а при вызове писать аргумент с пробелом
Функция получает указатель на чар (ну то есть строку), и возвращает указатель на чар, ну то есть скорее всего на строку.
Если бы первой звездочки не было, функция вернула бы просто один символ по значению.
Ты ошибся, это не с++ тред
А типичные эмбедед-проекты? Как правило, челики сооружают целые IoT проекты, присоединяя куча периферийных устройств (пропеллеры, джойстики, детекторы температур и т.д. и т.п.), пишут на все это дело драйвера + программу, которая удаленно может хэндлить все эти дела.
>присоединяя куча периферийных устройств
Для этого тебе нужна куча ног у контроллера, которыми нужно дрыгать, периферия типа таймеров, которые будут дрыгать ногами независимо от CPU, возможно интерфейсы типа i2c или i2s. У stm контроллеры жирные и имеют много периферии, поэтому их хватает для многого, а если не хватает, можно какую-нибудь внешнюю микруху поставить, типа ЦАП для вывода звуков. Но с этим тебе в /ra и вообще без знаний электроники там делать нечего.
Лично я за месяц на самоизоляции вкатился в эту хуиту на практике (именно в стмы), но у меня в свое время и курсач был с расчетом аналоговых схем в микрокапе, и прошивки для устройств я писал на заводе (но не электроникой и дизайном всего этого)
Да, все можно. Только дорого. У китайцев в районе 700-800 рублей можно купить что-нибудь на F4.
В большинстве успешных случаев создаётся очередная дыра в безопасности.
ну смотря какой электроники. Как работают транзисторы/резисторы тебе зачастую накхуй не надо знать, особенно в конторах, где платы и софт делают разные люди
а микруху и логику то да, но это, имхо, полегче чем аналоговая хуйня. Так что не так страшно
к чему я это? да хуй знает. Наверное к тому, что пару видосов по логическим схемам и знаниями си (+ стмлайк мп таки стоит потрогать за вымя) норм для поиска какой-никакой работы
Что покодить для практики и углубления в язык после Праты? Сразу в ядра линупса лезть или какой-нибудь коконтроллер закодить?
В индустрии, видать, такие челики как я (но более опытные) нужны в компаниях, где железом и софтом под железо занимаются разные люди, я правильно понимаю? Есть board designers, которые высирают плату/SoC, а есть лоу-лвл прогеры, которые пишут под это дело прошивки и драйвера. Все верно?
Добавлю:
Пишу на С/С++ уже около двух лет, получил степень по информатике, знаю Линукс + постоянно его юзаю, умею писать базовые виртуальные (не на настоящие железки) драйвера, есть парочка личных проектов разных уровней сложности и объема (от 1 до 3.5к строк кода, но почти все из них на плюсах и все из них - юзер-спейс проги, хоть и все равно лоу-лвльно байтоебские), знаю основы работы ОС и участвовал в CTFах, оттуда опыт в реверс инжиниринге и бинарной эксплуатации, а также знания языка ассемблера.
Поэтому я не совсем зеленый в мире лоу-лвл программирования. Это если кто-то думал, что я очередной вкатыш с нулевыми знаниями, а то мало ли... Все-таки двач.
Но так или иначе, я надеюсь увидеть здесь адекватных анонов с опытом работы в сфере разработки драйверов, буду рад услышать что да как, вплоть до описания типичного рабочего дня, что нравится, что не нравится и т.д. За ЗП не гонюсь, реально нравится только лоу-лвл, другим не смогу заниматься. Всем адекватным анонам заранее спасибо!
Для урезанной Сишки без адовых оптимизаций - вполне норм проектик. Полный клон gcc/clang - да, непосильная задача, особенно для одного челика и ососбенно для зеленого.
Понял+Принял, уже развлекаюсь. Спс, анон.
https://github.com/sgreenlee/C-Primer-Plus-Exercises/blob/master/ch11/exercise01.c
юзерская функция возвращает указатель на чар если мы внутри этой же функции изменяем аргумент по указателю а возвращаемое значение даже никуда не ассигнится? Нормально если я буду возвращать воид? Всё работает и так.
боже, ну и говнокод
По логике она рили должна возвращать войд, причем вызывается она так, будто ничего не должна вернуть (см. строка 23)
Вот и я за это. Только учусь, как напишу код сверяю с индусами и конкретно этот момент покоробил.
Спасибо) Думаю за месяц учёбы я недалеко от них ушёл.
Я вам тут интерпретатор Си принёс.
А нет, не принёс. Несу.
Вот, исполняемый файл, параметром к нему Си файл в командной строке и он его начинает почти сразу его исполнять.
Доступна только одна библиотечная функция - printf. но настоящему программисту хватит же. Не принёс, потому что инерпретатор не сумел реурсивно постчитать факториал. Где-то ошибка.
Вот, хотел поинтересоваться - вам EXEшника, readme и пару хелловордов для примера хватит или исходники подавай?
Ладно, как придёт время, дам ссылку на github. Проект уже там, но без интерпретатора, толко лексический и синтаксический анализаторы.
Поддержка Linux и прочих юниксов будет несколько позже. Уж точно не раньше, чем факториал посчитается.
>Поддержка Linux и прочих юниксов будет несколько позже
Гм, а что может быть системно-зависимого в игрушечном интерпретаторе?
он на винапи его писал походу кек
>а что может быть системно-зависимого в игрушечном интерпретаторе?
Ничего. Но вот такие конструкции мой не очень свежий gcc не тянет
for(auto item : : f->overload_list)
и приходится их разворачивать в нечто подобное
for (codeline = code->space->space_code.begin(); codeline != code->space->space_code.end(); ++codeline)
Ну да, тема о Си, а не плюсах. Но я пользовал плюсы.
>for (codeline = code->space->space_code.begin(); codeline != code->space->space_code.end(); ++codeline)
Зачем я это увидел...
> юзерская функция возвращает указатель на чар если мы внутри этой же функции изменяем аргумент по указателю а возвращаемое значение даже никуда не ассигнится
А почему нет? Это фактически бесплатно. Этот подход скопирован с сишной стандартной библиотеки: посмотри, например, fgets.
>>79232
C exe-шниками к соседям: >>1748635 (OP)
В смысле g++ ругается на вариант цикла с двоеточием. Это появилось в каком-то свежем стандарте плюсов, поэтому компилятор на Линуксе не понимает такие конструкции.
Цикл с двоеточием, кстати в ошибкой в предылущем посте написан - там одно двоеточие, а не два.
Не, если конечно обновить gcc. то должен всё понять. Но это как бы не правильно, обовлять компилятор. Правильно переписать код так, чтобы понимали предыдущие версии компилятора.
>А почему нет? Это фактически бесплатно. Этот подход скопирован с сишной стандартной библиотеки: посмотри, например, fgets.
Хз. А зачем? Просто на будущее если дополнять/изменять код? Это не затрагивает быстродействие кода никак?
> Это не затрагивает быстродействие кода никак?
Плюс одна инструкция в худшем случае. А что касается юзкейсов, ну хуй знает, можно делать func2(func1(buffer, size)) например. Или где-нибудь в шапке for удобнее втыкать, хуй знает. Все на совести автора. Я бы вернул size_t со счетчиком присвоенных символов.
Я так со Slackware ушёл в своё время, когда на ей была какая-то уж совсем нестандартная версия компилятора С++. Какой-то ничтожный нюанс поломал многолетнюю любовь к Слаке.
Но насчёт обновления Линукса не согласен. Если ты хочешь показать программу народу, то ради того чтобы её посмотреть почти никто не будет переустанавливать обновлять Линукс. Это рарзработчику нужно, чтобы его программа собралась без проблем у пользователя. А если для embedded пишешь, то туда нужную версию компилятора могут вообще вовремя не подвезти.
For range это 2011 год, анон.
Ты совсем еблан что ли? Или у тебя Линукс необновленный с 2005 года стоит? Пиздец, я в ахуе, потом такие долбоебы как ты кукарекают о том, что Линукс неюзабелен, теперь понятно откуда ноги растут.
-std=c++11 не компилит? Частичная поддержка уже была в gcc 4.6.0. емнип, когда ставил дебиан на виртуалку, там стоял gcc 4.8.x.
И какая связь между разворачиванием цикла в итераторы под старый стандарт, и невозможностью распространять исходники?
>у тебя Линукс необновленный с 2005 года стоит?
У меня линуксы живут в вирутальных машинах. Зоопарк.
Возможно мне будет лениво переписывать "For range loop" и тогда найду в своём зоопарке линукс со свежим g++. Вот только факториал рекурсивно посчитаю.
https://github.com/L4OS/Primula/
Последний коммит 8 месяцев назад,
но там нет интерпретатора и код несколько устаревший.
>Я вам тут интерпретатор Си принёс.
Лол пишу похожее, только для асма.
>почти сразу его исполнять.
Т.е. без immediate code? Даже комменты не препроцессирует?
>Доступна только одна библиотечная функция - printf. но настоящему программисту хватит же.
Сначала подумал, что ты только bitwise и арифметикой писал, проиграл бы с такой ъ-байтоебли.
> даст ему хэндл последнего созданного в винде объекта
Даст хэндл отображения, но не последнего (откуда ты это взял вообще?), а с указанным именем. Если такого нет (не создавался, или создавался, но все хэндлы на него были закрыты), получишь NULL. Сам по себе этот хэндл ничего не дает, но ты можешь с этим хэндлом сделать MapViewOfFile и получить уже указатель на сами данные.
Так, с этим разобрался, спасибо. А теперь, как вообще записывать в отображаемый файл данные и считывать их? В душе не ебу, что делать с выводом функции MapViewOfFile. Её значение — какой-то адрес в памяти, наверное, как раз на отображаемую область для записи данных, но я не могу ничего с этой переменной сделать, потому, что не знаю, что с ней надо делать. И
http://www.cpp.sh/5g3fmt
И как вот эту ошибку решить? Это можно сделать, не создавая реальный файл на постоянном накопителе? Или обмен данными между процессами через отображаемый в память файл нельзя сделать без наличия реального файла?
Ух ты ебать. Я научился записывать туда чары. А инты можно ли как-то? В методичке по моей лабе про LPSTR вообще нихера не написано, взял из
https://cpp.hotexamples.com/ru/examples/-/-/MapViewOfFile/cpp-mapviewoffile-function-examples.html
Да, иногда полезно самому что-то искать и на свой страх и риск пробовать.
Не та картинка.
И много ли будет производительности, если одну криптографическую функцию с C++ на чистый Си переписать?
Нет. Векторы ничего не стоят в крестах, а их имплементация на сишке, очевидно, будет.
Нет.
Наверное, это сбежавший из крестов.
> И предупреждение ещё вылезает.
Если у CreateFileMapping сфэйлится (например, другая программа уже создала объект с таким именем), тебе вернут NULL. Ты это не проверяешь.
>>81120
Работает потому, что изначально память уже забита нулями. Естественно, так лучше не делать и взять strcpy, раз уж ты в тред про сишку пришел. Или даже StringCbCopy, если у тебя Windows API. Ты ведь про это?
>>81124
> Векторы ничего не стоят в крестах, а их имплементация на сишке, очевидно, будет.
Традиционная реализация с void pointer и size_t будет чуть дороже, да. Нетрадиционная #define TYPE double, #include "myvector.tpl.c", #undef TYPE (или просто через один длинный дефайн) будет точно такой же, как в крестах.
4, но это были не на настоящие железки, а просто дрова, которые делают разные вещи (последний фильтровал входящие пакеты, я знаю про iptables, но в образовательных целях это было круто)
Планирую раздобыть тех. референс на какую-то железку (думаю, на сетевую карту) и написать на нее свой драйвер в образовательных целях.
>И предупреждение ещё вылезает.
Что, компиляторы уже такие умные стали?
if(FileMap != NULL)
CloseHandle(FileMap);
Так ругацца не будет? Хотя по хорошему надо проверять сразу после созданию хэндла.
Сервис обрабатывает запрос и возвращает дескриптор объекта секции в случае успеха.
> Её можно просто применить в дочернем процессе и она автоматически даст ему хэндл последнего созданного в винде объекта типа "отображение файла"?
Можно скопировать хэндл в таблицу дескрипторов удаленного процесса - DuplicateHandle.
Круто потому что типа круто? Хуй знает, слишком много ебли с тредами и вообще разработкой, как-то всё лучше, когда есть возможность не лезть в пространство ядра.
Круто, потому что субъективно интересно. Есть люди, которые плюются от всего, что ниже пайтона по уровню предоставляемых абстракций, и педалят веб с чувством кайфа. Можно ли их судить за то, что им это нравится? Нет. Точно также и здесь. Есть люди, которым лоу-лвл нравится больше, и которые и в ядро залезть не гнушаются.
Есть.
Я uthash пользуюсь, неплохо.
sudo apt install uthash-dev
https://troydhanson.github.io/uthash/
Проверял? Там статический анализатор неплохой, и уж такую ерунду прожевать должен нормально.
>А есть какие-нибудь аналоги контейнеров stl, типа vector в чистом Си?
В сторонних либах дохуя. На вскидку: sglib, glib, в stb либе есть динамический массив.
1. char* string = "pidoras";
2. char string[] = "pidorasina";
(надеюсь правильно написал) И
Лолшто? Укажи в чем я неправ (у тебя не получится, потому что я прав)
Можно ли как то передвигаться по двумерному массиву как по одномерному используя array_name++; ?
При попытке сделать two_demensional_array[n]++ получаю ошибку
Вот.
Никак не могу объяснить линушизикам на деле конечно школоте, что даже если микрософт и высрет 10 новых NIH технологий, то всегда есть гарантия, что каждую будут поддерживать лет 10 минимум.
Покажите мне опенсурс проект, где разработчики своей жопой и судебными исками гарантируют подобное.
Наоборот, ВСЕ опенсурсы начинаются с фразы мы вам ничего не должны.
Это не плохо, это просто факт.
https://upload.wikimedia.org/wikipedia/commons/5/57/Windows_Programming.pdf
> Сейчас как в линуксе зоопарк подходов, которые, правда, все худо-бедно поддерживаются, но местами уже ломаются
WinApi не ломается, как было основой, так и есть. Все остальные подходы поддерживаются минимум лет 5. Покажи мне где в ядре или не в ядре линукса есть фраза "мы своей жопой гарантируем что ничего не сломаем 5 лет",
>почитай oldnewthing
Эту колонку ПИНК ГАЙ ведет?
>Разница в скорости выполнения небольшая
Каким образом тогда Solidworks какой-нибудь на моей старенькой пеке вполне сносно и комфортно работает а FreeCad тормозит так что хочется убить нахуй?
>Он нахуй не нужен в САПР, там нужна графика, матан и инженерное дело.
Я не понял что ты советушь. Если писать расширения для сапр, что еще нужно?
>Если писать расширения для сапр, что еще нужно?
Знание предметной области. САПР для проектирования зданий и САПР для электроники ну совсем разные.
Ну блядь сука охуеть теперь просто пиздец как же так нахуй жизнь меня к этому не готовила.
> WinApi не ломается, как было основой, так и есть
Притащи старое приложение, в котором много формочек и графики в целом в десятку c HiDPI, увидишь. Местами сломана последовательность сообщений, местами надо CoInitialize там, где раньше без него работало, ну и т. д.
> мы своей жопой гарантируем что ничего не сломаем 5 лет
Я с этим и не спорил, мне нисколько не нравятся подходы линукса, когда после апдейта системы бинарник, собранный на этой же системе парой дней раньше, внезапно перестает работать.
>>82205
>>82215
Не обязательно сегфолт, все зависит от параметров компилятора, от ld-скрипта. Может, например быть так, что другой "хуй" в программе тоже изменится. Может быть сегфолт, может быть разрешена перезапись, но это дает тебе права перезаписывать литералы.
>Не обязательно сегфолт, все зависит от параметров компилятора, от ld-скрипта.
Тип литерал будет не в .rodata в elf-файле? Как кстати это сделать, ну какие параметры у линкера?
>Нет. Векторы ничего не стоят в крестах, а их имплементация на сишке, очевидно, будет.
ваще, очень многое перестаёт в сишке стоить, если инклудить не хедер с объявлением функций(как деды завещали), а сорц с имплементацией. Деды это делали из-за лютого отсутствия оперативы в компиляторах и проч. Сейчас же можно прямо так, а компилятор всё збс заинлайнит. Почти весь плюсовый "zero overhead" бьётся нормальным сишным компилятором при условии инклуда сорцов.
Это был tcc
>>>1781884
ваще, там стоит использовать стандартный указатель на чар (для обратной совместимости сишка поволяет конвертировать при инициализации указатель на константный чар в указатель на чар)
Раньше вообще было -fwriteable-strings, но потом выпилили.
> какие параметры у линкера
Ну берешь из /lib/ldscripts/ нужный скрипт, правишь (перекладываешь .rodata в .data), скармливаешь его ld через -T.
>>82241
> Антох, а мы еще увидим новый стандарт Сишки, какое-то развитие
Атрибуты же. Смогут заставить тебя писать про fallthrough в switch или, например, обязательно обрабатывать результаты функций, если разработчик захочет. Черновик в шапке есть, сам смотри.
>строковый литерал
>иммутабельный
Получается юзабельный только для вывода и сравнения с ним или я хуй пойму?
А как ты иначе сделаешь то? Они все равно в read-only в бинарнике хранятся. Даже те что char str[]="bla" создаются на стеке и в них копируется эта строка из read only литерала.
>Я с этим и не спорил
Ну а что еще есть-то? Не брать же яблоко, в самом деле. В реальности есть только два стула.
Чел, ты не понял сути вопроса. Эти ваши строковые литералы суть #define или константная переменная или есть в них какой-то более глубокий смысл?
>typedef long LONG;
>typedef int INT;
>typedef short SHORT;
>typedef char CHAR;
Кристалльно чистый NIH, аж глаза щиплет.
>Эти ваши строковые литералы суть #define или константная переменная или есть в них какой-то более глубокий смысл?
Суть высраный загрузчиком оси где то после запуска экзешника или эльфа массив чаров который может лежать в разных секциях кучи в зависимости от конпелятора оси. Где он будет лежать и соснешь ли ты хуйца попытавшись в него что либо записать - ось специфик и имплементатион дефайнед.
Что такое литералы вроде на первых страницах учебников по информатике объясняют. Это кастомный токен.
а сколько по твоему должен занимать массив из десяти указателей в 64битной программе?
звезду спрячь, и будет как надо; либо со звездой на 1 переменную, и забери маллоком
>Кристалльно чистый NIH, аж глаза щиплет.
Ващета нет. int может быть 16/32/64 б
char обычно 8 бит, но может быть и 16 и наверное даже 32 и 64.
У тебя явно 64-битная ОСь, где адрес имеет размер 8 байт.
у Тебя массив из 10 указателей на чар. Каждый указатель 8 байт. 8*10 = 80.
#define просто делает find & replace ДО компиляции.
Если это #define huy 1, то все инстансы huy заменяются на 1, что фактически порождает магическое число без адреса (ибо эта 1 не присвоена ни к какой переменной).
В случае с константами, все зависит от ABI (в плане ГДЕ константа помещается в памяти), но факт - есть переменная, которая сожержит какое-то значение. Для отладки это явно лучше, нежели дефайновысирание.
>Для отладки это явно лучше, нежели дефайновысирание.
А с точки зрения практичности и не говнокода?
> Для отладки это явно лучше
Для отладки есть символы, ты видишь исходник, в исходнике дефайны, а не замененные значения. При этом const - это возможные тормоза из-за проблем с алиасингом, это невозможность использовать такие константы для массивов, это полная зависимость от того, будет ли компилятор достаточно умным, чтобы такие константы свернуть. В общем, в Си const для чего-то кроме указателей - плохой тон и непонимание языка.
По существу возразить нечего?
абьюз дефайнов - говнокод
В Си порой нет выхода, в плюсах за абьюз (или даже просто ненавязчивое использование) вообще в жопу ебут раскаленным кактусом и поделом
Дефайны - единственный вменяемый способ делать константы в Си. В крестах const и enum исправили, поэтому в крестах дефайны с константами гораздо менее важны и используются только если нужно обеспечить совместимость хедеров с Си.
Для всего лучше не использовать дефайны, ведь это текстовый макрос исходного кода, по сути обфускатор, затрудняющий чтение текста и размывающий связь между конструктами исходного текста и исполняемого кода. Отсюда же, макросы нельзя отлаживать, ведь это не код.
прими массив чаров а потом циклом прибавь +'0'
> C11. Major changes from the previous edition include:
> removed the gets function (<stdio.h>)
Потому что дыра, которую нельзя ни исправить, ни обойти. char buffer[4]; gets(buffer); вводишь 5 букв, пиздец. Потому что стыдно в 21 веке иметь такое в стандартной библиотеке.
Да, ты можешь указать ему stdin.
Не скажу за Linux, но printf в MSVC в 32 битах не знает аргументов типа float, только double.
Для меня это было откровение, пошукал в интернетах и обнаружил что копилятор при вызове printf аргументы с типом float приводятся к типу double.
Собственно интересно на каком этапе компилятор приводит преобразование типа. Зачем это сделано? Но главное - когда?
Да понял уже.
>Я впервые учебник открыл неделю назад.
Первую программу на Си, за которую полчил деньги, я написал в 1993 году.
> Собственно интересно на каком этапе компилятор приводит преобразование типа. Зачем это сделано?
Перед вызовом функции, когда он не знает типа параметра, внезапно. То есть когда у тебя функция декларирована как void func(); или когда у функции есть ... в параметрах (разница не большая).
из-за VARGS это происходит. И это делает не компилятор, а в самой реализации прописано такое поведение.
Спасибо.
Конечно. Большинство корректно написанных на Си программ скомпилируется под C++. Не используй шаблоны, классы, исключения и другие расширения языка и всё заработает.
А сишнику выучить С++ проще простого. Если не знает с чего начать, то пусть включит компиляцию в ассемблер и смотрит чего генерирует С++. Так и выучит постепенно.
>А сишнику выучить С++ проще простого.
Норм, а то мне все говорили что учить си перед крестами плохая идея.
И ты реально думаешь что выучить синтаксис, пару либок и нано-частицы буста будет достаточно чтобы не обосраться на крестовом проекте?
Можно было сделать лучше или и так хорошо? Вроде работает as intended. Хотел сделать через switchcase но пососал бибу.
>void print_report(const char str);
>
>int main(void)
>{
> ...
>}
>void print_report(const char str)
>{
Как деды завещали
орнул просто с объявления и определения в разных местах, реально как дядя бьорн в 85-ом завещал
Это плохо или хорошо? И что именно?
Не понял твоего вопроса. Ты сейчас историю из жизни хочешь рассказать? Мой посыл прост - если ты понимаешь что генерирует компилятор, то шансы выучить С++ у знающего Си вырастают на порядок.
>На си работы нет
Драйверописатели в разных там Quallcom, Mellanox, Nvidia, Marvell и т.п. всплакнули после такого смелого заявления
И нет, кресты при этом не юзают, так как там в 99% случаев на железке крутится Линукс, там только на Си драйверы и писать.
Я думал, для того чтобы передать кому-то что-то, нужен всего 1 сокет.
int p, p2;
p = &i - получает адрес i
p = i - что получает?
И что по дереференсу?
Ничего не получает. Ты пытаешься адресной переменной присвоить числовое значение.
нужно *p = i, при условии, что в p не находится мусор, тогда в области памяти, на которую указывает p, будет находиться значение i
Блин, не посмотрел, что i = 0. Тут уже как посмотрит на это компилятор, мб не будет ругаться. Но скорее всего будет
В отличие от TCP, в UDP не устанавливаются соединения, поэтому тебе для каждого пакета нужны и исходный адрес (хранится в s, присваивается при посылке первого пакета, или если ты явно делаешь bind), и адрес назначения (to). В TCP ты устанавливаешь адрес назначения, делая connect. Но если адрес назначения у тебя для всех пакетов один и тот же, ты можешь сделать connect на него и в UDP. Соединения как такогово все равно не произойдет, но сокет запомнит у себя внутри адрес назначения, и ты сможешь использовать обычный send.
>>84533
> Тут уже как посмотрит на это компилятор, мб не будет ругаться.
Ноль работает как NULL только когда он циферкой написан или он результат выражения, которое можно вычислить на этапе компиляции. Когда идет преобразование из целочисленной переменной в указатель, никакой особой магии уже не происходит, и результат implementation defined, даже если в переменной ноль. В реальности, конечно, все конвертируется, и все работает, но гарантий нет.
Потому что шин это в ПЕРВУЮ ОЧЕРЕДЬ десктоп система, а Ляля — в десятую.
> Почему это так?
Может потому-что никому в голову не придёт портировать шинду под такое железо? Да и как портировать - исходного кода то нет.
По каким причинам линуксо-дебил промазал не только мимо треда, но и мимо раздела? Ах, да, именно по этой причине: линукс = дебил. Доказано, все свободны.
http://www.cpp.sh/3cihj
А это процесс B
http://www.cpp.sh/5m4vr
Процесс A должен порождать процесс B и передавать в него массив интов. С чарами работает, но когда я попытался переписать код под инты/, уже нихуя не работает. Вот вариант для чаров, который исправно работает.
http://www.cpp.sh/5kosv
http://www.cpp.sh/5kosv
Что я делаю не так, пытаясь переделать это код под инты?
смотрите, шиндовыблядок-говноед порвался!
Короче вопрос: с чего начать? образование профильное, пару лет встраиваемых систем есть, уник только вот вчера диплом получил. Куда двигаться? Есть ли работа по разработка драйверов/системное проганье для людей не с 13242342 годами опыта блять? И вообще востребованно ли? А то пидорюги с котлином и андроидом по миллиарду в наносекунду получают, а мы типа хуи сосем или как?
Кроче буду рад ответам, спасибо
Полагаю винда не очень модульная, из нее сложно выкинуть какой то кусок который не влезает. Плюс это не их рынок поэтому им дела особо не было. Хотя иногда пытались делать всякие штуки типа NET Compact Framework. Да и 10-ку вроде запускают, специально порезанную.
На самом деле они достаточно много могут вырезать, можешь серверные окна посмотреть. Я не эксперт по ядру винды, но подозреваю что проблема в том что у них много что склеено вместе из-за обратной совместимости, и например даже гуи сервисы из условного винсервера нельзя вырезать без ущерба другому важному функционалу
>Полагаю винда не очень модульная
Винда ГРАФИЧЕСКАЯ, что отсекает все что не компьютеры, и тем более всякие кофеварки.
Сайд эффекты бизнеса и с ним связанного.
Так то они сварганили дот нет работающий на bare metal с 64к озу, но где те толпы шарпистов пишущих для утюгов и светофоров? Рыночек порешал.
Заводи трактор, анон, в сранах СНГ будешь сосать хуи. Это нужно, но в развитых странах, а не в постсовковой отсталой параше.
Ныряй в ядро Линукса, читай его код, учить писать драйвера и прошивки, тут особо нечего посоветовать, кроме как просто учить. И да, если ты не знаешь инглиш минимум на уровне upper intermediate - сосешь хуи автоматически, причем без шансов. Удачи в нелегком деле.
>в развитых странах
Как укрогабония или там где встают на колени перед неграми?
Обоссал хохлолибераху
уркоина и еблорусия - точно такие же помойки, как и парашка, хз вообще о чем ты
Я не считаю Россию парашей, а вот мнение всяких либиральных гандонов вроде тебя, вечно ноющих и сидящих у мамки на шее, никакого внимания не заслуживает.
> уже нихуя не работает
Что именно не работает, как выражается нихуя, кто будет за тебя ошибки обрабатывать? И там volatile напрашивается для указателя на вью. И вообще это кресты. И вообще, нахуй мешать в кучу пайпы, события и замапленные файлы - непонятно.
Мне тоже непонятно. Это пример к лабе, который мне бы только переделать под инты, кое-что своё добавить и с чистой совестью наебать преподшу, сдав ей свою лабу на базе её высера и послать уже её нахуй с её генгбенгами процессов под виндой.
И кстати, этот пример ещё и не работал изкаробки, мне пришлось переделывать его с помощью анона из этого же треда.
1. Местами. 2. Конечно. И плачут, когда приходится недоязыками пользоваться, где его нет.
goto в сурцах ядра дохуя встречал, по крайней мере до 4.х.х. точно есть. А что плохого во второй конструкции - понятия не имею.
Откуда эта тварына высирает сегфолт то блять? Я ненавижу свой код, помогите.
Настолько злой что забыл дописать что обычный gcc из терминала всё нормально компилит и на выходе работает. Но код и всё остальное ругается шо пиздец.
>The only problem is that we do
not normally want the cdev structure itself, we want the scull_dev structure that con-
tains that cdev structure. The C language lets programmers play all sorts of tricks to
make that kind of conversion; programming such tricks is error prone,
Я правильно понял, что Сишечка позволяет получить каким-то образом владеющую структуру без линков из текущего поля?
https://godbolt.org/z/dqdezq
Когда-то там были ретурны, но пришёл народ огня и выпилил их из моего кода.
Что нибудь типа
struct inner;
struct outer {
int i;
struct inner s; };
И потом
foo(inner •ptr) {
outer •optr = ptr-sizeof(int)
Переделай с offsetof(), и будет настоящий CONTAINING_RECORD(ptr, parent, field).
спасибо, анон, что откликнулся на зов вкатыша. а почему это какое-то уникальное дело? к слову, в баду, янедексе и касперском есть такие вакансии (ну там опыта пизда надо конечно), это только потому что они себе могут такую хуйню позволить или я плохо ищу?
Вкатываться в айти вообще стало сложнее, ибо произошел vkatish overloading
Дело не уникальное, просто в парашке с технологиями напряг, по сути только вебмакакам относительно неплохо живется. Рыночек так порешал.
Мало фирм, которые производят кастомное железо, засим и позиции драйверо/прошивкописатаелей на лялекс мало, поэтому в парашке любое упоминание про эмбеддед и лоу-лвл в целом дает референс к совковым пердедам, которые педалят какой-то радиолегаси 50-ти летней давности, нежели к автономным машинам и IoT, как в развитых странах. Отсюда и проблема.
>сварганили дот нет работающий на bare metal с 64к озу
No way.
>но где те толпы шарпистов пишущих для утюгов и светофоров?
Практического смысла нет на 64 К озу.
>Юзают ли в современном коде goto и do/while?
С помощью do|while в чистом Си можно писать интересные конструкции с break. Юзают его активно. Например, когда в коде много проверок. Позволяет избежать множественную вложенность if. Как по мне - код более красив и читаем.
goto хорош в конечных автоматах - при их реализации исрользование goto позволяет значительно уменьшить и упростить код.
>>85166
https://godbolt.org/z/7e6rjj
Пофиксил наконец эту хуиту костылянием через else if. Воооот, дааа. Держу в курсе короче.
типа можно легко пересесть в секьюрити с такой базой? или профильное образование просто?
Любая крепкая программерская база хороша для секьюрити - для низкоуровневой безопасности С/С++, для веб-безопасности - отличное знание js, php. Дальше ты только сам учишь релевантные вещи.
все пиздец хочу быть тобой
а есть какой-нибудь более менее четкий пайплайн как и что читать/кодить, может пет проекты и тд
Нужна мотивация, а без любви к этому делу этой мотивации быть не может. Деньги на непыльной работе, как ни странно, один из худших мотиваторов, видел на примере некоторых знакомых.
Я далеко не гений, но так получилось, что я смог учиться каждый день по 5-8 (иногда даже по 12) часов в течение этого времени практически не переставая, не выгорая при этом. Вот поэтому все так относительно быстро и получилось.
Если ты больше угораешь по лоу-левелу, исходя из того в каком мы сейчас треде, то по пет-проектам выбор достаточно большой и разнообразный. Примеры пет проектов: мини-ядро (не надо пытаться написать полноценный клон Линукса, не получится, естественно), виртуальная машина, медиа-плеер, компилятор, драйвер/прошивка под какую-нибудь опенсорс железку. Выбираешь то, что нравится, и штурмуешь. Насчет секьюрити - тут все гораздо сложнее, нужно уметь анализировать программы (отладка + реверсинг), к которым часто нет доступного исходного кода, нужно уметь юзать существующий тулинг, хорошо знать язык ассемблера целевой архитектуры и OS internals, очень желательно уметь писать кастомный тулинг, в частности фаззеры, знать примитивы эксплуатации и в общем иметь некую интуицию, которая поможет правильно выбрать цель и оценить attack surface.
Вода камень точит. Если у человека есть страсть, то со временем он будет хорошим спецом. Мне до хорошего спеца еще учиться и учиться, если честно, это как бездонная кроличья нора.
> нет джавы
Похоже на какой-то пиздешь. Ну и сравнивать Verilog/VHDL с другими языками это какой-то толи троллинг толи тупость.
Как там хелловорлд на Ардуино выглядит?
Пчел там пишут либо для микрухи с гигабайтами ОЗУ, либо на микропайтоне/сайтоне, которые питоном-то только формально являются. Это уже не говоря о том что картинка сама по себе пиздабольство залетного зелёного
спасибо, удачи тебе, единственный адекватный человек на дваче
Пчел ну ты дурак? Сикп читают те кто хочет вкатиться в информатику и конкретно компьютер саенс, при этом не имея бекграунда. Если у тебя цель просто вкатиться в любую работку, связанную с программированием - то он тебе нахуй не нужен. Сечешь блядь? Разные вещи. Газуй с треда.
Разумеется, на работе ведь никто не юзает абстракцию.
Читал. Дало или нет не могу знать, так как для этого надо отмотать время и попробовать вкатился без него, а потом сравнить результаты.
Да мне оно нахуй не нужно твоё объяснение что, зачем и как. Я задал чёткий вопрос - дрочил ли кто-то и что дало, всё.
Я дрочил, но имея уже много разнообразного опыта. Дало понимание, что лишп не нужен не только мне, он воодще никому не нужен (собственно, понимание еще во время чтения введения возникло). Ничего нового не узнал, какой-то бессмысленный мазохизм.
Неприятно что тред заканчивается на такой ноте.
Это копия, сохраненная 9 марта 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.