Здесь 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 (или другой стандарт, но явно указывай)
Записал. Свои поделия я пока пишу правильно и не хардкожу ничего, в т.ч. даже бегло еще не читал стандарты. Поэтому и был удивлен такому эффекту.