Здесь 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;