Здесь array это указатель на выделенную память, в него не должно помещаться больше 2 элементов. В какую память он это сохраняет и почему?
Смотри cppcheck
cppcheck test.c
Checking test.c ...
test.c:12:10: error: Array 'array[2]' accessed at index 2, which is out of bounds. [arrayIndexOutOfBounds]
array[2] = 3;
^
test.c:13:10: error: Array 'array[2]' accessed at index 3, which is out of bounds. [arrayIndexOutOfBounds]
array[3] = 4;
^
Операционная система не может выдать тебе меньше одной страницы памяти (4KB), а аллокатор в зависимости от реализации может не работать с блоками меньше N байт, допустим 64. Но это в любом случае UB и гроб гроб кладбище.
Не факт что распидорасит, есть такая штука, как https://en.wikipedia.org/wiki/Red_zone_(computing)
int main() {
return 0;
}.
Если я делаю как в книге, то при компиляции выдает предупреждение. Компилятор gcc 12.2, OC Debian 12.
test.c:7:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
7 | main() {
| ^~~~
Program test.c compiled to program
Так возьми учебник современного стандарта, что ж всех на музейную макулатуру-то тянет? Почему-то MS-DOS 3.3 вместо линуксов не учат, а Си по более древнему стандарту − за обе щеки.
Какой посоветуешь? Необязательно на русском. Я начал искать книги и везде этот КР был.
Стивен Прата − Язык программирования С. Сейчас 6е издание. Теперь это классика и базовый учебник. Большой и подробный. Если не хочется читать тысячу страниц, то есть пара отличных вариантов втрое меньше:
Пикрелейтед, Modern C for Absolute Beginners от Apress
А если учишься не с нуля, то Jens Gustedt − Modern C. Отличная книга, но нужны начальные знания.
Душевно вам благодарен
(array + i)
В пердуине обрезаные плюсы. Мне кажется, на поиграться можно вообще взять по конкретно пердуине гайдики от васянов, для вката в C надо дохуя знаний не только по языку.
>>09652
>учебник современного стандарта
Какую хуйню ты пишешь, я ебал. Начальная тема по C - это книжка Сикорда Effective C и условный гайдик по gdb.
Тебе уже ответили в педерастотреде.
Прям совсем "типа карго" есть xmake.
Если ты соя и тебе хочется чего-нибудь более мейнстримного и неудобного, то cmake + conan/vcpkg. Или meson какой-нибудь, хз. На крайняк Gradle, но нормальные люди на тебя будут смотреть косо.
а компилятор нет
Что по твоему array + 1? Когда ответишь на этот вопрос, тогда и поймёшь, почему нельзя.
(ARRAY + 1) - это адрес, на 1 больший, чем первый элемент массива ARRAY (если размер каждого элемента массива 1 байт)
мне говорили, что какое то приведение типов неявное идёт, но зачем оно там я так не понял
Ну нет, это не так. Иди проверяй на коде.
Ну если не хочешь проверять, то я объясню, что в array + 1 в том случае значит примерно array + sizeof(array).
sizeof(array) == 5 sizeof(int). Практически это значит следующее:
представь array как матрицу, тогда array это указатель на первую строку, array + 1 это указатель на вторую строку, и так далее.
Чтобы пройти по всем элементам статического двумерного массива нужно делать (T)array + i, где T - тип элемента массива
Ну я еблан, перепишу
Ну если не хочешь проверять, то я объясню, что в array + 1 в том случае значит примерно array + sizeof(⚹array).
sizeof(⚹array) == 5 ⚹ sizeof(int). Практически это значит следующее:
представь array как матрицу, тогда array это указатель на первую строку, array + 1 это указатель на вторую строку, и так далее.
Чтобы пройти по всем элементам статического двумерного массива нужно делать (T⚹)array + i, где T - тип элемента массива
Смотри, что происходит. В данном скоупе array не указатель на int и не указатель на указатель на int, это указатель на то, что получается по первому разыменованию, а там лежит статический массив, sizeof которого равен его размеру. В данном примере там лежит int[3] размером 12, поэтому арифметика с ним (array + 1) → (array + sizeof(*array)) будет приводить к увеличению адреса на 12. Пикрелейтед 1-2, мы видим элементы 0, 3, 6, 9 и дальше мусор.
Алсо, несмотря на то что компилятор легко компилит это со всеми флагами, даже самый простой статический анализ типа cppcheck легко находит проблему. Пользуйся!
Чтобы всё работало как надо, надо явно кастануть array в указатель на int. Пикрелейтед 4. Всё работает, предупреждений нет.
Ты еще в цикле за пределы массива пойди, он не то что ошибок никаких не даст, а высрет все что найдет в памяти. Джаваскрипт какой-то, пиздец, как на нем еще операционные системы пишут
Любые проверки ради безопасности это оверхед расходы ресурсов. Расходы ресурсов в ядре ОС это кратные расходы в юзерспейсе. Код на питончике, два числа сложить, транслируется в 1500 строк кода на си под капотом. Сколько будет с работой с двумерным массивом в цикле, даже не угадаю, счёт на десятки тысяч пойдёт. Зато просто и безопасно.
допустим у меня есть переменная uint64_t bubble
и есть указатель на эту переменную uint64_t bubble_pt
через ( (uint8_t*)bubble + i ) я могу обратиться к любому из 8 байтов этой переменной?
Да.
Только надо написать
( (uint8_t)&bubble + i )
либо
( (uint8_t)bubble_pt + i )
И ещё учитывай порядок байт: little endian или big endian.
На википедии есть пример https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2
двач съел звёздочки в моих примерах.
потому что в Си нет проверки нарушения границ массивов, это типа ты сам должен делать
сохраняет он это в обычную память, которая по адресу идёт следующей
Для бареметал залупы на 10-центовых контроллерах. Ну в целом байтоёбство это эмбед.
В стандарте же сказано UB, может быть, а может и не быть, ну.
Где-то спустя 4 стандарта плюсы станут абсолютно неюзабельным говнищем и сишка останется единственной не-хипстерской альтернативой.
Ядра разных нагруженных систем и приложений, не только ОС. Производительные либы, в том числе для других языков. Когда ты на питончике пользуешься numpy − ты пользуешься кодом, написанным на си. Это всё ещё один из самых популярных языков и никуда не денется в обозримой перспективе.
Я напишу свой кросспайлер типа Vala, но с синтаксимом go и инструментом сборки типа cargo и все перейдут на мой язык
Только для контроллеров, пока что, а потом еще подумаю. Ты чего такой злой? Если не знаешь то как напишешь то, пьяный штоли?
>Только для контроллеров
Тогда даташит своего контроллера читай.
>Ты чего такой злой?
Я не злой, а токсичный.
Не хочу даташиты читать, чего-то другое надо
Везде, лол. Ты же понимаешь, что из большинства современных разноцветных языков так или иначе можно дёргать сишный код?
Что такое stdin? Поставь себе уже IDEшку и начни компилировать с флагами.
stdin это структура типа FILE, как ты её напечатаешь принтфом, ещё и с %d?
Если ты хотел посмотреть адрес stdin, то это делается так: printf("%p\n", stdin);
И он будет каждый раз рандомный, чтобы мамкиным хакерам было труднее жить. Это называется ASLR, рандомизация адресного пространства.
https://rutube.ru/video/db9d6a57bb49ed316d0b60186de0dba2/
он же буквально в самом видео говорит о том, почему он её критикует, у тебя на ютубе только превьюшки грузит?
На мой взгляд он тупо захейтил книгу. Она как раз рассчитана на человека, который уже изучил какой-то язык программирования и хочет изучить си. А он рассматривает только два типа читателей: кто вообще программировать не умеет и профессионалов с кучей лет опыта.
Ютуб у меня не работает совсем.
>Почему этот чел раскритиковал книгу Сикорда Эффективный Си?
Потому что он долбоёб. Книга обзорная про большое количество вопросов связанных с языком (всего 200 страниц), но автор не упускает важных вещей про подводные камни, про тулинг. После прочтения новичок в Си получит более широкое представление о языке, но не глубокое понимание каких-то может быть вещей, но просто будет знать хотя бы базовые вещи и что такие-то штуки (санитайзеры например) присутствуют в языке и тп.
Второе издание: https://ipfs.io/ipfs/bafykbzacec4olm3nwzqh5blgmlkltg6ln36saclqf3rx6yvumarp5pmcvxdky?filename=Robert%20C.%20Seacord%20-%20EFFECTIVE%20C-No%20Starch%20Press%20%282024%29.pdf
А тебе для чего? Для общего обзора в треде уже накидали советов, дальше всё узкоспециализированное.
В 2000 книги были там Си и Си плюс в 100 страниц описывались, оба языка, стандарт 99, много бывает книжек где написано много лишнего, конкретно эту не читал, но правда добавлю что в тех книжках отдельно были задачки всякие, в 100 страниц описание двух языков с поверхностными примерами
Так что я даже хз, кто очень хочет – тот научится
Из всех шагов единственное рекомендую перешагнуть ардуину. Она выращивает в человеке плохие привычки. Помнится у AVR конторы есть свя нормальная IDE с вменяемыми либами а не ардуиновским позором. ну и скачай даташит на свои камни.
Сразу прыгать на stm32 - порежешь жопу, чтобы запустить это блядсвто надо со старта в шапку ассемблерный код присирать, в ней намного больше возможностей но и геморроя на порядок выше.
Мне нужна хорошая книга для профессионалов, чтобы раскрывала всякие тонкие моменты. В универе что-то писал на си, но никогда его в полном объёме не знал.
Ты пользуешься функциями для работы с ASCII. Тебе нужно wprintf. И на винде ещё наверное выставить локаль, setlocale(LC_ALL, "en_US.utf8");
https://www.youtube.com/watch?v=m3irWOg6Aa0
Проблема, что последнее 6 издание в плачевном качестве, там буквы как будто моль поела, после долгого чтения глаза начинают болеть. С книгами, где нормальный шрифт, такого не происходит.
Я скачал плагин для браузера типа какого-то ускорителя ютуба, скорей всего впн, но только для ютуба.
Вот знал бы си и сам мог писать такие штуки.
На английском есть нормальное.
https://jmp.sh/Py71Gt7U
И русское 5е издание в нормальном качестве, там кажется раздела про многопоточку не хватает.
https://jmp.sh/apthuwE8
5е издание совсем допотопное, его в 99 или 2000-м писали, это наши только в 2013 перевели.
Дак а в чем проблемы то? Синтаксис поменяешь и библиотеки добавишь, если этот код не сработает, то сработает другой, ещё что то добавь или измени, я вообще в книге видел, там было написано что процентов 80 времени нужно искать ошибки ебать код до совершенства, это как бы и есть начало учёбы, ты почему то решил что есть волшебная книжка где все будет рафинированным и чистым, ты напишешь и оно заработает сразу, не смеши а
В чём проблемы старых учебников? Пролистает он его от корки до корки, придёт на работу устраиваться, а там его спросят про корутины и многопоточку в целом, про потокобезопасность. А в дедушкином талмуде этого не было. Как и epoll/kqueue, вагона ключевых слов и ещё дохуя всего. В мелких книгах на 300 страниц этого всего тоже нет тащемта, они не для тех, кто собирается искать работу на Си.
>В чём проблемы старых учебников? Пролистает он его от корки до корки, придёт на работу устраиваться, а там его спросят про корутины и многопоточку в целом, про потокобезопасность. А в дедушкином талмуде этого не было. Как и epoll/kqueue, вагона ключевых слов и ещё дохуя всего.
Если есть базис, то остальное уже можно найти в других источниках не? К тому же это язык Си или не Си?
Честно говоря, выглядит как учебник для начинающих. Положим в переменную a значение 2, в переменную b значение 3, что же даст a + b? И всё в таком духе.
Там просто есть всё. Многие прогеры на си например не знают, что такое сиквенс поинты, что значит "всё в си это выражение" и побочные эффекты. А это основа, после которой сишный код гораздо легче читается и понимается. У Прата это есть.
Или например что символьный литерал это валидная строка на три элемента.
int x = 'kek';
printf("%s\n", (char*)&x);
Это очень подробный учебник для тех, кому нужно разобраться даже в ненужной хуйне.
char arr[1000][2048]; //Или любое другое большое число больше 1к
Компилятор компилирует, но программа перестает выполняться.
Где курить почему? И какое ограничение тут роляет?
Или malloc.
Что сделать понял, спасибо.
>Не влезает на стек.
А где допустимый размер стека посмотреть, чтобы предел возможностей знать?
А всё. Нашел тред на тему. Дальше сам додумкаю. Спасибо ещё раз.
Сразу видно вебмакаку.
Так у Си есть многопоточка, ты о чём?
форк ето же вроди мультипроцессинг, а не мультитрединг
но мультитрединг вроде то же был в сишке
мимо
Да, прав. Для потоков pthread.h
Короче в си обмазываться параллелизмом можно по полной программе.
Прикинуть максимальное число и выделить с запасом
Уверен, что твое число будет длиннее long long?
>как считать число, если я не знаю, сколько байтов оно будет занимать?
звучит как задача для лиспа
реализовывай длинную арифметику тогда я хз
возможно на базе векторов/динмассивов
Никак. В общем случае сначала создаёшь какого-то фиксированного размера, потом при надобности аллоцируешь область, допустим, размером в 2 раза больше, и копируешь в неё старые данные.
а в какой момент нужно реаллоцировать? допустим я попросил 8 байт, ввёл число, которое в 8 байт не засунешь, что дальше? как программа поймёт что надо просить больше?
можно еще вот как изъебнуться
аллоцируешь крч дохуя рам
чистишь вилкой (зануляешь) данные в аллоцированной куче
ставишь байт поинтер в начало
пушишь туда число
и потом по байтику проходишь и чекаешь до первого нулевого
дельта адресов и есть размер твоего ебаного числа
теперь ты знаешь байтразмер
аллоцируешься - пушишь число в память четко по размеру
делаешь фри (огромный кусок кучи)
узнали? согласны?
С другой стороны тогда уже можно не си для этого брать, а на что-то поудобнее и привычнее пересесть.
ты мог не ебать мозги и сразу в лиспе написать одну строчку
тут ситред и решения для си, а си это язык велосипедов
Я не тот анон, который кидал реквест. Просто задача, ИМХО, неподходящая и надуманная. Исключительно поебать мозги.
Тебе понадобится ресайзабл контейнер, вот и всё. Делаешь байтовый массив. Если число считываешь двоичное, то по 8 бит на ячейку, затем увеличиваешь размер контейнера и продолжаешь. Если десятичное, то проще по одному числу в ячейку. Считаешь записанное тобой мантиссой, сам массив заворачиваешь в структуру, где лежит ещё экспонента. Всё, у тебя получился безразмерный тип данных. Неэффективный по памяти, зато сделался на коленке за пять минут, и всю арифметику к нему можно написать ещё за 15, тупо в столбик.
так, тут опять за меня отвечают
Так где в реальной жизни тебе, программируя на си, пришлось столкнуться с такими числами на инпуте разом? И почему ты предпочел си другому языку для решения этой задачи? И почему тебе надо ебашить всю колбасу целиком и никак иначе?
И еще тебе вдогонку пара вопросов. Каким образом ты поймешь, что та область памяти, которую ты собрался читать, идентифицирует себя как число? И как выявишь, что оно закончилось и началась другая область, не относящаяся к нему? Да и вообще, как и нахрена оно вообще оказалось у тебя в памяти в таком виде?
Мы. Но мы же в треде говорим о внезапно появившемся шматке байтов произвольного размера, о котором почему-то нихуя не знаем даже примерно, кроме того, что это число.
Для начала нужно определиться откуда считать? Если из стандартного ввода, то это текстовые данные и считывать нужно посимвольно. Чтобы хранить эти данные можно выделить буфер на N байт. Если при чтении оказалось данных больше N байт, то выделить новый участок памяти на N*2 байт, скопировать туда из старого участка данные, продолжить чтение. Повторить пока не прочитаешь все данные.
>причина fire в твоем ass?
Как ты определил, что тебе в потоке ввода будет передаваться число, шиз?
считываем с клавиатуры посимвольно, записываем в массив, с общим размером 1 байт. если код введённого символа не соответствует цифре, завершаем программу.
после каждый введённой цифры просим у компьютера ещё 1 байт для записи новой цифры (реалоцируем крч), так до условного завершающего символа. получаем массив, каждый байт которого хранит разряд нашей программы. задача выполнена на 90 процентов
*хранит значение разряда нашего числа
набор парусов твоей мамаши это то же числа, и джипег это числа и даже буквы твои обосранные, которые ты тут с горелой сракой высираешь - числа
возвращайся в свою кнопкокрасочную, говно, а тут тред сишников
>по тз, маленький
Отлично, шизик. В итоге у нас всё таки существует некое тз, следуя которому тебе передают именно некое число, которое может превышать размер стандартного типа в Си.
Объясни мне теперь, ебланушка, раз уж разработчик любезно извещает тебя, что отдает некое число, сам инициализирует и завершает передачу данных, то прикрутит ли он в реальной жизни, зная, что отдает какой-то огромный нестандартный тип и при этом заодно заранее зная его размер, заголовок с размером этого числа или будет, как ты, весь день заниматься охуительными велосипедами?
не прикрутит, раз не прикрутил
мозги включи, школяр и пойми, раз никто не обернул твой любимый джесончик, значит никто не обернул и не обернет, значит это просто число, поплачь теперь
>не прикрутит, раз не прикрутил
Ты когда-нибудь программировал за деньги вообще?
Как раз изначальный реквест - это реквест школяра.
А всё остальное - это маневры. Когда тебе удобно, есть ТЗ, а когда тебе неудобно, то нет ТЗ. Давай-ка определяйся.
изначальный реквест анона и есть тз
кто мы такие чтобы по первоначальному реквесту анона сразу бросаться на него ссаными тряпками и называть пиздаболом? а ну да мы это ты - пиздлявый эникейщик, неспособный в решение элементарных задачек, твой удел джейсончики перекладыва, ну вот и перекладывай, не трать время на этот тред
В изначальном реквесте нет ни ху я. "Хочу заебашить динамическое число нестандартного размера и выполнять с ним те же операции, как со стандартными числами". Зачем-почему, нахуя для этого си и как в такой ситуации вообще возможно оказаться - хуй его знает.
Но мелкобуквенная уеба вместо ответа на эти вопросы и признания, что реквест достаточно странный(и ссаными тряпками в него никто не кидался, ебанат), сидит и расчесывает залупу, выдумывая мифические тз на ходу. Хуяк и из кустов появляется stdin, хуяк и по тз по нему передается именно число, хуяк и по тз передается только число, хуяк и составитель тз мгновенно отупел на этом шаге.
>решение элементарных задачек, твой удел джейсончики перекладыва
В чем разница между этой задачкой и перекладыванием джейсочиков, шиз?
тебе, тупому ослу скозали
>Хочу заебашить динамическое число нестандартного размера и выполнять с ним те же операции, как со стандартными числами
вот с этим и работай, хватит мочу из моего хуя пить, выдумывая причины как не решать эту задачу
не хочешь решать задачку анона - вали нахуй, завайпал блять тред своей тупостью, гандонио ебливый
>В чем разница между этой задачкой и перекладыванием джейсочиков, шиз?
в том, что ты порвался
>вот с этим и работай
Да с хуя ли?
>в том, что ты порвался
Но порвался-то ты, ебнутый, на простейшем вопросе: нахуй оно вообще надо городить ирл?
на этот вопрос тебя другой анон подъебнул
красиво вышло, я поржекал
а тебе сраку разнесло в клочья
угомонись, керниганом и ритчи прошу
Что ты в ответ на простой вопрос выдумываешь хуету на ходу? Двумя постами выше, пиздабол.
да тебя ебать не должно для чего это используется
тебе дали это понять шуточкой про твою мамашку
пиздец пориджи пошли, уже очевидные вещи надо разжевывать
Заебись. Тогда надо положить в джейсон и помолиться, ебать. Гарантирую твоим мертвым батей, что будет работать.
>Или например что символьный литерал это валидная строка на три элемента.
Это вроде implementation defined вещь, и про это надо читать в мануале твоего конпелятора, а не у праты.
Ну по стандарту это int, так что формально ты прав и надо смотреть на платформу, но двухбайтовый инт я только в музее видел.
Спасибо, бро. Я немного знаю ассемблер, понимаю что такое даташит, но ничего более-менее серьезного не делал.
значит в кейсе вернулся NULL
вона у тибя аутпут пустой
я как то решал эту хуйню на литкоде, сайт пизда неудобный, так что тестил своим тулчейном и потом просто копипасту прогонял на сайте а то мало ли у них индусский конпелятор с припиздонью какой
* returnSize = 2;
Чтобы проверялка поняла длину массива, который ты возвращаешь. Правильнее было бы возвращать что-то типа струтуры { int *, int }, но так тоже можно.
ну так в задачке указано что у нас длина всегда 2, типо просто переменная ради переменной?
пиривидити с нахрюка пж самому лень
У более сложных задач будет такой же интерфейс, и у тебя тренируют павловский рефлекс.
>Гении C объясните как это работает пожалуйста
https://www.opennet.ru/opennews/art.shtml?num=62224
эм, а чего там показывать?
Чел пишет код, про который в литературе по C для начинающих пишут: не пишите так код. В итоге получает хуйню в виде переполнений буферов и бесконечных циклов.
Потом говорит: мы придумали другой язык похожий на этот, который позволяет так писать код и не будет тебя за это наказывать.
Вот так это и работает.
Например, в первой программе чел говорит про небезопасность strcpy(), которая позволяет по адресу массива въебать строку, выходящую за его пределы. Перезаписать область памяти переменной success, которая становится из-за этого ненулевой. И что это проблема.
Открыв же учебник для начинающих мы можем прочитать следующее:
Функции strcpy () присуща та ж е проблема, что и strcat () — ни одна из них не проверяет, умещается ли на самом деле исходная строка в целевую строку. Более безопасный способ копирования строк предусматривает применение функции strncpy ().
Эта функция принимает третий аргумент, в котором указывается максимальное количество копируемых символов.
Возможно предлагаемый диалект важен и нужен кому-то, но по текущим примерам я не очень понимаю чем это лучше зигов, растов и еще кучи всего, что пытается быть безопасным си.
быстрее ли switch case чем if else
быстрее ли ? : чем if else
или буквально это одно и тоже
Зависит от того, как твой код оптимизирует компилятор. После оптимизаций вполне может быть одним и тем же.
>>21641
Но это же профессор. Ты возражаешь профессору?
>>21675
Там была шутка, что надо было назвать TrumpC, дополнив слоганом "make C great again!". Хотя бы посмеялись.
Обновил андроид и у меня перестал мобильный компилятор работать, и работал ли? Я имею ввиду адекватно работал ли.
Есть какой-то заменитель?
ясно, что никакого практического смысла в этом нет, просто пытался написать функцию суммирования без знака +
Думал, что из за little-endian будет какая то фигня при битовом сдвиге, оказывается нет, всё работает как и должно, можно и адресную арифметику выкинуть
>Думал, что из за little-endian будет какая то фигня при битовом сдвиге
а почему ты так думал? эндианы прикованы к хранению данных, а байтсдвиги это операции над данными. между ними нет связи, эти процессы поисходят в разных местах
Я так понимаю, что на этапе компиляции.
>Ты возражаешь профессору?
Я ему еще и пойти и отсосать предложу, если он мне такую хуйню без веских пояснений, как и зачем он в таком положении оказался, расскажет.
В основном прошивки, драйвера, микроконтроллеры, ядро UNIX-подобных ОС. Реже работа с сетью (файерволлы и т.д.), СУБД (PostgreSQL написана на C).
Без опыта обычно берут студентов/выпускников всякие НИИ, ФГУПы и заводы.
Нет.
исправил
я наверное что то пропустил, но схуяли ты функции внутри структуры описываешь? это плюсы штоле?
mylib::calc(a, b);
stdio::printf("hi!\n");
int типизируется под один жмых шины данных, чтобы за один жмых машина всосала один word, а не под размер регистров
под Z80F своя сдлиба со своим интом, как и на любой другой машине (уверен в этом но не проверял)
Вдруг мне надо определить свой printf и просто пишу:
mylib::printf("my out!\n");
и это ни как не будет конфликтовать со стандартным:
stdio::printf("std out!\n");
Если лень много писать, то можно добавить ещё оператор use или import
в чем проблема определить свой принтф и не линковать принтф из стд либы?
или например в чем проблема определить свой принтф без этих пространств?
myprintf()
printf()
vs
huyzalupa228::printf()
stdlib::printf()
зачем блять? чтобы больше писать пришлось?
получается наоборот, типа не вызываешь функцию структуры, а вызываешь функцию, и передаёшь ей указатель на структуру?
может тебе стоит почитать какой нибудь учебника по си а не высеры ии хуиты? в си можно и так и эдаки вообще как хочешь, лучший язык эвар
> рестрикт, волатил
Есть
> регистр
Нет
> _Атомик
Вообще не знаю что это, хуйня какая-то, на цппреференс написано что компиляторы вообще не обязаны это поддерживать.
>регистр
спорная хуйня
надо вырубать все оптимизейшон флаги, чтобы управлять фетчем в регистр, что в свою очередь спорное решение, так как компилер (а с некоторых пор и сама железка) зачастую лучше оптимизирует, чем макака это делает руками
не силен в этом, краем уха слышал на конфе яндекса по крестам
>атомики это вроде для мультитрединга что промисами не срать
Записал, спасибо. Значит мне туда пока рано лезть.
Наверняка какая-нибудь хуйня, связанная с блокчейном, распределенными сетями и протоколами есть.
Только зачем тебе си, если тебе кровь из носу надо зарабатывать? Садись на фронт на JS и не еби голову.
Почему это Прата - говнище?
>бэкенд
Всё ещё не нужен си. Ты просто пойми, что для заработка это хуевый язык.
Си нужен для клевых вещей в свободное время или за миску риса(в среднем по рынку). Либо застартапить, если у тебя кубышка батька позволяет.
круто, когда начнёшь?
>А если создать свой язык типа homoC и на нём как-то зарабатывать?
Вопрос не мальчика, но первокурсника.
а чо, надо сразу вывалить из штанов указатели, адресацию и адресную арифметику, что бы напугать читателя?
Да, он хочет этого. То что Прата постепенно объясняет он не дочитал. Я сначала тоже горел с этого, а на середине книги понял, что способ изложения неплохой для новисов.
нет, ну давайте будем завуалированно объяснять, чтобы читатель нидай бох не испугался
высрем код и скажем имаджинируйте как он делает магию
ну а регистры адресацию кучу и стек оставьте пердунам на ассемблерах, у нас тут клуб современных чтецов гомогеев на homoC
Либо ты затерпиш 4 главы и про магию тебе объяснят там.
Ну по твоей логике изучение Си надо начинать с инструкции по сборке PDP-11.
ну значит из тебя хреновый преподаватель. объяснять темы надо там, где это уместно. Рассказывать человеку, который пять минут назад радовался тому, что вывел строку в терминал, про смысл & это просто неуместно.
ну да, у меня то же был хуевый препод по крестам, так как еще до лаб где мы впервые высирали хуйню в консоль, объяснял указатели на указатели на указатели
а еще помню на дискретке рекурсии в тетрадке писали и имаджинировали стек
но ты конечно умнее всех, ты бы рассказал как оно курсе на четвертом, когда все уже затерпели
Сдается мне ты пиздишь на своего препода, старый, и наверняка он перед указателями на указатели сперва нехуйственный пласт инфы на вас вылил.
Можно просто написать, что смысл будет объясняться в такой-то главе, а сейчас просто пишите &. Но вместо этого он начинает выдумывать ложные объяснения.
И создать дополнительное давление на новичка, что он выучил какую-то залупу и до 4 главы ему будут ссать в глаза.
да обычный пласт, точки с запятой, декларативность, признаки императивности, основные типы данных, всю эту хуйню вкатунскую, и указатели
поинтеры это база, их надо сразу ебашить, чем раньше тем лучше
я понимаю это больно для питономакак, но что поделать, так работает машина
Ну хотя бы выражения тебе раньше поинтеров показали.
Так а хули не с автоматических выключателей-то начали и сборки щитков? Машина-то на самом деле так работает. Токи, уровни напряжений, химические реакции и никаких поинтеров.
Странный у тебя доеб.
Эта книга написана так, что если ты в каком-то моменте затупил, то тебе это последовательно разжуют и в конце дадут упражнения, соответствующие твоему текущему уровню, для закрепления, а также вопросы с ответами. Она не идеальная, но достаточно хороша для самообучения основам. Зря ты мандишь на неё.
> а списки вот так делаются?
https://github.com/torvalds/linux/blob/master/include/linux/list.h
В структурах через container_of получаешь указатели на овнера узла.
>Почему в си не хотят добавить пространство имён
Судя по тому, куда идёт стандарт, добавят в си30.
Сикорд збс.
>Так а хули не с автоматических выключателей-то начали и сборки щитков?
потому что это другой факультет другого института
устройство эвм на базе х86 дают на вмк, там и логические вентили и самореплицирующие автоматы, а у нас пм - то бишь матмодели, глубже в машину нет смысла погружаться
https://www.opennet.ru/opennews/art.shtml?num=62241
>На текущем этапе развития, собираемые в Fil-C программы медленнее примерно в 1.5-5 раз, по сравнению со сборкой обычными компиляторами.
Как будто и не удивительно. Как же иначе?
>При помощи Fil-C без внесения изменений могут быть собраны проекты bzip2, zip, pcre и ncurses. С незначительными модификациями поддерживается сборка OpenSSH, OpenSSL, CPython, SQLite, Lua, Curl, Lynx, jpeg6b, zsh, xzutils и simdutf.
>В случае ошибок при работе с памятью приложение сразу аварийно завершается, что не позволяет эксплуатировать возможные уязвимости.
Ну вот фиг его знает. Мне видится это прежде всего как инструмент отладки. Допустим, запускаем утиль сначала через этот компиль, тестим по-всякому. А если в результате всё гладко - бинарим уже по-классике, без защитных механизмов.
могу чо нито скинуть из старого
давеча вот пришла идея как по честному допилить задачку и каэр, а то моя версия кривенькая
>>24268
даже как отладчик не котируется
на холодном старте все гладко, а на рантайме 75д крашнуло
ну и сколько тогда тестировать? откуда взять время на тесты? хуита
клоны си нинужны, кроме крестов, но кресты это коммерческий си чтобы тяпляп и в продакшин
суть: выставляет биты по номерам, понадобилось когда писал не помню чо памятезависимое, там была куча флагов и я решил их "упаковать" в пару чаров, так родился этот хидер можно было бы конечно сделать таблицу девайнов, но я не очень люблю такой подход
вопрос по пику будет такой - в типовой форме этот алгоритм временами багует и не выставляет нужные биты, поэтому была написана безтиповая версия (макро) и она не багует для типов любой размерности
уверен, что я просто где то проебался с кастами сигнед типов, но раз уж ты хотел подумать то вот
хидер не прогонял никакими тестами, просто влепил в живой проект и закоммитил так как усё работало
>из старого
>давеча вот пришла идея как по честному допилить задачку и каэр, а то моя версия кривенькая
Кидай, тут хз, а так яндексдиск или ещё чего, я прост хз что такое каэр
Сам думаю чем заняться, или вообще начать библиотеки под себя писать. На будущее
Почему не написать восемь масок в макросах и не заставлять процессор тратить циклы?
не уверен, что понимаю, что это значит
Глобальные автоматом обнуляются. Можно равно не писать = {0}.
в яндексе
k&r не актуальна же, там древний стандарт и на первом же примере хеллоу ворлда современный компилятор выдаст если не ошибку, то предупреждение. К тому же авторы ограничились сугубо языком си, а всё остальное типа библиотек и каких-то практик к нему не относящимся, но по факту эту инфу тоже надо знать. Так что книга имеет скорее историческое значение и не подходит в качестве учебника.
В том и проблема.
Читаю с телефона, сканы с него не очень читать.
Бумажную книгу тоже неудобно читать - она приличного размера.
А чем пдф-то плох? Спокойно на шестом размере читал. Глаза не выламывало.
Читай 5-е издание, оно было в электронном формате, а различия с 6-м изданием там минимальные.
Проверил, действительно выдаёт предупреждения, потому что старый стандарт. Хотя написано, что это ANSI.
Ща я ещё дня на джва занят, дела по работе, потом опять вернусь к обдумываниям
Прата пишет, что стандарт требует писать int main(void), а K&R пишут на своём стандарте 70-х годов, хотя второе издание они писали по стандарту ANSI, но на деле ему не соответствует.
все стандарты си это стандарты анси, ведь без американ нэйшинал стандарт инститьют невозможно записать очередную редакцию языка как стандарт билять
что за дырявая логика у тебя
Не было в 70-е ни каких стандартов. Первый только в 89 году появился. Сразу видно, что Прату не читал.
у праты в голове насрато
щас бы кодить не на макпуке
да не
думаю дело в стандарте
там же хотели закрыть потенциальные дыры в безопасности этими явными объявлениями сигнатур
а кланг то же тупенький, даже ворнинги не бросает за отсутствие описания параметров
Жонглируют библиотеками, добавляю разные слова, и иногда код работает, процентов 90, это и есть задача научиться программировать, понять неработающий код и запустить
Дополню, там ещё бывают разные версии компиляторов, ну иногда изменить, дописать, убавить в сумме является решить задачку, но это простой уровень, вот написать код чтоб удовлетворял условиям задачи, следующий уровень, я поэтому то и попросил каких-нибудь вариантов чужих кодов, вместо кроссвордов или игр телефонных, ну крч как хобби, сидеть и ебать себе мозги
>а различия с 6-м изданием там минимальные.
Различия огромные, например в 5м издании нет многопоточки. Которую спросят везде, если пытаться устроиться на работу на си.
Так в шестом тоже нет многопоточки. Там просто упоминается, что на есть и какие слова под неё зарезервированы в стандарте.
>сидеть и ебать себе мозги
K&R порешай
13 задачу так никто и не решил в этом итт тредие или какая там была холиварная я уже забыл
Надеюсь речь не про 1.13 гистограмму?
Лонг лонг может, а символьный литерал − нет. Что такое '12345678', какой это тип? А у Прата написано.
>А у Прата написано
Да тут и без праты понятно, что символьный литерал промоутится до инта, который потом представляется в long long.
Причём промоушен символьного литерала до инта это - implementation defined behavior, а про это читать в доке конпелятора.
Гугли C стандарт, integer promotion. "Короткие" типы повышаются до signed int/unsigned int, но представление символьного литерала из нескольких символов не описано в стандарте, конкретно в гцц это число по основанию 256.
Я другой анон. Просто недавно пролистывал его и решил тебя еще раз им подъебать.
Что про Клеменса "C 21 века" скажешь?
Да хоть 16.
>0123456789ABCDEF
typedef struct { char v[16]; } anytype;
anytype x= ✴(anytype ✴)("0123456789ABCDEF");
fwrite(&x, sizeof(anytype), 1, stdout); puts("");
не понял, зачем создавать отдельную структуру, что бы просто напечатать строку. и вопрос ведь не про строки был
тебе слово anytype ни о чём не говорит?
long long x= ✴(long long ✴)("12345678");
ну вот тебе твои 8 значений, символами; все в x, как ты и хотел; зачем - мне не ведомо... )
https://librusec.org/ru/book/stiven-prata/yazik-programmirovaniya-c-lektsii-i-uprazhneniya-6-e-izd-2015
https://librusec.org/ru/book/stiven-prata/yazik-programmirovaniya-c-lektsii-i-uprazhneniya-6-e-izd-2015
Вот эта без вирусов 18 метров правда, и без меню
Ебать меня на работе заебали
>>24340
Я всё ещё на связи, как освобожусь, займу голову, ибо это полезно
кодировка мейби? например в UTF-16 каждый символ это два байта, возможно strlen из за этого как то криво читает
попробуй напечатать каждый элемент массива через %d
99%, что кодировка. Прогнал этот код у себя на пк ради интереса. Всё нормально показывает.
тут надо бы сделать нормальный разбор потому что я ебу был бы ответ на твою хуйню
закладывай защиту от дурака
отклеилось
Это пример из книжки. Условия и циклы Прата ещё не рассказывал.
И вообще, дополню, что многие базовые функции и принципы работы со строками рассчитаны только на ASCII/Extended ASCII. Для широких символов есть другие стандартные либы и другие функции.
>Вот эта без вирусов 18 метров правда, и без меню
Я не понял.
Там каждый раз когда открываешь одну и ту же ссылку - вес у файлов меняется. Чо за хрень.
цэ гении
Ну да вес немного другой, 17 с чём-то, я тоже обратил внимание, но объяснить причину не могу, иногда кстати такое бывает, округляет может? У меня доктор веб или пускает или нет, вроде так, мне кажется меня б на сайт даже не пустило если б там была хуета говна, но иногда при скачке бракует и просто не пускает, так что придётся поверить на слово, или потом перепроверять
>Что-то по си совсем как-то туго с книгами.
Да потому что он нахуй никому не всрался. Си использует узкая прослоечка системщиков и программистов микроконтроллеров. Но на модулях ядра сильно не заработаешь. Это интересно только энтузиастам и ценителям "чистого программирования".
Ну никаких других же языков на свете нет. Си. Си плюс плюс. Таненбаум. Сикп. Чистый код. И книг других тоже нету. Если сделаешь шаг вправо, шаг влево - расстрел.
>лучше учить
Лучше иметь свежие идеи. А не обсасывать одно и то же по миллиону раз.
>Ну никаких других же языков на свете нет
Неиронично, это так. Конечно, если считать сделанные на ллвм обёртки для дёрганья сисколов за языки, то тут можно поспорить.
Почему не сделают обёртку в стиле го, чтобы не было сборщика мусора и тяжёловесного рантайма, чтобы можно было писать такие же минималистичные программы, а также со встроенным менеджером больших проектов, а не как сейчас всякие make?
Точки с запятой
Скобки вокруг условий
Нет сборщиков проектов (также предлагают дрочить make)
Вечно какая-то хрень в стиле С++, а не С
потому что... получится Си.
Я тебе неделю назад написал, что учи Джаву и ДжавуСкрипт. Тебе легаси с долларовыми зарплатами хватит до конца жизни. Люди всё ещё зарплату за код на Дельфи получают.
Ну или раст на крайняк, если хочешь рискнуть и стать молодым-шутливым стартапером. Куча литературы и видео для вкатунов гораздо красивее и приятнее, чем в плюсах. Гораздо быстрее выход на уровень успешного гражданина, чем в плюсах.
Зачем тебе дрочить мозг си и плюсами, если цель - исключительно зарабатывать деньги в качестве гребца на галере? Полно же более оптимальных путей.
Я вот тут уже набросал концепт будущего сборщика homo. Будет конфиг файл, но его ковырять руками не обязательно, всё делается через команды: homo new [project_name], homo build, homo run.
По сути ничего сложного. Нужно рекурсивно пройтись по дереву каталогов и сформировать список файлов исходников. Затем для каждого сформировать объектный файл. Затем всё это скомпоновать и на выходе получил бинарник.
Почему эта простая идея до сих пор не реализована в си-сообществе - не понятно.
Чел, твоя идея реализуется в мейке в несколько строк. Если кому-то нужно.
Но мне например нет − часть каталогов это модули, которые подключаются в бинарь в зависимости от того под какую систему/с какой периферией он собирается, а половина это вообще юнит-тесты.
так это то, чем смак занимается, не?
Это невозможно сделать в мейке. Там жесткие пути до файлов и надо каждый файл прописывать. В итоге на один файл у тебя будет по 10 строчек конфига мейка. Когда проект на сотни файлов, то задолбаешься писать и где-то обязательно ошибёшься.
Это ты про раст и лгбт? бггг))
>>29539
CMake через include_directory обходит дерево проекта и генерит соотв. make-файлы, для очень больших проектов, например, для огнелиса используется другой тул Ninja. Если нужна кастомизация мэйкфалов "извне", то так повелось, что их обычно генерят из шаблонов, либо тулы сами их выплёвывают.
Х3, контроля больше, кастомизации больше. В растоговне же тоже можно скрипты ебануть на расте, которые будут при сборке запускаться.
> Там жесткие пути до файлов и надо каждый файл прописывать
С $(shell find и $(wildcard и прочим? Чел, ты хоть раз нормальный мейк видел?
дополню этого оратора
еще можно переменные окружения юзать и в разных шеллах запускаться
а еще можно запускать сторонние сценарии мейка
и вообще хуячить рекурсивно мультипоточную хуергу
мейк буквально полный по тьюрингу и может всё
я вот автотесты мейком запускал с линтерами перед ребилдом
и где то лежал мейк нью для автозапила дерева проекта
Ни в одной книге не пишется, как писать такие макефайлы. Есть только игрушечные примеры. А подавляющие количество книг вообще обходит тему сборки проектов стороной. Тот же Прата ни слова про это не говорит вообще.
>Тот же Прата ни слова про это не говорит вообще.
>В Unix имеется команда make, которая автоматизирует управление многофайловыми программами, но эта тема выходит за рамки настоящей книги.
Извинись
Ну какой мейк, ребят, у вас пробелы вместо таба поставить нельзя, и кроссплатформенность в жопе
в мейкфайле управляющая строка начинается с имвола табуляции наверное он про это
и что и чиво? поставь таб да и все в чем проблема
В душе не ебу. Мб под виндой мейк не смог написать/нагуглить.
Просто кому еще в голову придет написать про пробелЫ вместо табов?
Классно, а если мне нужно скачать не просто файлик, а целый репозиторий с кучей подпапок? Как здесь github.com/tlsa/libcyaml
Я скачал репозиторий, разместил его в lib. Хэдер скопировал туда, где лежат мои собственные. Как мне это дело теперь прилинковать то?
ударь себя ладошкой по лицу
Бля, чел, 90% что оно скорее всего собирается стандартным make/make install, да и там же в ридми сто проц есть инструкция. На крайняк собираешь ручками и кидаешь либы в /usr/local/lib, а хедеры в /usr/local/include.
Вот он Прата. make упоминается всего 1(!) раз. Где можно найти инфу про сборку с внешними зависимостями?
Твой homoвелосипед уже несколько раз изобрели. На вскидку - xmake, meson, basel, ya.make, buck scons
Сборка проекта это вообще наименьшая из проблем сборочных систем. Проблема в том что тебе хочется в сборке ещё иметь менеджер пакетов и запуск автотестов, а в языке очень хуёвые инструменты и для того, и для того.
Да хуй его знает, браток. В интернете, например. Позаебывай нейронку, прочитай гайдик на опеннете, глянь видосик на ютубе.
Но похоже в твоём случае остается только читать Прату до просветления.
> А как вообще с юникодом (UTF-8 например)
> типо вместо char создавать строки wchar_t?
Чтобы успешно работать с чем-то, надо сначала знать, что это такое.
глупости
Двачая. Я помню у дж спольского был прекрасный блог-пост про тупых кодерков и юникод, тут как раз этот случай.
https://www.youtube.com/watch?v=mrm39JmvJ1c
k; someshit; main() {continue shitting}
1) Необъявленная k не дает ошибку и компиляторы послушно компилируют код?
2) Правильно ли, что ; напрочь забивает на свои подвязки с операторством, не отсекает нихуя и вся портянка до мейна считается его типом? Если да, то почему так, а не ошибка компиляции?
А почему он должен давать ошибку? Ты не указываешь флаги, а компилятор С по умолчанию доверяет программисту. Видя такой код, он подразумевает, что его автор не долбоёб, а просто пишет на языке времён Ритчи-Кернигана, где для таких объявлений по дефолту подразумевался тип инт. То есть он скомпилил на ANSI C или C89 и создал две глобальные переменные типа int.
И вообще почитай, что такое ; в Си. Что такое сиквенс поинт и как устроен язык.
И компилируй свои поделия с флагами как минимум -Wall -Wextra -g -std=c11 (или другой стандарт, но явно указывай).
>А почему он должен давать ошибку?
Я воспринимал всегда ; как конец оператора и то, что после неё, условно, начало следующего оператора. Ведь есть еще блоки с фигурными скобками
Тем более учитывая, что перед мейном могут быть как сами функции, так и их прототипы, помимо макросов.
>То есть он скомпилил на ANSI C или C89 и создал две глобальные переменные типа int.
Т.е. компилятор автоматически "привел" этот код под подходящий по его мнению стандарт, т.к. я не указал флаги, ограничивающие его. Ну логично. Не задумывался об этом.
Правда не очень понял при чем тут тогда точка следования, если по твоим словам инты подставляются по умолчанию и всё дело в этом.
>И компилируй свои поделия с флагами как минимум -Wall -Wextra -g -std=c11 (или другой стандарт, но явно указывай)
Записал. Свои поделия я пока пишу правильно и не хардкожу ничего, в т.ч. даже бегло еще не читал стандарты. Поэтому и был удивлен такому эффекту.
Вот небольшой кусок говно-года, который написал -> https://pastebin.com/QM8E6R7A
Пароль: puts("pass");
Точка с запятой часть пароля
Первый вопрос — по поводу строчки 52, функция fseek, раньше в 52 было
if ( ( position != -1 ) && !fseek(f, -(int)readed_bytes, position) ) {
Но оно почему-то отказывается работать, хотя сдвиг указателя в файле небольшой, максимум 8байт, но оно отказывается работать, поэтому пришлось заменить на её текущее состояние.
Второй вопрос — почему происходит ебанное зацикливание программы, просто не могу понять, почему-то не могу словить конец файла, пытался дебажить, но так и не понял в чём проблема, подскажите, пожалуйста...
Пик1 - размер файла в байтах, Пик2 - его содержимое, Пик3 - состояние переменных, по идее feof_flag должен иметь ненулевое значение, ибо конец файла был достигнут, но он почему-то его не отлавливает, да и он откуда-то нули считал, хотя должен был только 2 байта, собственно, в readed_bytes значение 8, хотя должно быть 2, по идее.
OS - win10, но это и так понятно по блокноту.
ПЕРВЫЙ ВОПРОС НЕМНОГО МОДИФИЦИРУЕТСЯ, Я ДЕБИЛ
я забыл, что можно указывать SEEK_CUR, что будет аналогичным тому, что я хотел написать изначально в 52 строчке, но мне всё равно непонятно почему то, что я хочу написать не работает.
>>34630
Окей, эта статья чуть ответила на вопрос как система оперирует с файлами посредством RAM. Но у меня файл крайне мал и мне всё ещё непонятно почему fread не возвращает 2, ибо он как раз успешно смог бы прочитать только 2 единицы данных, далее уже конец файла.
Самое странное, что если размер файла меньше 8 байт, то программа прекрасна работает и видит конец файла...
Хотел сказать, забудь что в stdlib есть работа с файлами и пользуйся мемори маппингом.
Ну и кстати, чтобы писать в файл, нужно открывать через "rw".
> мемори маппингом
В первый раз об этом от тебя услышал, анон, спасибо, буду знать, а это с какого стандарта появилось?
> "rw"
Насколько понял, то rb+/r+ режим так же позволяет писать в файл, отличительная особенность в том, что если указанного файла/пути не существует, то он будет создан.
>В первый раз об этом от тебя услышал, анон, спасибо, буду знать, а это с какого стандарта появилось?
>
Это появилось еще в первой версии Windows NT, и еще раньше на Юниксах, но в стандартной либе до сих по нет. Хер знает почему.
>Насколько понял, то rb+/r+ режим так же позволяет писать в файл, отличительная особенность в том, что если указанного файла/пути не существует, то он будет создан.
r означает чтение. w в любом случае создаст файл, но w затрет старый файл, а w+ начнет писать в конец.
не откывал твои коды
но судя по пирилам ты пытаешься навелосипедить FEOF
а раз так - велосипедь уж по классике
FEOF = тру только если ты попытался прочитать байты из файла и не смог
А зря не открывал, feof там есть...
Погоди, feof возвращает ненулевое только в том случае, если мы достигли конца файла, разве нет?
У меня скорее вопрос в том, почему fread возвращает не то значение успешно прочитанных единиц данных.
576x736, 0:09
>Погоди, feof возвращает ненулевое только в том случае, если мы достигли конца файла, разве нет?
да, но механизм понимания конца файла заложен в попытке чтения и ловле сегфолта
все равно что пытаться глубину стека через оверфлоу
этот пикрил я уже видел, держи вот такой для разнообразия
Да, но в файле больше не осталось байт для чтения, откуда он взял 6 успешно прочитанных нулей?
Хотя тут какая-то хуйня с fwrite замешана, я изменил размер буфера на 1 байт и тут пошли свестопляски с чтением символов.
https://pastebin.com/zct3dQVe
Починил, но это какие-то гнилые рофлы от языка Си, я просто повторно просил переместить указатель туда, где он по сути и находился, но в этот раз он и конец файла находил и не чудил, реально кринж какой-то, объясните прикол?
Пик1 - запуск программы, скомпилированной на основе содержащегося в пастбине.
Пик2 - запуск программы, скомпилированной на основе содержащегося в пастбине, но строчки с 74 по 79 закомментированы, программа вошла в бесконечный цикл.
Возможно, попробую на Убунте на ВМ запустить
Да, анон, ты прав. Приколы винды, а почему так-то ебать? Вроде никакая логика не нарушена, указатель буквально в одном и том же месте, какой-то кринж пиздец, ненавижу программирование, блять, из-за какой-то пиздец неочевидной хуйни проебал 5 часов
ну винда известная коляска
за ответами заходи в десктоп тред а тут мы лучший язык в мире обсуждаем
Не, мне просто непонятно в чём причина, это магия для меня, я никогда об этой ошибке или жалобе на винду не слышал, мне просто совсем-совсем непонятно, указатель файла буквально в одном и том же месте, логика программы не нарушена, логика работы с файлом не нарушена, но в бесконечный цикл она вошла...
База, он себе пока обе ноги не отстрелит не поймёт с чем имеет дело, вообще забавно, что сейчас свой код с сишки или плюсов не ревёрсят в ассемблер, чтоб ахуеть сколько там лишнего говна компилятор загнал, плюс ассемблер уже единицы понимают, эх во в нулевые были времена
Повзрослевшие на двачах не зависают.
Ладно, если сами не можете технически грамотно сформулировать претензии к go, то может у других видели? Мне нужно именно мнение опытных сишников, а не жабо-шарпо-макак.
Ни почему. Все зависит всегда от прокладки между креслом и клавиатурой.
Критика от программистов C/C++ современных ЯП всегда одна и та же: ради того, чтобы подтереть тебе жопу и недопустить всяких переполнений-утечек, создатели режут тебе возможность говнокодить, но из-за этого сами программы жрут больше системных ресурсов, чем программы на C/C++.
Таким образом, ты получаешь более громоздкие поделия, но существенно быстрее разработанные и срок обучения макак на них тоже в разы меньше.
Это заебись для бизнеса, но качество человеческого материала среди таких программистов существенно ниже, т.к. с каждым новым таким языком ты можешь стрелять себе в хуй всё больше и больше и не будешь наказан, а написанные программы под капотом имеют гораздо больше ненужного, чем сишные. Соответственно больше весят, медленнее работают и т.д. Вот и вся суть.
Писать же можешь хоть на го, хоть на си, хоть на расте, хоть на брейнфаке. Если же знаешь и понимаешь подводные камни этих языков, то еще и применять будешь их эффективно.
Ну и главное: если пишешь код за деньги, то пиши на том, чем сказали, и не выебывайся.
>технически грамотно сформулировать претензии к go
Название больше 1 символа, избыточное потребление памяти.
База
В Пиструне также можно выйти за границы массива, только вместо SF - он ошибку выкинет, да и по факту ОС тоже много от чего Си/Си++ программистов спасает. Да и по сути под капотом библиотек Питона очень много сишного и плюсового кода, а Питон это просто инструмент для математиков/инженеров, которые, собственно, не обязаны учить ЯП, а просто хотят получать результаты вычислений.
>Писать же можешь хоть на го, хоть на си, хоть на расте, хоть на брейнфаке. Если же знаешь и понимаешь подводные камни этих языков, то еще и применять будешь их эффективно.
Ой, а что ж этих профессионалов даже Валгринд не спасает от дыр?
сокрушительный панч, смогут ли госимпы парировать?
Мне просто интересно, много ли в профессиональном коде односимвольных имён переменных дай Бог в циклах и может некоторые указатели в заголовках функций, больше придумать не могу
в профессиональном коде нет имен переменных
Если ты умножаешь две матрицы или что-то тупое делаешь со строчкой, то что-то кроме a, b, c и не нужно ничего выдумывать. Глобальную переменную, которая отвечает за коннект в базе данных, называть P не стоит.
В nginx в каждой функции r.
А типо можно манипулировать с каталогами не использую windows.h и команду " system("mkdir %new_path%"); " ?
В плюсы добавили недавно. В Си лет через 20 может добавят. Пока либо winapi или какая-то кросплатформенная обёртка.
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/
>Стандарт си вообще описывает работу с каталогами файловой системы?
а схуяли должен? это слой операционки а не языка
Слой операционки - это системные вызовы, а у нас библиотека libc, которая должна давать кроссплатформенные обёртки.
ничего она тебе не должна
Если бы там везде были проверки на ошибки, ты пока играл бы в какого нибудь ведьмака, ОС говорила бы: падажжи, куда кадр новый грузить, давай я сейчас сначала проверю, вот у меня тут пол миллиона строк кода, нет ли там где-то ошибки которую не заметили разрабы ОС, тогда и отобразим следующий кадр, а пока жди, ёпта
Напомни, где обертка наносекундного времени.
> пока играл бы в какого нибудь ведьмака, ОС говорила бы: падажжи, куда кадр новый
Ведьмак на Юнити/C# написан, там все эти проверки есть, дальше что?
тогда карбон
Графические либы-то все на си. Да и не только графические, да и .net либы небось тоже. И любые системные вызовы тоже сишный код дёргают.
Для пирсинга реинтерпретом или си-стайл кастом как здесь любых сырых байт, которые тебе высрали по сети или любым иным способом, лол. Вкатуны нынче вообще недалёкие.
это парсинг, броу
- низкий уровень абстракции. Всякие деревья, хэши, массивы надо пилить на своей коленке и приклеивать жвачкой под конкретные случае. Естественно, всюду лезут войд указатели, contaneirof и макросы.
- какая-то мразь то и дело портит память. В любой достаточно сложной системе. В структурах данных, которые не имеют к мрази никакого отношения. Санитайзеры помогают в половине случаев.
- нихуя нет, базовых вещей нет, туалетной бумаги. Списков нет (sys/queue нестандарт). Условной компиляции если ЛОНГ ШИРЕ ИНТ - нельзя. Атомарные операции только из __билтынов или __асм.
- встроенные типы нефиксированной ширины, чар неизвестной знаковости, битовые поля неизвестного направления, приколы в сдвигах, приколы в преобразованиях, приколы в сравнения.
неосилятор спок
>Атомарные операции только из __билтынов или __асм.
Появились в С11. Или ты из тех, кто не признаёт что-то кроме ANSI C?
> - низкий уровень абстракции.
А это плохо разве?
> под конкретные случае.
Вроде говорят, что в каждой компании каждая СД допиливается напильником под свои нужды в целях оптимизации.
> Естественно, всюду лезут войд указатели,
Это же имба, войд можно преобразовать в какой угодно тип данных и перегрузка не нужна, хах
> contaneirof
А что это такое?
> - какая-то мразь то и дело портит память.
Привидите пример, пожалуйста, а то я только знаю, что в винде какая-то ебень с работой с файлами в режиме чтения и записи
> Атомарные операции только из __билтынов или __асм.
Раскройте темы, с понятием знаком, но думал, что это скорее про язык ассемблера.
А для чего вообще нужны битовые поля? Про приколы в сдвигах и сравнениях не понял, если про вещественные, то во всех языках с ними проблемы же, в Си же нет циклических сдвигов битов, насколько помню.
Во многих проектах не вижу их.
>>39233
>А это плохо разве?
Когда ты написал йобу, а потом тебе говорят, что йоба заебись, надо бы йобу еще добавить в пуку (в трех разных местах), а пука использует другие типы данных. В плюсах для этого есть хотя бы есть темплайты.
>Вроде говорят, что в каждой компании каждая СД допиливается напильником под свои нужды в целях оптимизации.
Даже когда Аптимизация не нужна (часто), абстрактных СД в С нет, там нельзя без жвачки и напильника
var t1: red_black_tree of mystruct;
> что такое?
Гугли container_of
>Раскройте темы, с понятием знаком, но думал, что это скорее про язык ассемблера.
В многопоточке нужно то, шо в 86 ассемблере делается xchg или xadd или mfence.
>А для чего вообще нужны битовые поля?
Чтобы не определять флажки через дефайн.
> Про приколы в сдвигах и сравнениях не понял.
-1 << 1 непортируемо
-1 > 1u !!!
>- встроенные типы нефиксированной ширины, чар неизвестной знаковости, битовые поля неизвестного направления, приколы в сдвигах, приколы в преобразованиях, приколы в сравнения.
Пердикс, ты? Вроде все по логике сделано, не вижу проблем.
Главная проблема Си - это то что нет денежных вакансий.
Сравнение нужно дополнительно дизассмеблировать, чтобы посмотреть, что на выходе будет. Хотя понятное дело, что UB, но cppcheck не ругался почему-то
Да, всё в ассемблер скатывается, а он всё воспринимает как число со знаком, поэтому будут приколы, как на 2ом скрине.
В пиструне то понятное дело по-другому будет, но у них там целое каких-то гиганских размеров, байтов 16, возможно, что на основе GMP, но не проверял и не вникал, если честно
Ты если знаток Си и ОСей, то помогит >>39399, пожалуйста, я выделил память в первом процессе и хочу получить доступ к этой памяти во втором процессе, но мне сыпет SF даже, если через sudo второй процесс запускать, всё делал под Убунтой, ибо до нормального дистрибутива не дорос ещё, хотя дядя взрослый, пусть и пердикс, просто тупой
Пик1 - первый процесс, пик2 - второй процесс
>хочу получить доступ к этой памяти во втором процессе
соснешь, нужна специально разлеляемая память
да по SF даже через sudo понял, что сосну.
А как тогда крутые хакеры получают доступ к памяти процесса через другой процесс?
Я просто быдло тупое, про разделяемую память впервые слышу
Всё ещё хуже, чем этот типо дед описал.
>>39233
>А что это такое?
https://github.com/torvalds/linux/blob/master/include/linux/container_of.h
>>39399
>Си нравится, но он очень сложный и боюсь, что никогда не смогу его понять :(
Не нужен он тебе, пердикс.
>>39427
>А как тогда крутые хакеры получают доступ к памяти процесса через другой процесс?
Например, подменяешь динамический символ.
Да что ты сразу обижаешь, мне правда Си нравится и очень хочу вкатиться в обратную разработку...
>динамический символ
Как всё сложно то :(
Слушай, я пересмотрел свои сообщения и не совсем понял, а почему ты меня в совсем слабоумные-то записал? Самые-самые азы Си и программирования я знаю, вроде бы.
Обратная разработка, любовь к языку, ибо очень сильно люблю, после Паскаля всё будет мёдом, с восприятием ООП проблемы, поэтому плюсы, Джава и шарпы отпадают.
>Обратная разработка
Це шо?
>с восприятием ООП проблемы, поэтому плюсы, Джава и шарпы отпадают
У тебя список с инструментами для разных задач.
Реверс инжиниринг на пендоском, он, конечно, больше на ассемблер нацелен, но и Си необходим.
Джава, плюсы и шарпы строятся полностью на ООП, в джаве всё объект, в плюсах тоже, судя по всему, ибо при инициализации базовой переменой автоматом вызывается конструктор, который ей нуль присваивает.
А ну норм тогда, главное, чтобы на Си не надо писать бгг)). В принципе въезжать в обучение подводных камный и мин не очень и нужно тогда.
Джава и шарпы для цуи-кодомакакинга, плюсы для всего остального, короче нахуй не нужны тебе они.
У тебя вообще задачи больше не в обучении языку, а скорее про предметную область, какие форматы файлов бывают, выше там словосочетание динсимвол тебя поставил в тупик, как ОС загружает в память эти файлы и тп.
Та не, вот например чар. Он сначала был знаковый, потому что в pdp-11 байты грузились со знаковым расширением. А с первыми портируемыми кумпиляторами решили перестраховаться и сделали хз как.
>>39345
Аахах, дизазм покажет тебе особенность одной архитектуры на одном кумпиляторе с одним набором опций.
>>39394
10 лет коммерческой разработки на сях и асемблерах тащем-то. От сегфолтов не спасает.
>От сегфолтов не спасает.
Просто чтобы понимать, имаджинируйте ебало гуглеров, которые фузят хром ночами и годами на своих мейнфреймах.
>надо пилить на своей коленке и приклеивать жвачкой под конкретные случае
>нихуя нет, базовых вещей нет, туалетной бумаги
Разве не в этом смысл? Взять только то, что надо, и запилить под конкретную железку, чтобы быстро летало?
Он наверное имеет в виду, что этого нету в стандарте.
А так да, в этом особенность Си, что даже для вывода в консоль надо подключать бибилиотеку, что в питоне из-под коробки доступно, никакие пакеты не нужны
>Всякие деревья, хэши, массивы надо пилить на своей коленке и приклеивать жвачкой под конкретные случае. Естественно, всюду лезут войд указатели, contaneirof и макросы.
это не проблема языка, пилить либы могут все, проблема комьюнити что они не сошлись на какой-то стандартной либе, потому что в си каждый - кулибин, а стандартизация - для лошков двигающих джейсоны, поэтому каждый норовит изъебнуться, ведь он же не лох. Ну да, написал полностью свою стандартную либу, но ведь зато сэкономил 200 байт!
>>39215
>чар неизвестной знаковости
шо? вообще не знал о такое, что это?
>10 лет коммерческой разработки на сях и асемблерах тащем-то.
Чо платят? В какой сфере разработка?
>Главная проблема Си - это то что нет денежных вакансий.
Вот это. Люблю байтоёбить, просто обожаю сеги дебажить. Но за крудошлёпство платят наполовину больше, плюс работаешь два часа в день, так что увы.
>это не проблема языка
Чел. Это проблема языка. Или ты не знаешь даже про
https://en.cppreference.com/w/cpp/container/unordered_map
>Главная проблема Си - это то что нет денежных вакансий.
А почему так? Ведь рынок встраиваемых устройств за последнее десятилетие превзошел традиционный ПКашный. А на встраиваемых Си же доминирует. Или если создают новое железо с архитектурой, то туда, как правило, первым делом сишный компилятор портируют.
Ебмедед пертровичам всегда платили сильно ниже рынка.
>А почему так
В машиностроении и электронике зарплаты всегда были ниже чем в банках например, ну или в рекламе. Просто потому что маржинальность бизнеса ниже и деньги из воздуха ты не сделаешь.
В боенге и зарплаты значительно меньше чем в гугле или citadel например.
По такой логике и работа с потоками ввода/вывода не часть языка, но простите
В таком случае большая часть языков не многим отличается от языка ассесблера
Все языки - это абстракции (синтаксический сахар, если удачные) азмы. Тот же прототип сишной функции - это макрос, например.
> Все языки - это абстракции (синтаксический сахар, если удачные) азмы.
Да знаю, Более того, даже цикл for сахар, его не было до стандрта с90даже питон можно дизассемблировать, правда так какие-то странные конструкции для переменных, а-ля store и подобное.
> Тот же прототип сишной функции - это макрос, например.
Разве? А для чего тогда всякие fastcall, stdcall? Макрос в Си прямо в текст программы же вставляется при препроцессинге.
Добавить ещё возможность нормально объявлять функции в структурах, и вот уже плюсы
Солнышко, мне не в кайф писать
struct hui {
void (function)(hui , int, int);
}
void zalupa(hui this, int, int);
hui var;
var.function = zalupa;
Я хочу
struct hui {
void function(int, int) {
print this->value;
do smth;
}
}
>нормально объявлять функции
Свеклушин положил портфель на колени, улыбаясь, вздохнул:
- Да, Серега, Серега. Морщины вон у тебя. Надо же.
- Ну и чего странного? Нормально.
- Чего ж нормального? Мастер спорта по самбо, тридцать пять лет.
- Да у тебя тоже, кстати, морщин хватает. Так что не расстраивайся шибко на мой счет. Береги нервные клетки.
Засмеялись. Свеклушин шлепнул Трофименко по коленке:
- Вот что, деятель. Давай мотай на вокзал, забирай свой угол и дуй к нам. Живо. А я щас Верке звякну, чтоб сварганила что-нибудь. Она поди дома уже. Давай, быстро.
Он встал, но вдруг вспомнил:
-Только вот погоди-ка. Норму сжую щас, чтоб домой не тащить. Хорошо, что вспомнил.
Он сел, раскрыл портфель. Трофименко курил, стряхивая пепел на асфальт.
- Где она... ага вот.
Свеклушин вытащил упакованную в целлофан норму.
- Ух ты, - Трофименко потянулся к аккуратному пакетику. - Смотри, какие у вас... А у нас просто в бумажных упаковках таких. И бумага грубая. И надпись такая оттиснутая плохо, криво. Синяя такая. А у вас смотри-ка, во как аккуратненько. Шрифт такой красивый...
- Столица, чего ж ты хочешь, - Свеклушин разорвал пакет, вытряхнул норму на ладонь, отщипнул кусок и сунул в рот. Трофименко потрогал норму:
- И свежая... во, мягкая какая. А у нас засохшая. Крошится вся... организаторы, бля. Не могут организовать...
- А вы написали бы куда надо, - Свеклушин жевал, периодически отщипывая.
- Написали, бля! - Трофименко швырнул папиросу, придавил ногой. - Не смеши, Саша.
- Не помогает?
- Да конечно. Всем до лампочки. А потом, говорят, почему периферия тянет слабо! Смешно. Сказка про белого бычка. Везут, везут опять пакеты эти. А там шуршит засохшая, лежалая. Норму уж могли бы наладить. Странно это все...
- Дааа... много у нас еще этой несуразицы, - Свеклушин сунул в рот последний кусочек, скомкал хрустящий пакетик, хотел было швырнуть в урну, но Трофименко остановил.
- Дай мне, не выкидывай. Жене покажу.
Он разгладил пакетик, спрятал в карман.
>нормально объявлять функции
Свеклушин положил портфель на колени, улыбаясь, вздохнул:
- Да, Серега, Серега. Морщины вон у тебя. Надо же.
- Ну и чего странного? Нормально.
- Чего ж нормального? Мастер спорта по самбо, тридцать пять лет.
- Да у тебя тоже, кстати, морщин хватает. Так что не расстраивайся шибко на мой счет. Береги нервные клетки.
Засмеялись. Свеклушин шлепнул Трофименко по коленке:
- Вот что, деятель. Давай мотай на вокзал, забирай свой угол и дуй к нам. Живо. А я щас Верке звякну, чтоб сварганила что-нибудь. Она поди дома уже. Давай, быстро.
Он встал, но вдруг вспомнил:
-Только вот погоди-ка. Норму сжую щас, чтоб домой не тащить. Хорошо, что вспомнил.
Он сел, раскрыл портфель. Трофименко курил, стряхивая пепел на асфальт.
- Где она... ага вот.
Свеклушин вытащил упакованную в целлофан норму.
- Ух ты, - Трофименко потянулся к аккуратному пакетику. - Смотри, какие у вас... А у нас просто в бумажных упаковках таких. И бумага грубая. И надпись такая оттиснутая плохо, криво. Синяя такая. А у вас смотри-ка, во как аккуратненько. Шрифт такой красивый...
- Столица, чего ж ты хочешь, - Свеклушин разорвал пакет, вытряхнул норму на ладонь, отщипнул кусок и сунул в рот. Трофименко потрогал норму:
- И свежая... во, мягкая какая. А у нас засохшая. Крошится вся... организаторы, бля. Не могут организовать...
- А вы написали бы куда надо, - Свеклушин жевал, периодически отщипывая.
- Написали, бля! - Трофименко швырнул папиросу, придавил ногой. - Не смеши, Саша.
- Не помогает?
- Да конечно. Всем до лампочки. А потом, говорят, почему периферия тянет слабо! Смешно. Сказка про белого бычка. Везут, везут опять пакеты эти. А там шуршит засохшая, лежалая. Норму уж могли бы наладить. Странно это все...
- Дааа... много у нас еще этой несуразицы, - Свеклушин сунул в рот последний кусочек, скомкал хрустящий пакетик, хотел было швырнуть в урну, но Трофименко остановил.
- Дай мне, не выкидывай. Жене покажу.
Он разгладил пакетик, спрятал в карман.
*в си, очевидно
>hui var;
>var.function = zalupa;
hui (ЗВЕДЗДОЧКА) var = hui_new(ТВОЯ, ХУЙНЯ);
hui var = hui_new(ТВОЯ, ХУЙНЯ);
Формат:
hui var;
var.призыв_хуйни(1, 2);
Идет нахуй. Потому что объекты без инициализации идут нахуй.
Структура не функция. У меня всё.
И да отпустит Прата тебе грехи.
Не уверен, тут скорее от компилятора зависит, в gcc если есть хотя бы один signed, то делает SETB byte; после инструкции сравнения, если оба unsigned, то SETG byte;
#include <stdio.h>
#include <string.h>
int main()
{
char str[1024];
char buffer[5];
str[0] = '\0';
for (int i = 1; i < 101; i++) {
if ( !(i % 3) ) {
strcat(str, "Fizz ");
}
else if ( !(i % 5) ) {
strcat(str, "Buzz ");
}
else {
sprintf(buffer, " %d ", i);
strcat(str, buffer);
}
}
puts(str);
return 0;
}
Держи, анон, ты молодец вообще, что Си учишь, я завидую тебе, если бы в школе Си учил, то сейчас бы моя жизнь сильно иначе бы сложилась, но я родился в бедной семье и у меня не было денег на персональный компьютер. Читабельность кода всегда превыше компактности, компилятор при препроцессинге всё равно потом все твои отступы и переход на новую строку с символом возврата каретки удалит. А вот другому человеку читать удобнее будет.
Ну, и у тебя в коде странности какие-то, а-ля того, что у тебя строка на первом же символе и заканчивается.
Добра тебе, учись и всё у тебя в жизни будет хорошо, иначе вырастешь таким мудаком, как я, и в жизни счастья тебе не видать.
#include <stdio.h>
#include <string.h>
int main()
{
char str[1024];
char buffer[5];
str[0] = '\0';
for (int i = 1; i < 101; i++) {
if ( !(i % 3) ) {
strcat(str, "Fizz ");
}
else if ( !(i % 5) ) {
strcat(str, "Buzz ");
}
else {
sprintf(buffer, " %d ", i);
strcat(str, buffer);
}
}
puts(str);
return 0;
}
Держи, анон, ты молодец вообще, что Си учишь, я завидую тебе, если бы в школе Си учил, то сейчас бы моя жизнь сильно иначе бы сложилась, но я родился в бедной семье и у меня не было денег на персональный компьютер. Читабельность кода всегда превыше компактности, компилятор при препроцессинге всё равно потом все твои отступы и переход на новую строку с символом возврата каретки удалит. А вот другому человеку читать удобнее будет.
Ну, и у тебя в коде странности какие-то, а-ля того, что у тебя строка на первом же символе и заканчивается.
Добра тебе, учись и всё у тебя в жизни будет хорошо, иначе вырастешь таким мудаком, как я, и в жизни счастья тебе не видать.
>если бы в школе Си учил
Столяров считает, что надо с Паскаля начинать. Си деформирует мозги новичкам.
>>51432
А, проебался по условию и по сути, я думал, что надо сохранить результат в str, а оно эво как...
>>51429
Паскаль противный, там надо прописывать что передаёшь функции, значение переменной, саму переменную(её) адрес ( var name_var: type ). Чем Си может испортить людей - не понимаю, но Столяров всё таки старая школа, когда он учился программировать ещё наверное Фортран учили, не то что Паскаль. Единственный плюс Паскаля в том, что он как бы показывает, что у нас вот в начале главного цикла программа идёт объявление переменных, хотя перед функциями и процедурами тоже надо было, если не ошибаюсь, которые потом в стэк занесутся, в Си же так тоже делать надо было, до с90 стандарта. Ещё в Паскале неудобная работа с кучей и с файлами.
Фортран в нашей стране никогда не учили. В 1985 году ввели информатику и учили в основном Бейсик, потому что он был вшит в ПЗУ в большинство тогдашних ЭВМ. В бедных школах вообще учились на программируемых калькуляторах или просто блок-схемы на доске рисовали.
А на доске какие правила переката, а то забыл уже? Просто в некоторых разделах, например, ai, тред перекатывают не после бамплимита, а после 1000 постов.
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf (декабрь 2020)
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf (декабрь 2020)
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Уже лет двадцать как нет.
Там перед этим getchar() стоит и процесс всё ещё активным остаётся и до освобождения памяти не дошёл.
Что такое санитайзеры и фазеры?
Если ты не пшешь под микроконтроллеры или древние ОС, то у ОС с CPU реализовано разделение памяти, где каждый процесс получает своё виртуальное адреcное пространство.
>>39427
> А как тогда крутые хакеры получают доступ к памяти процесса через другой процесс?
Или через права на отладку, или через ядро ОС. Или это не через другой процесс, а как-то иначе.
Нет, если честно, но мне очень хороший человек и по совместительству няшный кунчик пояснил, что процесс создаёт своё виртуальное адресное пространство, с которым и оперирует...
.686
option casemap: none
include c:\masm32\include\masm32rt.inc
.data
str1 DB "Fizz", 0
str2 DB "Buzz", 0
str_format_out DB "%d", 0
.code
main:
MOV EBX, 1
SUB ESP, 8
PUSH EBP
MOV EBP, ESP
LOOP1:
CMP EBX, 101
JGE LOOP1_OUT
MOV EAX, EBX
CDQ
MOV ECX, 3
IDIV ECX
MOV [EBP + 4], EDX
CMP EDX, 0
JNE T1
PUSH offset str1
call crt_printf
ADD ESP, 4
T1:
MOV EAX, EBX
CDQ
MOV ECX, 5
IDIV ECX
MOV [EBP + 8], EDX
CMP EDX, 0
JNE T2
PUSH offset str2
call crt_printf
ADD ESP, 4
T2:
CMP DWORD PTR [EBP + 4], 0
JZ T3
CMP DWORD PTR [EBP + 8], 0
JZ T3
PUSH EBX
PUSH offset str_format_out
call crt_printf
ADD ESP, 8
T3:
PUSH 32d
call crt_putchar
ADD ESP, 4
INC EBX
JMP LOOP1
LOOP1_OUT:
POP EBP
XOR EAX, EAX
ret
end main
Уложил в 61 строку на MASM32, пусть и с говнокодом, но да похуй, кто меньше сможет?
.686
option casemap: none
include c:\masm32\include\masm32rt.inc
.data
str1 DB "Fizz", 0
str2 DB "Buzz", 0
str_format_out DB "%d", 0
.code
main:
MOV EBX, 1
SUB ESP, 8
PUSH EBP
MOV EBP, ESP
LOOP1:
CMP EBX, 101
JGE LOOP1_OUT
MOV EAX, EBX
CDQ
MOV ECX, 3
IDIV ECX
MOV [EBP + 4], EDX
CMP EDX, 0
JNE T1
PUSH offset str1
call crt_printf
ADD ESP, 4
T1:
MOV EAX, EBX
CDQ
MOV ECX, 5
IDIV ECX
MOV [EBP + 8], EDX
CMP EDX, 0
JNE T2
PUSH offset str2
call crt_printf
ADD ESP, 4
T2:
CMP DWORD PTR [EBP + 4], 0
JZ T3
CMP DWORD PTR [EBP + 8], 0
JZ T3
PUSH EBX
PUSH offset str_format_out
call crt_printf
ADD ESP, 8
T3:
PUSH 32d
call crt_putchar
ADD ESP, 4
INC EBX
JMP LOOP1
LOOP1_OUT:
POP EBP
XOR EAX, EAX
ret
end main
Уложил в 61 строку на MASM32, пусть и с говнокодом, но да похуй, кто меньше сможет?
global main
section .data
fizz db "Fizz", 10, 0
buzz db "Buzz", 10, 0
fizzbuzz db "FizzBuzz", 10, 0
num db "%d", 10, 0
section .text
main:
mov ebx, 1
.loop:
xor rdi, rdi
mov eax, ebx
mov ecx, 15
cdq
div ecx
test edx, edx
jz .set_fizzbuzz
mov ecx, 3
mov eax, ebx
cdq
div ecx
test edx, edx
jz .set_fizz
mov ecx, 5
mov eax, ebx
cdq
div ecx
test edx, edx
jz .set_buzz
lea rdi, [num]
jmp .print
.set_fizzbuzz:
lea rdi, [fizzbuzz]
jmp .print
.set_fizz:
lea rdi, [fizz]
jmp .print
.set_buzz:
lea rdi, [buzz]
.print:
mov rsi, rbx
mov rax, 0
call printf
inc ebx
cmp ebx, 101
jne .loop
xor eax, eax
ret
49 строк на NASM Linux-amd64. Тоже говнокод, конечно.
global main
section .data
fizz db "Fizz", 10, 0
buzz db "Buzz", 10, 0
fizzbuzz db "FizzBuzz", 10, 0
num db "%d", 10, 0
section .text
main:
mov ebx, 1
.loop:
xor rdi, rdi
mov eax, ebx
mov ecx, 15
cdq
div ecx
test edx, edx
jz .set_fizzbuzz
mov ecx, 3
mov eax, ebx
cdq
div ecx
test edx, edx
jz .set_fizz
mov ecx, 5
mov eax, ebx
cdq
div ecx
test edx, edx
jz .set_buzz
lea rdi, [num]
jmp .print
.set_fizzbuzz:
lea rdi, [fizzbuzz]
jmp .print
.set_fizz:
lea rdi, [fizz]
jmp .print
.set_buzz:
lea rdi, [buzz]
.print:
mov rsi, rbx
mov rax, 0
call printf
inc ebx
cmp ebx, 101
jne .loop
xor eax, eax
ret
49 строк на NASM Linux-amd64. Тоже говнокод, конечно.
>include c:\masm32\include\masm32rt.inc
Но вообще, если подумать, то есть и такое решение:
global main
%include "fizzbuzz.inc"
section .text
main:
call fb
ret
.686
include c:\masm32\include\masm32rt.inc
.data
str1 DB "Fizz", 0, "Buzz", 0, "%d", 0
.code
main:
MOV EBX, 1
LOOP1:
MOV EAX, EBX
CDQ
MOV ECX, 3
IDIV ECX
MOV EBP, EDX
TEST EDX, EDX
JNZ T1
PUSH offset str1
call crt_printf
ADD ESP, 4
T1:
MOV EAX, EBX
CDQ
MOV ECX, 5
IDIV ECX
MOV ESI, EDX
TEST EDX, EDX
JNZ T2
PUSH offset str1 + 5
call crt_printf
ADD ESP, 4
JMP T3
T2:
TEST EBP, EBP
JE T3
TEST ESI, ESI
JE T3
PUSH EBX
PUSH offset str1 + 10
call crt_printf
ADD ESP, 8
T3:
PUSH 32d
call crt_putchar
ADD ESP, 4
INC EBX
CMP EBX, 101
JNE LOOP1
XOR EAX, EAX
RET
end main
Я добил до 49 строк тоже, но признаю поражение, Вы пишете на асемблере сильно лучше меня.
>>53097
Ну, это победа.
.686
include c:\masm32\include\masm32rt.inc
.data
str1 DB "Fizz", 0, "Buzz", 0, "%d", 0
.code
main:
MOV EBX, 1
LOOP1:
MOV EAX, EBX
CDQ
MOV ECX, 3
IDIV ECX
MOV EBP, EDX
TEST EDX, EDX
JNZ T1
PUSH offset str1
call crt_printf
ADD ESP, 4
T1:
MOV EAX, EBX
CDQ
MOV ECX, 5
IDIV ECX
MOV ESI, EDX
TEST EDX, EDX
JNZ T2
PUSH offset str1 + 5
call crt_printf
ADD ESP, 4
JMP T3
T2:
TEST EBP, EBP
JE T3
TEST ESI, ESI
JE T3
PUSH EBX
PUSH offset str1 + 10
call crt_printf
ADD ESP, 8
T3:
PUSH 32d
call crt_putchar
ADD ESP, 4
INC EBX
CMP EBX, 101
JNE LOOP1
XOR EAX, EAX
RET
end main
Я добил до 49 строк тоже, но признаю поражение, Вы пишете на асемблере сильно лучше меня.
>>53097
Ну, это победа.
cmake, make, yocto.
обычно в больших проектах что-то из этого используется. вполне нормальная штука.
я пишу под openWrt и там как раз такая штука.
Мой метот от Тсаря Ссей:
#include <stdio.h> main(){int (*p)()=printf;for(int i=1;i<101;i++)!(i%15)?p("FizzBuzz\n"):!(i%3)?p("Fizz\n"):!(i%5)?p("Buzz\n"):p("%d\n",i);return 0;}
Опытные аноны, я правильно понимаю, что из-за отсутствия скобок операции с вопросами будут разбираться отпизды компиляторами, т.е. поведение неопределено или я не прав?
Чем оно у тебя вообще компилится в одну строку? gcc и clang не видят код после инклюда. Если перенести main, то gcc таки компилит с варнингами, а clang эти варнинги рассматривает как ошибки и отказывается. Плюс смешаны стандарты, например в С99 и новее нельзя объявить функцию без возвращаемого типа, а до С99 нельзя объявлять счётчик в цикле.
>>55825
У тернарного оператора могут быть проблемы с отсутствием скобок, но компилятор кинет варнинг на двусмысленный код. Всегда пользуйся дополнительными флагами как минимум -Wall -Wextra.
>но компилятор кинет варнинг на двусмысленный код
Понял. А имеет смысл в 2к25 предпочитать его для сложных составных выражений вместо if-else иили case, кроме йоба обфускации? Или бустов от его использования компилятор уже не даст?
Если компилишь с оптимизациями, то не даст. Дадут ключевые слова, атрибуты, выравнивание структур. Но в 99% случаев это бессмысленный дроч ради дроча, а на работе нужно писать читабельный код, а не быстрый. За три вложенных тернарника уволят сразу нахуй.
Здравствуйте, я другой анон, но ведь тернарные операции это синтаксический сахар, они же в коде будут теми же самыми cmp, test и последующими j[] TAG.
И использование Си и означает, что нам нужно байтоёбить и это будет делать опытный человек за много деняк.
>Здравствуйте, я другой анон, но ведь тернарные операции это синтаксический сахар
Не-а, они имплементированы отдельно, и далеко не любое выражение с тернарником можно заменить на if/else, не переписывая окружающий код.
>И использование Си и означает, что нам нужно байтоёбить и это будет делать опытный человек за много деняк.
Да нет, обычно это означает, что нужно копаться в очень тухлом говне, которое едва компилится с триллионом варнингов, или переведённой промтом документации на китайский контроллер, а заниматься этим за миску риса будет лошпед, ещё не перекатившийся в веб. Ничего личного, но зп у сишников реально хуёвые, при этом требования выше, чем в вебе. Хотя конечно дела всё ещё лучше, чем у плюсовиков.
Что ты имеешь в виду анон, ты имеешь в виду ключи компиляции или что? Или ты про байтоёбское расмещение данных, попадание их в кэш и прочее? Или про то, как это компилируется в язык асемблера?
Главу про указатели можно спокойно растянуть на страниц 100 и всё по делу будет. А про работу с потоками в пору писать отдельную книгу, на самом деле.
Потому что это описано в толстой книге Компиляторы?
А, это описано в толстой книге Managing Projects with GNU Make.
И как сделать? Все примеры, какие я нашёл в интернете, предлагают ручками прописывать каждый файл в Makefile. Универсального решения нет, хотя за 50 лет наверно можно было додуматься, что людям не нужна всякая эта хрень с гибкостью, а нужно чтобы просто собрались все файлы из папки.
Почему в других языках пишут: cargo build и всё собирается без изучение отдельного языка для сборщика?
Бля, а шляпы треда нет, давайте сделаем хотяб это, полезные ссылки, кого читать, компиляторы и онлайн компиляторы, ну и остальное, а то у нас нитка как будто случайная, не надо так
О, спасибо, надо засейвить
Геты если что возвращают обычные указатели.
Весь день уже голову ломаю и понять не могу что за хуйня
Есть базовый пример:
```
# Define the compiler
CC = gcc
# Define the compiler flags (e.g., -Wall for all warnings)
CFLAGS = -Wall
# Define the source file and the output executable
SRC = main.c
OUT = main
# The default target
all: $(OUT)
# Rule to build the executable from the source file
$(OUT): $(SRC)
$(CC) $(CFLAGS) -o $(OUT) $(SRC)
# Clean up generated files
clean:
rm -f $(OUT)
```
Почитай об использовании %.c, %.o, $@ и прочих штуках
https://stackoverflow.com/questions/54854128/use-of-o-c-in-makefile
Дальше дефайнишь каждый таргет отдельно, если нужно.
Ну например, у тебя еще надо бы прогнать тесты перед тем как, то пишешь таргет test, ставишь зависимость
all: test
#Other build actions
Вот у этого персонажа классно сделан мейкфайл и юнит-тестирование. есть чему поучиться.
https://github.com/zedshaw/liblcthw
-----
>за 50 лет наверно можно было додуматься
Додумались, но каждый суслик был сам себе агроном.Сначала чисто скриптами билдили, потом додумались написать make, кроме того не было систем контроля версий и они не были всем нужны и доступны.
Просто скидывали патчфайлы и все.
Плюс не было задачи сделать единую ЭКОСИСТЕМУ библиотек.Некому было следить за этим.
Это весьма минималистичный язык программирования, который дает базу. Нужны пакеты?ты решаешь это сам сам. хотя билд система openWRT в мейкфайле пакета позволяет указать пакет, вверсию, хеш архива с исходниками и превосходно тебе все соберет
> в других языках пишут
И что, что пишут? У раста нет стабильного ABI.
https://www.reddit.com/r/rust/comments/ss2p6c/what_does_it_mean_when_people_say_that_rust_does/?rdt=56074
Каждый язык имеет свои идиомы и проблемы. тут важно решать задачу, а это не всегда про твой личный комфорт.
можно прямо из-под N/Vim :make выполнить и оно соберет тебе твою программу.
>без изучение отдельного языка для сборщика
Можно кодить на С через Visual studio/Codeblocks/DevCpp, там эта система сборки под капотом и тебе не нужно будет заморачиваться с добавлением файлов.
Но.
В реальной вакансии там может быть какой-то эмбеддед и тебе нужно будет пользоваться make/cmake или другой системой сборки и иногда там что-то добавлять. К примеру, у тебя будет SDK вендора с уже собранными дровами и ты свое приложение с ним линкуешь.
Так что я ничего плохого не вижу в знаниях, анон.
Есть базовый пример:
```
# Define the compiler
CC = gcc
# Define the compiler flags (e.g., -Wall for all warnings)
CFLAGS = -Wall
# Define the source file and the output executable
SRC = main.c
OUT = main
# The default target
all: $(OUT)
# Rule to build the executable from the source file
$(OUT): $(SRC)
$(CC) $(CFLAGS) -o $(OUT) $(SRC)
# Clean up generated files
clean:
rm -f $(OUT)
```
Почитай об использовании %.c, %.o, $@ и прочих штуках
https://stackoverflow.com/questions/54854128/use-of-o-c-in-makefile
Дальше дефайнишь каждый таргет отдельно, если нужно.
Ну например, у тебя еще надо бы прогнать тесты перед тем как, то пишешь таргет test, ставишь зависимость
all: test
#Other build actions
Вот у этого персонажа классно сделан мейкфайл и юнит-тестирование. есть чему поучиться.
https://github.com/zedshaw/liblcthw
-----
>за 50 лет наверно можно было додуматься
Додумались, но каждый суслик был сам себе агроном.Сначала чисто скриптами билдили, потом додумались написать make, кроме того не было систем контроля версий и они не были всем нужны и доступны.
Просто скидывали патчфайлы и все.
Плюс не было задачи сделать единую ЭКОСИСТЕМУ библиотек.Некому было следить за этим.
Это весьма минималистичный язык программирования, который дает базу. Нужны пакеты?ты решаешь это сам сам. хотя билд система openWRT в мейкфайле пакета позволяет указать пакет, вверсию, хеш архива с исходниками и превосходно тебе все соберет
> в других языках пишут
И что, что пишут? У раста нет стабильного ABI.
https://www.reddit.com/r/rust/comments/ss2p6c/what_does_it_mean_when_people_say_that_rust_does/?rdt=56074
Каждый язык имеет свои идиомы и проблемы. тут важно решать задачу, а это не всегда про твой личный комфорт.
можно прямо из-под N/Vim :make выполнить и оно соберет тебе твою программу.
>без изучение отдельного языка для сборщика
Можно кодить на С через Visual studio/Codeblocks/DevCpp, там эта система сборки под капотом и тебе не нужно будет заморачиваться с добавлением файлов.
Но.
В реальной вакансии там может быть какой-то эмбеддед и тебе нужно будет пользоваться make/cmake или другой системой сборки и иногда там что-то добавлять. К примеру, у тебя будет SDK вендора с уже собранными дровами и ты свое приложение с ним линкуешь.
Так что я ничего плохого не вижу в знаниях, анон.
все там пишут. найди норм книгу.
Всё очень просто сделать. А ещё есть CMake.
И даже если не хочешь учить − мы в 2025 году живём, кидаешь дерево репозитория в жпт, и она тебе нарисует мейк.
>cargo build и всё собирается
Раньше нажимали make && make install и тоже всё собиралось.
>за 50 лет наверно можно было додуматься
ты сейчас спрашиваешь вопрос уровня : Почему в момет Большого Взрыва не появились сразу люди?
На момент создани Си и Юникса, не было Ничего. Были отдельно выполненные ОС на языке ассемблера какой-то
конкретной ЭВМ и люди трудились годами перед релизом.
Не было даже текстового редактора. Не было возможности сохранить данные, не было возможности поработать дома над проектом.
Потом появился Си и Юникс. Потом уже люди написали ed, sed, vi и так работали примерно до середины 80х.
Си УЖЕ был на тот момент прорывом.
даже в совке было большой крутизной получить Сишный компилятор на советские машины.
Что это блять
>написали ed, sed, vi
На этом этапе уже стоило задумать о сборке больших проектов с сотнями файлов. У меня почему-то такая мысль возникла сразу, как появились другие файлы, кроме main.c, а у них почему-то нет.
Это потому что ты умный, анон, а они дебилы конченые.
Кочан даже поленился в конце нормальный Makefile привести, так и оставил игрушечный, где надо вручную прописывать .c и .o файлы.
>Так что я ничего плохого не вижу в знаниях, анон.
Поддвачну немного, тоже сначала не понял а зачем так заморачиваться? Хотя у меня были проблемы с девси2плюс, и я не смог вспомнить пароль от антивируса и тут многое обдумал, и решил не возращаться к компилированию через консоль, так как это муторно и отбивает желание к хуям, просто установил кодеблок, с ним нет никаких проблем.
И я к тому что действительно важная тема, а я только щас подумал что это важно. Спасибо за пост и объяснение друг. Вот так вдруг задумался что будет если все-таки встретишься с такой вот проблемой. Спасибо друзья. Я пойду опять обдумывать весь сахар гениев
Чтобы при объявлениях struct не писать(повысить читаемость) или как-то с обратной совместимостью связано?
Ну с указателем на функцию вроде бы смотрится симпатично.
typedef void (V_FP_CHARP)(char );
V_FP_CHARP pfun;
И может иметь место.
Мув же со структурами я как не понимал, так и не понимаю.
typedef struct lens (
float foclen;
float fstop;
char brand[30];
) LENS;
Ведь тут LENS всего лишь заменяет struct lens.
Если не планируешь ничего писать на С++, то смысла учить нет. Лучше глубже погружайся в си, повышай экспертность в одном языке.
Я и в Си для продакшена ничего особенно не планировал. Мне просто понравилась вся эта тема с указателями и прочим "средним уровнем", тут дается понимание как устроена память, плюс мне нравится что язык не дает права на ошибку, оставаясь при этом минималистичным. Мне кажется что каждому программисту, вне зависимости от языка, полезно это все знать и уметь. Но вот именно плюсы кажутся потерей времени впринципе.
Это всё ещё высокий уровень, если с головой уйти в реализация malloc и API взаимодействия с ОСью, можно обратно не выйти, это месяца 3 усердной работы. В плюсах также выделяется память через new, только нет проблем с преобразованием типа данных, ибо malloc войд* возвращает.
Прямо сейчас читаю. Классная книжка. Но стоит учитывать, что автор на многие вещи смотрит через чур радикально, поэтому не стоит воспринимать близко к сердцу.
А у того чувака звезды не скушались
Вкрации посмотрел содержание всех книжек. Если заменить паскаль и tcl на что-то посвежее, то должно быть ок. Разделы введение, асм, си, плюсы и хаскель выглядят интересно.
да, можно поучить. у тебя база есть.
Дальше учишь ООП, STL и будет нормально все.
На плюсах многие вещи уже есть искаропки, потому тебе легче будет освоить.
>>61055
> глубже погружайся в си,
что ты имеешь ввиду?
Может материалы какие-нибудь посоветуй.
>>61145
Читал Столярова. Неплохое чтиво, но лучше взять что-нибудь другое.
У Столярова своя методика преподавания - Паскаль, потом си и потом плюсы. Это его видение. Я не осуждаю, но считаю, что если уж ты сишник, то лучше найди в электронном виде Искусство программирования на С или Дейтел и Дейтел "как программировать на Си" что-то такое. У меня бумажная есть урвал.
Еще Язык Си в XXI веке и разные другие штуки, которые помогут тебе в разработке.
Просто по CS тебе было бы лучше поискать книгу Теоретический минимум по CS Владстона Фило. или взять талмуд:
https://is.ifmo.ru/books/2016/digital-design-and-computer-architecture-russian-translation_July16_2016.pdf
Потому что вопросы по архитектуре, прерываниям, MMU и прочее часто задают на собесах.
>Сначала прочитай книгу. Автор своё решение обосновывает.
Если ты уже знаешь какой-то высокоуровневый язык, то дрочить паскаль необязательно.
Многие, кто начинал с си, не понимают что такое побочный эффект и откровенные хаки, принятые в си, воспринимают естественными конструкциями. Представление о программировании у них деформированное.
О чем то подобном слышал, я ещё вспомнил как лет 10 назад нашёл учебник Семакина, там было не всё, но там и паскаль и си и си плюс, неслучайно паскаль обрисован в учебниках, язык это средство получения результата, ану хотя си это для души, в моём случае, я не спешу, занимаюсь когда есть время. Но паскаль явно не случайный выбор некоторых авторов
Неслучайно да, а потом паскаль выбросили на помойку и главным языком для обучения стал пистон. Тоже не случайно.
Да, спецом привить определённые навыки, и видимо сложит профессиональный характер. Да и язык очень уж благодушный.
>>61460
Тик ток тоже появился случайно ли? И мышление клиповое появилось не спроста.
Я вот любитель, но есть ведь и профессионалы, пусть си занимаются увлечённые люди, случайные тут не нужны. Без оскорблений в сторону питухона и петухонщиков, я думаю и питонить грамотно надо уметь, но туда идут возможно из-за лёгкого вката не так ли?
Жизнь меня научила одному, деньги дают за то что сделать не могут или сами это делать не хотят, вывод: дело - грязная хуйня или сложная хуйня. Научись делать сложное и устанавливай свои ценники. Скажи спасибо себе за терпение и старание
База
>>61472
Не читал Столярова, но как будто в паскале ты просто привыкаешь к базовым конструкциям: что такое переменная, что такое функция, что такое аргументы функции, области видимости и т.д. И учишься учить язык программирования. Язык-то действительно небольшой.
>>61460
Пистон учит форматировать свой код.
Пистон не учит программировать.
>>61369
>Язык Си в XXI
Спрашивал мнение в прошлый раз. Никто в треде не ответил.
Не кажется тебе, что там перебор с рокенролом и черезмерная любовь к макросам? Или в реальном коде обязательно пол программы должно быть устряпано директивами препроцессора и дженериками и без этого сейчас никуда?
>деньги дают за то что сделать не могут или сами это делать не хотят
Деньги дают прежде всего за то, на что есть спрос (что приносит деньги кабанычу), а потом уже сложность влияет на ценник. Приносит паскаль деньги кабанычу? Вопрос риторический.
>Приносит паскаль деньги кабанычу? Вопрос риторический.
Да, приносит.
Рекомендую попутешествовать по областным заводам. Там много некоторого дерьмокода и интересных решений.
>черезмерная любовь к макросам?
Имхо, макросы -важная часть Сишного кода.
можно написать некоторые вещи довольно просто используя макрос.
Да, не во всех проектах макросы уважают, но тот код, который я чинил, часто содержал логирование в виде вариадик макроса, манипуляции с очередью, проверки памяти на NULL или размерность массива (вариации на тему _countof от компании майкрософт)
https://stackoverflow.com/questions/4415524/common-array-length-macro-for-c
>Деньги дают прежде всего за то, на что есть спрос (что приносит деньги кабанычу), а потом уже сложность влияет на ценник. Приносит паскаль деньги кабанычу? Вопрос риторический.
Ст из стандарта мэк, яп для плк на производстве. Вполне похож на паскаль.
Не, у меня нет проблемы с макросами, как таковыми. Хороший инструмент и почему бы и да, когда он в тему.
Просто в процессе чтения создалось впечатление, как будто автор хочет весь код хаками захуярить и напихать столько макросов сколько сможет.
Вот поэтому и созрел вопрос: мейнстрим это или нет?
>Автор своё решение обосновывает.
Автори пишет, что Паскаль в обучении хорош тем, что он с одной стороны является высокоуровневым языком, с другой там есть указатели и для ньюфага это удобный вариант перед изучением в частности Си. Чем его не устроил Go, который тоже высокоуровневый и тоже с указателями и тоже быстро учится хз.
В го полным полно побочных эффектов и подводных камней. Он унаследовал многие "плохие" практики из си, поэтому совсем не подходит в качестве первого языка. Когда я слышу, что рекомендуют учить го новичкам, мне всегда кажется, что это какой-то троллинг.
Ещё го довольно специфический в техническом плане и не позволяет писать многие программы общего назначения. Столяров же использует простые средства стандартной библиотеки Паскаля для работы с текстовой псевдографикой, чтобы заинтересовать новичков красивостями. А что на го? Нужно скачать какую-то "левую" библиотеку с гитхаба, которая работает через пень-колоду, а через пару лет автор может там всё поменять и она перестанет работать. Явно такой подход не для новичков.
Я кстати так и не понял что Столяров понимает под побочными эффектами, на эту тему даже как-то срач был. Он например пишет что любой код на Си будет с побочным эффектам, но на Паскале - нет. Хз почему.
Он про это много пишет вообще-то в своей книге. Там целые разделы посвященны побочным эффектам. В основном там про то, что в си функции вызываются не ради возвращаемого значения, а ради побочного эффекта. В Паскале же для этого используют процедуры. Также все присваивания - это операции, которые возвращают после себя результат присваивания, но их используют как правило ради побочного эффекта - присвоить новое значение переменной:
x = y = z;
муравей на нитке проползает на 1 см вперёд, после нить растягивается на 100 самнтиметров. Начальная длина нити 100 сантиметров, позиция муравья 0. Дойдёт ли муравей когда нибудь до конца?
вроде сколько не тяни нить, его позиция относительно конца не должна уменьшаться в процентном сооношение (потому что пройденный путь тоже растягивается), но почему то уменьшается (попробуйте поменять число итераций). Проблема банально в переполнении?
https://pastebin.com/TjkWThba
Какое условие ебанное, ты оригинал можешь скинуть? Если это оригинал, то шли автора задачи нахуй, ибо формулировки пиздец ебанные.
Про растяжение пройденного пути не понял вообще, к задаче была приложена картинка или схема хотя бы с пятью первыми итерациями, а то из условия нихуя не понятно. Я буквально так понял задачу.
1. муравью надо пройти 100 сантиметров по прямой, муравей двигается шагами (ходами) по 1 сантиметру, после кажого шага длина нити увеличивается на 100 сантиметров, нить растягивается равномерно, к примеру если муравей прошел 25 процентов пути, 75 сантиметров закинется вперед муравья, 25 назад
2. На первом ходу муравей двинулся вперед на 1 сантиметр, после чего ниь растянулась на 100 см.
Его положение было равно 1/100 относительно конечной точки, значит 99/100 закинется вперед, 1/100 закинется назад, в итоге муравей имеет 2 см позади себя и 198 впереди, очевидно отношение пройденного расстояния к общему после растяжки не меняется
На втором ходу он двинулся еще на 1см, тперь отстоит от края на 3 см и впереди него 197 сантимптров, растягмваем дальше... (Функция мап все делает)
Прогнал через десмос, там на миллиардной иьерации муравей проходит 20 процентов пути, значит скорее всего проблема именно в переполнении и была
А тут разве не через обычную арифметическую прогрессию решать?
Даже пусть так будет, а то Си-шные математики меня загнобят.
limits.h