Этого треда уже нет.
Это копия, сохраненная 29 апреля 2021 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
C Propaganda.jpg1,9 Мб, 2000x2610
C Programming Language #66 /clang/ # OP 1873113 В конец треда | Веб
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [​i​] или ∗.

Что читать:

- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2583.pdf (октябрь)

Чем компилировать:

- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.

Что еще почитать:

http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.

Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.

Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).

Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.

Ben Klemens "21st Century C: C Tips from the New School" (2012)

Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)

Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)

MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf

Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C

https://github.com/kozross/awesome-c

Онлайн-утилиты:

- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.

Прошлые треды:

- №63: https://arhivach.net/thread/623165/
- №64: https://arhivach.net/thread/623166/
- №65: https://arhivach.net/thread/637465/ >>1852710 (OP)
2 1874272
хочу работать со строками, но ехидный vs19 запрещает передавать аргументы в scanf_s("%s", str) - как лечить?
3 1874290
>>874272
Так крякни его, и сразу сможешь использовать эту функцию нормально без деморежима.
4 1874674
Здрасьте. argv[] принимает аргументы в регистры согласно ABI?
5 1874703
>>874674
Да, если архитектура это предусматривает.
main не фактическая точка входа в программу
argv это массив указателей, элементы будут все так же лежать где-то в памяти.
sage 6 1874799
>>874674
Чё ты несешь.
Аргументы в main передаются согласно ABI.
7 1874941
Экспериментирую с CLI программами, вот хочу поинтересоваться, а как можно вызвать аргументы для ввода через TAB?
К примеру: беру я название программы которую нужно открыть, ввожу первые 3 буквы, нажимаю TAB и чтобы все файлы которые начинаются с этих букв показывались в консоли.
Это как то через какие то готовые утилиты делается и библиотеки да?
8 1874945
Еще спрошу. А как открыть файл в режиме w+ и сделать так чтобы можно было не просто его дополнять, но и менять содержимое. Намекните хотя бы на библиотеку или инструменты которые можно использовать. Редактор будет тоже в CLI.
Если что я сейчас изучаю stdlib с fopen и т.д
9 1874985
>>874941
Какой-то bash это и так сделает если твоя приложуха лежит в пути который в PATH.
А если ты хочешь ещё и аргументы дополнять - там уже надо читать как bash autocomplete настраивать и писать скрипт.
Powrshell кажись тоже там умеет.
>>874945
r+ тебе нужен.
Ну а вообще если файл большой, и надо активно мелкие моменты в нем менять - изволь делать через mmap, но если ты начинающий, то даже не связывайся с этим.
10 1875003
>>874985
Спасибо. Тогда не буду. Буду учить дальше.
11 1875935
Аноны объясните дауну последовательность действий
a=b++ b++ b++;
13 1875957
>>875935
Вообще UB. Ты не знаешь точно когда компилятор может всунуть инкремент - после всего блока вычислений три раза, или после каждого взятия значения из b.
https://ideone.com/QrjJty
sage 15 1876197
>>875935
Откуда лезут с этим вопросом? Это троллинг или на собеседованиях такое спрашивают?
Screenshot2020-12-08-23-22-25-847pdf.reader.png82 Кб, 1060x522
16 1876216
>>876197
Похожий пример найден в книге>>876197
17 1876222
>>876197
В пабликах, это мем уровня "любой пятиклассник решит эту задачку"
изображение.png35 Кб, 731x665
18 1876302
Как что-то отправить процессу-потомку по созданному анонимному каналу?
19 1876309
Как работает выравнивание? Если я в мейне объявлю char x; и int y;, то x находится по адресу 10, а y - по адресу 11. Разве не должно быть какого-то выравнивания в памяти? То есть, почему y размещается по адресу 14? Ведь на 32 бит системе, машинное слово составляет 4 бита. То есть проц не сможет обратиться к 11-му адресу, ибо он читает по 4 бита, а 11 не кратко четырем. Или я что-то не так понимаю?
sage 20 1876337
>>876309

> по адресу 11


Нет.
21 1876489
>>875935

>a=b++ b++ b++;



a = b + +b + +b++;

то же самое что
a = b+b+b;
b++;
22 1876515
>>876489
Там знаки умножения пропущены
https://ideone.com/us8jid
23 1876531
>>876515
Тогдв вывод неправильный.
Должен быть 1 и 4
24 1876793
>>876216

выбрось эту книгу. дважды изменение одного объекта в памяти, не разделённое секвенс поинтом - ub
25 1876815
>>876531
Тут не бывает правильного вывода, как не бывает правильного значения у фразы "нельзя казнить помиловать"
26 1876845
Сап, программач, начал изучать С и не понимаю одну вещь. Как я понял, когда инициализируем переменную к примеру

long i = 5 + 3;

То сами 5 и 3 перед тем как быть посчитанными и стать i принимаются за int, если не хватает места то unsigned int - long - unsigned long - long long - unsigned long long. Так вот в чем смысл добавлять суффиксы к этим статическим числам типо ULL (unsigned long long), если язык сам это делает автоматически? Не понимаю зачем это нужно именно с интами, с числами с плавающей точкой понятно, там изначально все числа даблы и если хотим сэкономить память, то используем флоаты при вычислении. В итоге контролируем не только к какому типу приводить, но и с каким вычислять. Но насколько я понимаю с интами все наоборот и изначально отчет стартует с самого минимального типа инта, и сам приводится автоматически к нужному типу. Так зачем это нужно? Сэкономить не выходит очевидно.
27 1876862
>>876845

> если не хватает места то


хуй в рот. (1 << 32) == 0
1572125282773.png19 Кб, 567x340
28 1876864
>>876845
Надеюсь данный скрин поможет тебе приблизиться к пониманию.
29 1876911
>>876845

> Сап, программач, начал изучать С


Рекомендую дальше продолжать изучение и искать смысл для каждой возможности этого чудесного и максимально простого языка.

>Так вот в чем смысл добавлять суффиксы к этим статическим числам типо ULL (unsigned long long), если язык сам это делает автоматически?


Чтобы подсказать компилятору как лучше сделать, очевидно же. Если ты пока не столкнулся с проблемой, это не значит что ее нет.
30 1876938
>>876911
Ну меня конкретные случаи применения интересовали.

>When you declare a decimal integral literal in C, the compiler treats it as the first integral type that can hold the value, checking in the following order: int, long int, long long int. But your number is so large that it can not fit the signed long long type. To get rid of the warning, define the literal explicitly as unsigned by adding U or u.



Как я понял есть два случая:
1. Когда проводим вычисления и мы перелетаем границы типа при этом используя два младших типа (int + int = int, по логике компилятора, но это может быть и лонг, поэтому хотя бы один литерал нужно обозначить как лонг, чтобы производилось приведение типов, если у нас такой случай.)
2. Когда литерал больше типа long long, то есть unsigned long long, тогда достаточно просто поставить U или u и компилятор поймет, что имеется ввиду unsigned long long.

Короче учебник неверную информацию предоставил о поведении компилятора, мол литералы приводятся прям до unsigned long long, хотя выше long long нужно уже вручную обозначать и особой разницы между ULL, UL, U нет, они только в выражениях играют роль, если приводить надо.
31 1877020
>>876815
У операции "присваивание" приоритет выше, чем у постинкремента.
У постинкремента самый низкий приоритет.
Покажи мне компилятор, который посчитает это выражение как 6 и 4.
image.png9 Кб, 458x130
32 1877031
image.png87 Кб, 1541x730
33 1877034
>>876337
Пруф в пикриле.
Так что вопрос >>876309 актуален
34 1877035
>>877034
Это какой-то феерический пиздец с ключами.
Где вы такие "компиляторы" находите?
Сами пишите?
35 1877036
>>877034
%p для адреса чего не пользуешь?
36 1877037
>>877034
А может быть у тебя 8-битный процессор? Тогда вполне может быть.
37 1877038
>>877035

>Это какой-то феерический пиздец с ключами.


Что с ними не так?

>Где вы такие "компиляторы" находите?


Обычный онлайн компилятор. Написал в нем, потому что пк не под рукой.
>>877036
Чтобы явно показать, что следующий адрес на единицу больше в десятичной системе. В общем, для наглядности конкретного примера, не более.
1537388666261.png116 Кб, 1920x750
38 1877040
>>877020

>У постинкремента самый низкий приоритет.


Это неважно, потому что в данном случае важны точки следования (sequence points) а их тут нет
Это UB (Undefined behavior), неопределенно поведение. Оно не определено, хоть и не является ошибкой. Компилятору на вход дали мусор, компилятор может выдать мусор.
Более того, сегодня он тебе выдаст 1 и 4, а завтра ты допишешь какую то функцию, оптимизация поменяется, и выведет что то другое - why not?

>Покажи мне компилятор, который посчитает это выражение как 6 и 4.


Clang, GCC.
39 1877041
>>876309
Если у тебя не ARM, x86 умеет обращаться к любой ячейка памяти, почему же нет?
40 1877046
>>877037
Вряд ли на хосте того веб-компилятора используется восьмибитный проц. Ниже результаты msvc и gcc. В обоих случаях компилировалось под x86 32-бит. Видно, что char всегда располагается по нечетному адресу, а int - по четному (возможно, кратному 4-м). Чем это обусловлено? Еще раз повторю вопрос: разве не должно применяться принудительное выравнивание памяти по 4 байта на 32-бит и по 8 байт на 64-бит, дабы соответствовать машинному слову? Ведь так процу на 32 бит придется бегать не по 4 294 967 296 адресам, а по 1 073 741 824 фрагментам по 4 байта. Я вообще раньше думал, что так и работает. Но факт того, что char'ы размещаются в нечетных адресах уже приводит к тому, что разметка наебется. Плюс, чел >>877041 говорит, что x86 может обращаться к любой ячейке. Если по умолчанию компиляторы для x86 не включают выравнивание в ОЗУ, то нахуя они это делают в структурах, например?
41 1877048
>>877034
А выравнивание стека включено? Если нет, то все верно на скриншоте.
42 1877056
>>877040
А разве у тебя компиляторы не соптимизировали в константы оба числа?
43 1877058
>>877048
Я хз, что за компилятор там используется и с какими ключами он запускается по умолчанию. Вообще, такие вещи касательно выравнивания как-то описываются в стандарте языка? Или это уже приколы компиляторов и только?
44 1877060
>>877046
Процессор всё равно будет выбирать с шины или из кэша целым словом. Ради теста сделай два char, а затем int
Наверняка в памяти каждое из них будет в границах 4-х байт.
А уже как внутри этих 4-х байт будет выровнен char это уже дело десятое.

Хотя... с другой стороны, если приведёшь неыровненный указатель к указателю на int, то получится чушь. Странно. Но проверять лениво.
45 1877062
>>877058

>такие вещи касательно выравнивания как-то описываются в стандарте языка?



va_arg должен понимать выравнивание и он платформо и системо зависим. Но видя какое выравнивание тут постят троллят вестимо, лучше всегда смотреть что сгенерировал компилятор, когда выравнивание критично.
46 1877070
>>877056
А какая разница? Язык это язык, компилятор это компилятор.
47 1877083
>>877060

>Наверняка в памяти каждое из них будет в границах 4-х байт.


Да, так и вышло. Если добавить еще три чара, то адреса будут:
41 - char
40 - char
39 - char
38 - char
34 - int (с 34-го по 37-й байт -- 4 байта)
То есть фрагменты действительно по 4 байта, если объявлять char компилятор ставит его в самый последний байт фрагмента. Т.е., фрагмент в 4 байта заполняется от начала к концу.

>Хотя... с другой стороны, если приведёшь неыровненный указатель к указателю на int, то получится чушь. Странно. Но проверять лениво.


Почему чушь? Указатель же может в любой адрес указывать. Тип, на который он указывает, нужен лишь для адресной арифметики.
изображение.png39 Кб, 1062x582
48 1877085
>>876309
Выравнивают структуры.
Зачем одинокую переменную выравнивать? Нету смысла.
Более того, есть команды во всяких армах/riscv которые могут делать load/store для байтных значений. По твоей логике выходит если у процессора машинное слово это 4 байта, то он с другими типами не должен иметь возможности работать и нужно городить костыли?
На пикриле можешь увидеть как компилятор спокойно кладет по адресу SP + 31 значение char командой strb. И ничего плохого не случается.
49 1877090
>>877085

>Выравнивают структуры.


Так а в чем смысл применять выравнивание к структуре?
50 1877106
Пытаюсь написать трубу du myfile . | awk '{print $1;}', чтобы был вывод типа
4
180
Что надо выводится, но awk продолжает принимать на вход строки с клавиатуры и не спешит завершать работу. Почему так и как его заставить сдохнуть после вывода этих двух чисел?

if (fork() == 0)
{
dup2(desc[1], 1);
execl("/bin/du", "du", "myfile", ".", NULL);
}
else
{
wait(&s);
dup2(g[0], 0);
execl("/bin/awk", "awk", "{print $1;}", NULL);
}
}
sage 51 1877150
>>877034
Переформулируй вопрос. На пике все объекты выравнены (остаток от деления адреса на размер = 0)
52 1877636
>>877106

>dup2(g[0], 0);


dup2(desc[0], 0)
фикс
sage 53 1877710
>>877636
И wait не нужен.
VirtualBoxdeb9209122020232946.png143 Кб, 1024x768
54 1877970
Ядерные хакеры здесь? извольте ревьюить: https://github.com/hakavlad/le9-patch

>The attached kernel patch (applied on top of 4.18.5) that I've tried, almost completely eliminates the disk thrashing(the constant reading of executable(and .so) files on every context switch) associated with freezing the OS and so, with this patch, the OOM-killer is triggered within a maxium of 1 second when it is needed, rather than, without this patch, freeze the OS for minutes

55 1877991
>>877970
Нахуя крестовый коммент.
56 1877993
>>877970

>, without this patch, freeze the OS for minutes


Linux kernel. 29 years gone.
Are you serious?
57 1877994
>>877991
Где?

более ценные замечания есть? какие-то явные ошибки логики?
58 1877996
>>877993
Да. В ридми ссылки в конце. КАк раз этот патч исправляет корень проблемы.
59 1878001
>>877996
Ну да, теперь "замерзает" ни на минуты, а "всего-лишь" на одну секунду. Это не пиздец ли?
VirtualBoxdeb9208122020184953.png90 Кб, 1024x768
60 1878003
>>878001
нет никакой секунды как правило, все мгновенно
61 1878012
>>878003
Патч посмотрел. Почему именно 250 Мб?
Отпишешь сюда что Торвальдс скажет. Или мэйнтенейр. Интересно же.
62 1878013
>>878003
Ты даже свап сделал 2xRAM, ути.
Сколько тебе лет?
63 1878016
>>878013

>Ты даже свап сделал 2xRAM, ути.


Это проблема?

32 годика
64 1878018
>>878012

>Почему именно 250 Мб?



Патч не мой. В другой версии дефолт 64 и мождно настраивать.

Читай ридми внимательно - патч создал анон и исчез\. Я воссоздал его труды.
65 1878034
>>878012
Потому что это реально хороший порог. В федора 33 демон uresourced резервирует 250м для DE.
66 1878409
сап, глупый вопрос. Учусь в ПТУ на 09 02 03. Основной язык программирования у нас Си , а также параллельно Js c php и SQL. Таки вот это рассчитано лишь на 1 год обучения. Что будет ждать меня на следующем курсе? Неужели C++ или C#. Или продолжим зубрежку? Поделитесь опытом с зеленым, как у вас проходило обучение в ПТУ.нет, программы на следующий год нету, только 1 год существует в моей мухосране ПТУ где обучают программированию(конкретно на базе 11 класса) Не бейте плиз, просто ответьте.
67 1878437
>>878409
Запомни, учишься ты сам. А пту/универ/остальная шарага нудны чтобы подтянуть слегка уровень в общем развитии и найти людей с такими же взглядами как ты.
Без разницы что дальше изучаешь.
Можешь вообще хоть забить, не ходить туда. Главное самостоятельно обучаться.
68 1878498
>>878437
Я так и делаюмои бивисы некоторые еще до массивов не дошли, лол, но просто интересно, что ждет дальше? Какой язык программирования будет, или последующая зубрешка си'шки и js. Просто хочу знать и да, и смешно слушать про саморазвитие и т.п в си треде, лол.
69 1878598
>>878409
план обучения ищи на сайте своей шараги
70 1878599
>>878437

>Запомни, учишься ты сам.


Да.

>А пту/универ/остальная шарага нудны чтобы подтянуть слегка уровень в общем развитии и найти людей с такими же взглядами как ты.


Лолнет. Учебки не учат, а калечат. Это такой фильтр/экзамен на "взрослую жизнь", принуждающий делать всякое бессмысленное говно уровня копать от забора и до обеда "потому что важный начальник (здесь препод) скозал нада" молча повинуясь, и заодно вертеться в обществе, выкручиваясь с оценачками и прочей поебалой, чтобы не делать всё как честный дурак и не сдохнуть от стресса в результате. В итоге выходят годные члены общества - рабочие мураввьи, без мозга, но исполнительные и умеющие в коллектив, где можно - откосить, кому нужно - подсосать, и так далее. Вот что учат все эти учебки.
71 1878611
Ладна, какой-то тред обиженнок собрался
72 1878616
>>878599
Высер душевно больного школьника который не осилил пту?
73 1878618
>>878599
Все так, а это что, плохо?
74 1879050
>>873113 (OP)
Сап байтоебач. Дублирую пост с C++ треда. >>1879047 →
Есть функция на Си и ее интерпретация на асме, пик тотали рилейтед.
Казалось бы, компилятор должен выделить 16 байт под буфер и 4 байта под флаг, и тогда стек должен выглядеть как на рисунке 1, но нет, он выглядит как на рисунке 2. А именно -- флаг, 12 байт непонятной хуйни, 16 байт буфера, 8 байт указатель (типа в регистре он их оставлять не хотел) и еще 8 байт выделенных хуй знает зачем. Больше всего меня беспокоят 12 байт между флагом и буфером, т.к. от этого зависит, как будет работать эксплойт через переполнение буфера.
Через компилер эксплорер код прогнал, гцц и клэнг выдают примерно то же самое. Пока что нагуглить смог только canary value, но не уверен, что это оно.
75 1879065
>>879050
Портфель собирай, хакерман это паддинг
76 1879104
>>879050

>Казалось бы, компилятор должен выделить 16 байт под буфер и 4 байта под флаг,


размер слова в стеке равен разрядности процессора.

Ассемберный код не соответствует картинке с исходником.
77 1879188
Я не понимаю, почему нельзя избавить стандарт C от ub. Вот, например, такой код:

int b = 1;
b = ++b;

Я так понимаю, значение b может быть 2, если пре-инкремент прибавит к b единицу и вернет полученное значение, которое затем будет присвоено b. Или же b может быть равно 3, если будет отдельно посчитано значение b+1 (без изменения значения b), и уже после того, как полученное значение будет присвоено b, выполнится инкремент. То есть, либо это сработает так

b = b+1;
b = b + 1;

либо так

b = b + 1;
b = b;

Вопрос в том, почему нельзя уточнить этот момент в стандарте? Например, обязать реализацию выполнять преинкремент сразу, и не считать b+1 отдельно. Неужели, эта проблема не решается?
78 1879192
>>879065

>это паддинг


Понял, спасибо. Забыл сказать, что компилировалось скорее всего с флагом -fno-stack-protector. Нагуглил, что gcc выравнивает стек по 16 байт. Т.е. там получается как на картинке пикрилейтед слева? Почему он не может сделать как второй вариант? Гцц без флагов оптимизации просто в тупую выделяет переменные по одной и каждый раз делает алигнмент, вместо того, чтобы выделить сразу все и сделать алигнмент для всех? Второй вариант расценивается уже как оптимизация?
Олсо, попробовал флаг mpreferred-stack-boundary=3, я думал, что он выдаст третий вариант, но раздутый пэддинг никуда не пропал, как будто гцц вспомнил, что стэк баундари равно 3 только когда отнял из rsp 40 байт.
>>879104

>размер слова в стеке равен разрядности процессора.


Так тут все равно лишнее место получается, даже если выравнивалось по 8 байт.

>Ассемберный код не соответствует картинке с исходником.


Не понимаю, о чем ты, compiler explorer почти идентичную залупу выдает.
https://godbolt.org/z/nTqYen
79 1879193
>>879192
На второй картинке ошибка в четвертом варианте, там последнего пэда нет, ну вы поняли в общем.
80 1879250
>>879192
С -O3 вообще переменной flag нету, просто в аккумуляторе значение и сразу возврат.
81 1879275
нужно получить сертификат на sololearn по С курсу,но я не знаю английский и не хочу вникать в суть так как мне это не очень нужно.Вопрос???? где найти готовые ответы или может есть другие варианты
Стикер512x512
82 1879276
83 1879278
>>879276
Ответ отрицательный,еще варианты?
subj.PNG46 Кб, 1296x1000
Как пофиксить? 84 1879285
85 1879288
>>879285
Либо перестаешь пользоваться scanf и переходишь на какой нибудь fgets
Либо затыкаешь варнинг, задав #define _CRT_SECURE_NO_WARNINGS как там написано
86 1879293
>>879285
А, ну что касается первого ворнинга, scanf возвращает количество распарсеннгого, то есть ты можешь обрабатывать ошибки
int read_x = 0;
do {
read_x = scanf("%f", &x);
if(read_x == 0) printf("ошибка ввода бла бла");
} while (readx == 0 && ready == 0);
87 1879303
>>879285
scanf_s (если ругает ко всей хуйня добать _s) и будет робить
88 1879305
>>879293
хуиту нисешь
sage 89 1879312
>>879285
Поменяй компилятор или подкрути, чтобы были ПРЕДУПРЕЖДЕНИЯ, а не ШУМ.
90 1879317
>>879285
и зачем тебе булевская библиотека в таком примере?
91 1879322
>>879317
что такое булевская библиотека?
92 1879325
93 1879338
>>879192

>Не понимаю, о чем ты, compiler explorer почти идентичную залупу выдает.



var_4 откуда взялась?
94 1879339
>>879278
Учи английский. Без него тебе только в 1С программировать придётся.
95 1879345
>>879250
Получается так.
>>879338
Это flag, я не весь код скинул, а только фрагмент, который меня интересует, дальше там условные переходы.
Без -fno-stack-protector кстати там реально будет лишняя переменная, видимо защищающая стек от повреждения.
96 1879357
>>879325
так нахуя тут проверка? Явно человек учиться и до циклов не дошел, а ты его грузишь лишней инфой. Да и проверка на дурака нахер тут не нужна в реалиях.
97 1879386
>>879357
Он спросил что у него за ворнинг. Там прямым текстом написано что программист игнорирует возращаемое значение. Я написал зачем эта функция что-то возвращает.
98 1879462
>>879386
Стандартный варнинг в vs19, если не написать _s в конце scanf. Держу в курсе. Эта хуита и так будет работать, без проверки
на дурака.
image.png516 Кб, 699x628
99 1879558
>>873113 (OP)
ЯННП. Объясните пж.
Вот у меня есть файл yoba.c. К нему я инклюжу yoba.h.
Так вот, в файле yoba.c у меня было несколько переменных и функций с идентефекатором static и все компилится/билдится. И я часть из них перенес в файл yoba.h и прога все равно компилтся без ошибок.
Но какого хуя? Ведь идентефикатор static делает видимость только в пределах одного файла, почему тогда функции и переменные, обозначенные в файле yoba.h видны в файле yoba.c????
sage 100 1879624
>>879558

> одного файла


Объектного
101 1879671
>>873113 (OP)
Няшки подскажите, на сколько рекурсия отсасывает в производительности? У меня есть рекурсивная функция, четкая и красива, а вот переписать ее это получается ебаный нечитаемый ад.
102 1879675
Как записать переменную в файл в big endian?
103 1879691
>>879675
Напиши лучше функцию, которая будет делать биты в твоей переменной наоборот.
изображение.png4 Кб, 524x183
104 1879712
>>879691
Вот так норм?
sage 105 1879727
>>879671
Научись измерять.
106 1879730
>>879727
Что бы измерить, нужно переписать в нерекурсию, а это пиздец
107 1879765
>>879730
Сравни количество слов, сохраняемых на стеке с тем, сколько будешь сохранять после переписывания. Есть разница в разы?
А глубина рекурсии какая?
108 1879768
>>879765

>А глубина рекурсии какая?


Не более 5

>сколько будешь сохранять после переписывания


Я там сам стек заводил пихал туда состояния и я ебанулся за ним следить, код превратился в нечитаемое говно и мой мозг поломался
109 1879780
>>879768

> 5


Это хорошо, возвраты будут предсказываться. Оставь как есть.
110 1879842
>>879671
Лол, как это вообще возможно? Все итеративные алгоритмы в разы проще и понятней.
111 1879930
>>879671

>на сколько рекурсия отсасывает в производительности?


С чего бы это? Если не гоняешь по стеку большое количество аргументов функции, то рекурсия вполне хороша.

Ну а так считай сам - на первом входе будут Page Faults при росте стека. Но дальше эта память твоя и просадки по скорости не будет.
112 1880106
test
113 1880561
>>879842

>Все итеративные алгоритмы в разы проще и понятней.


Чигобля? Даже школьный фибоначчи легче в рекурсивном виде.
114 1880562
>>879930

>С чего бы это?


Там же вроде при вызове функции контекст сохраняется?
115 1880701
Чего бы интересного забабахать на Си?
116 1880707
>>880562
Точно, ещё и локальные переменные к аргументам добавляются.
Но всё равно стек "дрочится" только единожды. Дальше виртуальные страницы стека уже отображены процессу и всё быстро работает.
117 1880709
>>880701
Виртуальную машину. Не полностью, а просто выполнение инструкций. Без прерываний, без видео и любой периферии - просто виртуальную машину, чтобы умела по шагам выполняться и показыват текущее значение регистров, верхушки стека и по желанию дамп памяти.
sshot-2020-04-21-20-48-07.png31 Кб, 789x557
118 1880733
>>880701
Поиск и извлечение всех webp-файлов из произвольного контейнера, используя небольшой буфер, 64 Кб, например.
119 1880788
>>880561
Лолчто? Итеративный фибоначчи занимает пару строк
int sum = 1;
while (n > 1) {
sum *= n;
n--;
}
120 1880794
>>880788
Иы хуйню написал, школьник
121 1880796
>>880794
Иди стек прокручивай, неуч.
122 1880798
>>880794
Ой всё.
int x = 0, y = 1, z = 1;
for (int i = 0; i < n; i++) {
x = y;
y = z;
z = x + y;
}
123 1880808
>>880798
И ты обосрался снова
124 1880815
125 1880818
>>880815
0, 1, 1, 2
126 1880827
>>880818
По делу есть что? То что у зумеров считают с нуля меня не интересует.
127 1880832
>>880827
Ну конечно, у тебя сразу с двух, лол
128 1881265
Срочно нужен разбирающийся человек, чтобы помочь лабы доделать.
лабы первого курса
129 1881269
>>881265
Сколько платишь?
130 1881271
>>881269
Сотню нихуя
131 1881285
>>881271
Пошёл нахуй. И не возвращайся.
132 1881296
>>881285
ты агрессивный какой-то, родители в детстве много били?
133 1881377
>>881265
Читай шапку.
134 1881395
>>881377
Прочитал, там нет ничего, что позволило бы анону выше послать меня
135 1881443
>>881395
Напомни, зачем тебе помогать бесплатно да еще и срочно?
136 1881512
>>881395
Лабы нахуй, это стандарт борды.
137 1881591
>>881443
Возможно тебе будет интересно, порешать простые задачки, поотвечать на нелепые вопросы начинающего в этом деле. Там не очень много
138 1881634
>>881591
Нет, это не интересно
139 1881981
int nums[8], reverseNums[8];
int i, j, size;

printf("Введите восемь целых чисел: ");

scanf("%d %d %d %d %d %d %d %d", nums);

//printf("%d\n", nums[0]);

size = sizeof(nums) / sizeof(int);
//printf("%d", size);

for(i = size - 1, j=0;i>=0;i--, j++)
{
reverseNums[j] = nums;
printf("%d", reverseNums[j]);
}

for(j = 0;j < size;j++)
{
printf("%d", reverseNums[j]);
}

Цель отобразить массив nums в обратном порядке.
Какого хуя ошибка сегментации вылетает?
Судя по отладке с помощью printf проблема где то ещё на чтении чисел. Хотя scanf допускает применение нескольких спецификаторов через пробел.
140 1881992
>>881981
Толсто.
141 1881995
>>881992
Я реально не понимаю. Я только-только осваиваю
142 1881997
>>881995
Сколько спецификаторов столько и указателей в аргументах scanf должно быть.
143 1881998
>>881995
Т.е. &nums[0], &nums[1] и тд
144 1882001
>>881997
>>881998
Спасибо. На счёт целочисленных массивов прата не уточнял. Хотя вроде подобное на строке сработало и там я индексов не вводил.
145 1882155
Собираю модуль ядра, большую часть исходников kbuild собирает сам, но некоторые мне нужно собирать самому в особом виде, а потом подкладывать объектники просто. Типа filename.o_shipped

Но вот проблема, kbuild хочет .cmd файлы иметь для всех объектников. Якобы, чтоб как-то проверять что-то связанное с необходимостью пересборки.
И он их сам генерит, если сишники сам собирает.
Но для готовых объектников не генерит.
Я воткнул везде touch .object_file_name.o.cmd - помогло. Но это вроде как костыль. Знает кто?
146 1882180
Приветствую. Как написать прокси-сервер для игры на Winsock2? Обязательно ли ставить ловушку на функцию connect или можно как-то из ловушки WSASend / WSARecv передавать данные на мой сокет а потом с него уже на клиент / сервер? Помогите пожалуйста.
147 1882234
>>882155
Enjoy your сборка проприетарного модуля с блобами.
148 1882256
>>882234
Так-то необязательно проприетарного. Там асмовые исходники собираются отдельным ассемблером.
149 1882356
>>882256
Тогда почему не добавить его нормально в систему сборки ядра? Вроде как модули на ассемблере в линуксах тоже есть.
150 1882432
>>882155

> Когда лень писать Makefile

151 1882729
Почему пикрил 1 код работает как надо, а пикрил 2 выдает ошибку пикрил 3? Ведь по сути они делают одно и то же, какая разница, передать указатель и разыменовать его, или передать структуру?
(Про -> знаю, записал именно так для наглядности)
152 1882734
>>882729
в строках из ошибки присваивание элементу s.data значения и распечатывание соответственно.
153 1882736
>>882432
В смысле лень?
Это всё в мейкфайле
154 1882777
>>882729
Потому что во втором случае создается копию структуру и инициализируется. Изначальный объект, который в main, при этом остаётся неинициализированным.
155 1882785
>>882777

> Потому что во втором случае создается копию структуру и инициализируется. Изначальный объект, который в main, при этом остаётся неинициализированным.


Не понял. Как инициализация зависит от вызова функции где-то дальше по программе?
156 1882787
>>882785
Ты вызываешь InitStack, где полям структуры присваивается значения, в том числе происходит аллокация памяти.
После выхода из функции копия структуры уничтожается (а память утекает).

struct stack s остаётся дефолтным, с не инициализированными полями, без аллоцированной памяти.
157 1882791
>>882787
А лол, понял, спс большое.
image.png111 Кб, 500x483
158 1882983
159 1883121
Кто-нибудь может пояснить за conversion specifier %g? Как я понимаю он сравнивает результаты %e и %f и выдает наиболее короткий. Только можно ли к нему применять аргументы в стиле %5.2g? У меня фигня какая-то выходит на этом моменте.
160 1883127
>>881981
#include <stdio.h>

int main(void)
{
int nums[8], reverse_nums[8];
size_t size;

printf("Введите восемь целых чисел: ");

scanf("%d %d %d %d %d %d %d %d",
&nums[0], &nums[1], &nums[2],
&nums[3], &nums[4], &nums[5],
&nums[6], &nums[7]);

size = sizeof(nums) / sizeof(int);

for(int i = size - 1, j = 0; i >= 0; i--, j++)
{
reverse_nums[j] = nums;
printf("%d ", nums[j]);
}

printf("\n");

for(int i = 0; i < size; i++)
{
printf("%d ", reverse_nums);
}

printf("\n");
}

Жду советов олдфагов как можно сделать лучше, потому что в С новичок.
160 1883127
>>881981
#include <stdio.h>

int main(void)
{
int nums[8], reverse_nums[8];
size_t size;

printf("Введите восемь целых чисел: ");

scanf("%d %d %d %d %d %d %d %d",
&nums[0], &nums[1], &nums[2],
&nums[3], &nums[4], &nums[5],
&nums[6], &nums[7]);

size = sizeof(nums) / sizeof(int);

for(int i = size - 1, j = 0; i >= 0; i--, j++)
{
reverse_nums[j] = nums;
printf("%d ", nums[j]);
}

printf("\n");

for(int i = 0; i < size; i++)
{
printf("%d ", reverse_nums);
}

printf("\n");
}

Жду советов олдфагов как можно сделать лучше, потому что в С новичок.
161 1883132
>>883127
Ой, блять

#include <stdio.h>

int main(void)
{
int nums[8], reverse_nums[8];
size_t size;

printf("Введите восемь целых чисел: ");

scanf("%d %d %d %d %d %d %d %d",
&nums[0], &nums[1], &nums[2],
&nums[3], &nums[4], &nums[5],
&nums[6], &nums[7]);

size = sizeof(nums) / sizeof(int);

for(int i = size - 1, j = 0; i >= 0; i--, j++)
{
reverse_nums[j] = nums;
printf("%d ", nums[j]);
}

printf("\n");

for(int i = 0; i < size; i++)
{
printf("%d ", reverse_nums);
}

printf("\n");
}

Пропустил
161 1883132
>>883127
Ой, блять

#include <stdio.h>

int main(void)
{
int nums[8], reverse_nums[8];
size_t size;

printf("Введите восемь целых чисел: ");

scanf("%d %d %d %d %d %d %d %d",
&nums[0], &nums[1], &nums[2],
&nums[3], &nums[4], &nums[5],
&nums[6], &nums[7]);

size = sizeof(nums) / sizeof(int);

for(int i = size - 1, j = 0; i >= 0; i--, j++)
{
reverse_nums[j] = nums;
printf("%d ", nums[j]);
}

printf("\n");

for(int i = 0; i < size; i++)
{
printf("%d ", reverse_nums);
}

printf("\n");
}

Пропустил
162 1883134
>>883127
>>883132
Лол макаба двойные скобки кушает, ну ладно
163 1883165
>>883127
Если ты о задаче из Праты то тебе надо просто распечатаь масив в обратном порядк, не нужно отдельный создавать.
164 1883182
>>882155
В общем, никто не знает.
Анлаки.
165 1883289
>>882785
В параметрах функций всегда передается не то, что ты в них пишешь, а делается его копия и уже эта копия отправляется в параметр. Таким образом, функция получает копии, а исходная сущность всегда остается неизменной.
То есть, если ты отправляешь константу, создается переменная (параметр) с этим значением. Если отправляешь переменную, создается копия этой переменной. И не важно какой тип. Если переменная int, создается новая переменна int, если указатель, создается новая переменная указатель, если структура, создается новая структура. Параметры функций (переменные-копии) существуют пока работает функция, когда функция завершается, они естественно уничтожаются.

Исключением являются массивы, которые вроде как не копируются, а передаются по указателю, вопреки тому, что передаешь именно сам массив, а не указатель. Но массивы это вообще особенный феномен, наговнокоженный вопреки логике языка. Массивы надо учить отдельно, как ебанутую хуйню, просто потому что есть в языке такаой бред и надо смириться.

И возвращаясь к началу, в крестах таки можно передавать в параметр саму сущность, а не копию, для этого там есть ссылки. Но в си ссылок нет, тут для изменения исходной сущности передают указатель на неё.
166 1883470
пацаны, я новичок в си и у меня появилась проблема: при вводе через scanf буквы(задумана цифра) начинается бесконечный вывод printf'a, как с этим бороться?
167 1883620
Привет анончики. Есть задачка, нужно создать прогу которая будет подставлять слова в конец файла, задача в том чтобы создать нумерацию добавленных слов по порядку и при повторном заходе в программу нужно чтобы порядок возобновлялся с того же места
1 слово
2 слово
3 слово

Я так понял использовать нужно бинарный формат, я создал отдельный файл для этого в бинарной форме, через fwrite вставил туда переменную которая сохраняется каждый раз при закрытий программы, т. е задача решена.
Но я хотел бы поинтересоваться, могу ли я использовать один файл для сохранения этой переменной не создавая второй? И как это сделать?
Открыть этот же файл в текстовой форме и присвоить на один указатель на файл, а бинарную форму на второй указатель?
sshot-2020-12-18-17-37-04.png11 Кб, 475x246
168 1883738
169 1883746
>>873113 (OP)
Реквестирую курс по с/с++, где объясняется оформление исполняемого файла и добавление встроенный или

директорных ресурсов (Иконки, вав-вайлы и т.д.). Желательно с пояснением синтаксиса и роли

библиотек. Можно в виде статьи.
170 1883754
>>883470
Scanf не занимается выводом
>>883620
Как тебе пришла в голову светлая мысль про бинарный.формат?
>>883738
И какой по твоему должен быть sizeof обычного указателя?
171 1883756
>>883746
Язык не специфицирует форматы экзешников. Смотри в доках на свою ОС
172 1883763
>>883754

>И какой по твоему должен быть sizeof обычного указателя?


Такой же как у int

Почему тогда a не 4? Он жи есть указатель на первый элемент массива.
173 1883767
>>883620
чел это в cmd exe делаеться
174 1883787
>>883763
а объявлен как массив, ь как указатель.
175 1883795
>>883763

> Такой же как у int


Нет. Язык такого не гарантирует
176 1883803
>>883754
Ну типа, fwrite пишет в бинарном формате в файл переменные.
>>883767
На линуксе?
177 1883809
>>883803
те кто на линуксе такое не спрашивают
178 1883812
>>883809
Схуяли?
179 1883816
>>883809
Аргументы будут ааа бля на дваче же сидим
180 1883820
>>883795
Зато я гарантирую.
181 1883824
>>883812
>>883816
потому что если не пердолишь то нет смысла сидеть на хуевой кастрированной глючной версии винды когда есть собственно винда
а раз пердолишь то и такие базовые вещи умеешь
182 1883831
>>883824
Я не понимаю тебя. Причем тут ОС и доступ к файлам через язык программирования? Ты о чем вообще? Я учусь. Мне нужно через stdlib создать файл в который будут добавляться слова после ввода и печатать в каком порядке были добавлены слова.
184 1883847
>>883836
Ниочем не говорит.
185 1883852
>>883820
Значит ты пишешь на каком то другом языке, возможно на яваскрипте.
186 1883856
>>883803
Ну ты скорее всего не понял задачу, спроси у учителя.
Очевидно что ты можешь просто прочитать файл по одной строке и сосчитать таким образом их количество.
Или ты можешь прочитать последнюю строку и распарсить число которое у нее в начале.
187 1883979
>>883856
Ага, уже сообразил. Проще было посчитать количество строк. А вообще как это работает с fprintf, fwrite? Если юзаешь fprintf то пишешь в текстовый режим текст, а fwrite или fwrite то только в бинарном сохраняешь данные правильно? Т.е я не смогу достать переменную сохраненную в текстовом режиме?
188 1883981
В пизду пойду по новой читать главу и эти моменты. А может мне просто хуево объясняют, но я беру на заметку что я дибил.
189 1883993
>>883127
#include<stdio.h>
#include <locale.h>
void main(){
setlocale(LC_ALL, "Rus");
int a[100];
int n, i, b;
puts("Указать размер массива:");
scanf_s("%d", &n);
puts("Эллементы массива:");
for (i = 0; i < n; i++){
scanf_s("%d", &a);
}
for (i = 0; i < n / 2; i++){
b = a;
a = a[n - i - 1];
a[n - i - 1] = b;
}
for (i = 0; i < n; i++)
printf("%d ", a);
}
Тоже новичек, но в пту так учили
190 1883998
>>883993
#include<stdio.h>
#include <locale.h>
void main(){
setlocale(LC_ALL, "Rus");
int a[100];
int n, i, b;
puts("Указать размер массива:");
scanf_s("%d", &n);
puts("Эллементы массива:");
for (i = 0; i < n; i++){
scanf_s("%d", &a);
}
for (i = 0; i < n / 2; i++){
b = a;
a = a[n - i - 1];
a[n - i - 1] = b;
}
for (i = 0; i < n; i++)
printf("%d ", a);
}обосрався
191 1884025
>>879558
.h это заголовочный файл, если ты включил заголовочный файл в .c файл то он исчезает при комплияций и становится единым целым с исходным файлом, по крайней мере так видит это компилятор. Если ты используешь static в заголовочном файле, то ты не напрямую получаешь инфу, а копируешь. Если бы ты использовал static в другом исходном файле и пытался получить доступ с другого, компилятор бы тебя не понял, потому что для него это слепая зона.
192 1884031
>>883998
Пиздец даунов делают в пту, соболезную.
193 1884038
>>883998
Не слушай пидоров с пту, развивайся сам а? Я смотрю на этот код и мне хочется блевать.
194 1884042
>>884038
>>884031
Ебать, ну давай , предложи свое решение. Я посмотрю поучусь
195 1884047
>>884038
Ну так предложи свое решение, все такие умные, а как просишь показать так сразу по сьебам.
196 1884165
Зашел в этот тред случайно. Никогда не писал на C, но накидал тут что-то.
>>883998
>>883127
Нахуя создавать reverse массив, если вы пишите, что его нужно просто вывести в обратном порядке?

#include <stdio.h>

int main()
{
int i,n;

printf("Введите размер массива: ");
scanf("%d",&n);
int nums[n];

for (i=0;i<n;i++)
{
printf("Введите %d элемент массива: ",i);
scanf("%d",&nums);
}

printf("Заданный массив в обратном порядке: ");

for (i=n-1;i>=0;i--)
printf("%d ",nums);
return 0;
}
196 1884165
Зашел в этот тред случайно. Никогда не писал на C, но накидал тут что-то.
>>883998
>>883127
Нахуя создавать reverse массив, если вы пишите, что его нужно просто вывести в обратном порядке?

#include <stdio.h>

int main()
{
int i,n;

printf("Введите размер массива: ");
scanf("%d",&n);
int nums[n];

for (i=0;i<n;i++)
{
printf("Введите %d элемент массива: ",i);
scanf("%d",&nums);
}

printf("Заданный массив в обратном порядке: ");

for (i=n-1;i>=0;i--)
printf("%d ",nums);
return 0;
}
197 1884173
>>884165
Бля, понимаю.
Так лучше будет https://pastebin.com/QPDAh6wf
198 1884217
>>883998
#include<stdio.h>
#include <locale.h>

void r_arr() {
int n;
if(scanf(" %d", &n) == -1) return;
r_arr();
printf("%d ", n);
}

void main() {
setlocale(LC_ALL, "Rus");
r_arr();
}
199 1884347
>>884217
А ты умен сука. Жаль что рекурсия бесполезна.
200 1884348
>>884165
Я изначально так решал когда то. Интересно если им дать написать алгоритм сортировки че будет?
201 1884357
Нихуя не понимаю. Почему я не могу записать бинарные данные в текстовый формат? В один файл? Я использую fprintf, чтобы вписать строки в файл, если я напишу бинарную переменную через fprintf, я смогу ее сохранить в бинарном формате потому через fwrite? Потому что когда я пытаюсь так сделать, она становится мусором по какой то причине.
202 1884358
>>884357

>бинарные данные в текстовый формат


Это как?
203 1884359
>>884358
Ну переменные в бинарном формате, т.е они сохраняются так как компьютер их видит. Есть текстовый формат, в котором сохраняется только текст, а есть бинарный в котором может сохраняться и текст и переменные но в бинарном виде.
204 1884360
>>884358
Короче могу ли я сохранить переменные в текстовом файле, вот в чем вопрос. Можно же как то раз предполагается, пишут что в текстовом файле можно сохранять бинарные данные.
205 1884366
>>884360
>>884359
Нет текстового и бинарного формата, все хранится в бинарном, просто твой текстовый редактор будет отображать бинарные данные говном, юзай hex-editor.
yoba.png5 Кб, 129x129
206 1884374
>>884366

> Нет текстового и бинарного формата, все хранится в бинарном


Но есть флажок b для fopen. Ой...
207 1884405
>>884374
Это режим, а не формат.
208 1884406
>>884360
Что тебе мешает сохранить переменную текстом?
Что по твоему случится с переменной в бинарном виде, если твой текстовый файл откроют блокнотом, поменяют пару строчек, а потом сохранят?
209 1884409
>>884405
Спасибо. Я снова прочитал различия, в юниксе их нет для файла оказывается. Но вот почему когда я пытаюсь вытащить переменную из текстового файла, при этом сохраняя её через fwrite, выходит мусор при использований этой переменной типа -123123123123123123? Влияет ли на это использование fscanf и fprintf?
210 1884410
>>884406
Ну смотри, мне нужно достать из файла эту переменную потом, нужно писать функцию которая будет искать внутри текста это число, потом конвертировать его через atoi? Аааа ничего не понимаю.
Кто нибудь подскажите я смогу посмотреть через дебагер что творится внутри программы в плане просмотра содержимого буфера итд?
212 1884453
Про мейкфайл не нашёл лучшей ветки спросить:
В моём мейкфайле есть куча одинаковых команд, с разными таргет/пререквизтами
Application.o: Core/Application.cpp
$(CXX) $< -c $(INCLUDES) -o $@
Log.o: Logger/Log.cpp
$(CXX) $< -c $(INCLUDES) -o $@

Как записать это в одно правило? Везде пишут %.o: %.cpp, но мне не нужно для всех целей, а только для определённых, плюс непонятно, как dirname отбросить для таргета.
213 1884460
>>884410
Fprintf - fscanf
Fread - fwrite
Понял?
214 1884481
>>884217
как это работает, объясни плиз.
Xsq-l3hWV7c.jpg135 Кб, 635x825
215 1884491
Няши, как научиться красиво писать код? Основы знаю, но вот писать красиво код не могу. Как научиться? рандомпик
216 1884505
Где есть какой-нибудь быстрый гайд по Си? Есть одна библиотека, но так как в елиспе нельзя подключать Си библиотеки, решил написать на программу на Си и вызывать её из елиспа.
217 1884512
>>884505
Есть, в хорошей книжке Кернигана и Ричи - первая глава. Книжка в шапке первым пунктом.
219 1884556
>>884505

>елисп


Дедуль, 2021 на носу.
220 1884558
>>884481
Рекурсия на стеке.
Представь себе колоду карточек
Ты пытаешься считать число и если получилось, то записываешь его на карточку в поле n
Когда числа закончились, ты начинаешь выводить записанное на верхней карточке n, а потом скидываешь эту карточку открывая ту что под ней.
221 1884588
>>884491
Читай хороший код (ядро bsd очень чистенько выглядит).
222 1884614
>>884491
Для начала определись что такое красивый код, когда выведешь формальные критерии - их и придерживайся.
Вообще C маловыразительный язык, поэтому красоты в нем мало.
223 1884619
>>884516

>char гарантированно имеет длину 1 байта


Забыли упомянуть только, что C-байт может быть не 8 бит.
224 1884621
>>884491
Есть же книжки на тему, так и называются, серия "Чистый код" Мартина, "Совершенный код" Маконнела.
1458234767062.jpg9 Кб, 195x259
225 1884630
>>884621
*МакКоннела, конечно.
226 1884749
>>884460
Вопрос в другом. Влияют ли они как то друг на друга? Может ли fwrite переписать данные fprintf и наоборот?
227 1884751
>>884512
>>884516
Спасибо
>>884556
Я зумер...
228 1884835
Почему в сишечку ни в каких новых стандартах не хотят ввести деструкторы в каком-нибудь виде? Да хоть слизнуть у конкретного комипилтора.
Там же есть всякие директивы компиляторам. Почему не ввести еще одну типа destructor, что когда ее объявляешь для какого-то типа (а у нас он будет один - это пользовательсая структура), то вызовется эта данная функция.
Т.е. будет что-то вида
destructor my_struct f() { // что-то делаем }
229 1884840
>>884835
upd:
это же по сути никак не изменит язык, не переусложнит его. Он же и сейчас отслеживает, когда структура выходит из области видимости и выкидывает ее, а так просто при создании ассемблерного выхлопа перед этим освобождением бы всовывал имеющуюся деструктурную функцию.
230 1884842
>>884835
Посмотри в сторону Zig там есть defer для этого.
231 1884844
>>884842
Речь про C и его все новые стандарты 11/17/2x.. Почему все не вводят и не вводят такую мега удобную вещь. Это же не испортит старую кодовую базу никак, не добавит накладных расходов.

> в сторону Zig
да есть плюсы и раст тогда уж
232 1884858
>>884844
Раст говно, плюсы переутяжеляны. Zig идет именно как замена /надстройка Си.
233 1884859
>>884858
Но вопрос про Си
234 1884863
>>884859
Ну, наверное потому что в Си весь поток выполнения линеен и нет неявных прыжков?
Вот нашел расширение gcc
https://stackoverflow.com/questions/1828550/portable-equivalent-to-gccs-attribute-cleanup
235 1884866
>>884863
Ну так и в чем изменится его нелинейность при создании на этапе компиляции ассемблерного выхлопа? Просто вместо освободить память у базового типа удет вставляться при необходимости вызов еще одной функции.
Ну вот как в это gcc, например. Почему не берут очевидную полезную и нужную вещь в стандарт. Это же избавило бы от кучи возможного забытия очищения памяти, не добавляя никаких накладых расходов.
236 1884918
>>884858
плюсы самый быстрый язык, не гони
237 1884920
>>884918
плюсы с растом сейчас плюс-минус на одном уровне по скорости, и - да, в крупных сложных проектах, а не линейных алгоритмах, они обгоняют уже сишечку по скорости из-за того же отсутсвия расходов для некоторых действий в рантайме
238 1884951
>>884866
Нелинейность будет не в ассемблерном коде, а в программе на Си.
Появляется неявный вызов не в той точке, где он написан. Ну это как... Исключения в c++.
239 1884952
>>884920
Перетолстил.
240 1884958
>>884951
Так кому не надо и не будут этим пользоваться, а вот кому из-за отсутствия деструкторов библиотеки приходится переусложнять и апи для них, что потом пользователям надо помнить не забывать делать free для кучи вещей, хотя это можно было бы от них скрыть - это сильно бы помогло.
241 1884962
>>884958
Так это не переусложнение, когда у тебя есть явное _Free. Переусложнение будет когда будет разброд и шатание. У одних есть, у других нету.
242 1884965
>>884962
в смысле, ну так это такая же функция. Вот ты вызвал из сторонней либы f() ты же тоже не знаешь, что она под капотом делает и что вызывает. Поэтому читаешь доки или смотришь код, где уже и видешь, что именно оно делает.
Если тебе в твоем коде это не нужно, то и не используешь никак.
Ну во всех компиляторах это есть в том или ином виде, просто нужно это стандартизовать.
243 1884982
>>884965
Я знаю что я вызвал f() и вернусь в строчку ровно после f(), а не улечу куда-то по неявному обработчику, не?
244 1884985
>>884982
Пользователь функции f() получит точно такие же два исхода: либо внутри функции все поломалось либо он вернулся к строчке после ее вызова.
245 1885035
>>884835
Ты хочешь разменять протечку по памяти/ресурсам на потенциальную протечку по памяти при отсутствии деструктора и потенциальный UaF при его наличии. Спизди себе набор _cleanup_ макросов из systemd если очень надо.
246 1885041
>>885035

> Спизди себе набор _cleanup_ макросов из systemd если очень надо.


Куда я его спизжу, если он не на всех компиляторах работает.

> на потенциальную протечку по памяти при отсутствии деструктора и потенциальный UaF при его наличии.


утечка будет только в том случае, если предоставляемый код был кривым, от этого ты и так не застрахуешься
снимается возможность забыть пользователем освободить ресурс
соответственно при его отсутствии мы имеем все как было, при его наличии всего лишь выполнется +1 функция, которую не пользователь вынуждено вызывает ручками, а она сама на этапе компиляции вставится
247 1885046
>>885041
Нет, ты не понял. Тебе всё-равно ВСЕГДА нужно будет проверять не забыл ли ты конкретно для этой структуры определить деструктор. А заодно и для вложенных полей этой структуры (их нужно удалять в своём деструкторе или нет, как считаешь?).
Кстати, если так подумать, то нахуй тебе деструктор, если у тебя и конструктора нет? Если в структуре хранится что-то что надо чистить, то это что-то всегда было передано извне и сруктура этим не владеет и не может почистить сама.
И ты прелагаешь непонятный костыль, который приносит в код UB.

> Куда я его спизжу, если он не на всех компиляторах работает.


Ну сорян, сделай ifdef и крэшся если собирают не шлангом с gcc.
248 1885051
>>885046
так UB появиться неоткуда, из минусов только чуть дольше происходит компиляция

ну конструктор еще можно пережить, в крайнем случае пользователь условную функцию init не забудет вызвать, т.к. делает это прямо здесь и сейчас, а вот потом где-то там освободить ресурс - постоянно

ну вот есть допустим структура, а в ней вектор есть динамический
функции есть для работы с этой структурой типа добавить элемент/удалить
а вот при выходе самой структуры из области видимости пользователи часто забывают вызвать условное free() для этой структуры
поэтому и говорю, что очень часто не хватает деструкторов (хотя напоминаю, что почти во всех компиляторах они есть, с разными названиями)
марио.png35 Кб, 732x467
249 1885061
>>873113 (OP)
Двач, не гони меня тряпками, а лучше объясни. Без какого либо бэкграунда начал вкатываться. Пытаюсь осилить курс CS50, смотрю как украинскую так и ангельскую версии лекций. Собственно вопрос в PSETe 1, а именно mario. У меня получилось сделать задание, но я его всё написал через printf, понял, что получилась стена говна и пошёл в интернет. Нашёл пикрелейтед и нихуя не понимаю. Как работает этот алгоритм. Знакомых которые могли бы объяснить у меня нет. Если можно, то прям как бабуину на пальцах. Cпасибо.
250 1885063
>>883289

> Исключением являются массивы, которые вроде как не копируются, а передаются по указателю, вопреки тому, что передаешь именно сам массив, а не указатель.


Но ведь "сам массив" и есть указатель на его первый элемент, вроде все логично, нет?
251 1885064
>>885051

>так UB появиться неоткуда, из минусов только чуть дольше происходит компиляция


Если ты неправильно отследил кто владеет памятью и почистил её, то возникает UaF и что в программе произойдёт дальше тебе никто не гарантирует. Также пользователь либы может вытащить из твоей структуры указатель, которым не владеет, и сохранить у себя.

> ну вот есть допустим структура, а в ней вектор есть динамический


> функции есть для работы с этой структурой типа добавить элемент/удалить


Без внятной концепции владения деструктор только сделает хуже. Тебе не деструктор нужен, а умные указатели.
Я не пробовал - https://github.com/Snaipe/libcsptr
252 1885069
>>885061
вот примерно то, что я сам понаделал...
253 1885076
>>884982
Сразу вспоминается libpng с его обработкой ошибок через setjmp
254 1885078
>>885041
А у ms вродебы есть _try _catch
255 1885080
>>885078
почитаю всю ветку, я вообще не о том спрашиваю как кому-то что-то сделать в конкретном случае, я про стандарт и его развитие и про причины торможения
256 1885082
>>885061
Всё просто, на пикрелейтеде написана полная хуйня, которая скорее всего и не работает.
Держи - https://ideone.com/VxBsws
Тут всё просто, сам разберёшься.
257 1885089
>>885061
>>885069
В программировании стараются избегать повторения кода, поэтому придумали циклы.
Цикл for выполняется от, до (пока условие соблюдается), и с шагом.
Внешний цикл выполняется size раз, рисуя строчки. В конце каждой строчки рисуется перевод на новую строку.
Внутренний цикл выполняется _для каждого шага внешнего цикла_, size раз
Внутри него рисуется по 1 символу (пока забьем на условие), таким образом у тебя будет нарисована таблица size на size.
Остается вопрос какой символ рисовать, закрашенный или пустую клеточку. Для этого грубо говоря складывают x и y координату. Можешь проверить в тетради в клетку. Примерно так: если строка 23, то нарисовать можно только в столбце 0; если строка 22, то логично что можно нарисовать в столбце 0 и 1; если 21, то в 0, 1 и 2; и так далее.
258 1885090
>>885080
Ещё раз ты просишь деструкторы, не понимая зачем они появились в плюсах, для задач которые деструкторы нормально не решают впринципе.
Никто такую хуйню в стандарт тащить не будет.
259 1885092
>>885080
Потому что в комитете Си консерваторы, которые не хотят тащить все подряд из плюсов, но тебе такой ответ вряд ли понрваится.
260 1885093
>>885082
>>885089
Спасибо<#
261 1885094
>>885092
плюсы тут ни при чем, это ж просто концепция, а тут она более чем востребована и опять же всеми разрабами компилатор уже как-то да запилена, но каждый написал свой костыль и поэтому почти никто не пользуется
262 1885095
>>885094
Помню читал такой срач и там чуваку просто скинули ссылку где вступить в WorkGroup чтобы официально давать предложения в стандарт :3 Погугли, запплайся, напиши, вдруг добавят.
263 1885096
>>885094
Мне больше интересно почему никто не форкнет компилер (или напишет свой, там же немного писать) и не сделает диалект C без UB.
264 1885099
>>885096
компилер - это дохуя сложно

>C без UB


rust
265 1885101
>>885099

>компилер - это дохуя сложно


В случае с Си - легко. И воспроизводилось кучей людей.

>rust


Гавно без задач и нинужно.
267 1885103
>>885101
когда напишешь еще один компилятор, то ты просто увеличишь их количество, а польза будет отрицательной, нужно сам язык улучшать
268 1885104
>>885103
Компилятор же детектит UB, надо просто пропатчить чтобы это была хард ошибка.
269 1885105
>>885102
ну там минимизировали эти ub, меньша пока не придумали как
270 1885106
271 1885110
>>885106
это уже вообще другая тема
272 1885112
>>885110
Я думаю что в большинстве существующих языков нет UB.
273 1885116
>>885112
в интерпретируемых - да, в работающих уровнем пониже - пока не получится избавится, т.к. железо разное и его поведение разное, порой принципиально
274 1885117
>>885116
Железо тут не причем. Речь про Undefined, а не про Implementation defined. Алсо толсто, C# компилируется AOT либо JIT
275 1885121
>>885094
Ты эту концепцию сначала опиши нормально.
>>885096

> UB


Есть один нюанс. UB в стандарте появился не от балды, а потому что C - кроссплатформенный ассемблер под абсолютно разную хуйню с абсолютно разной реакцией на граничные ситуации которые потом и назвали UB. И когда ты решаешь UB ты по сути отрезаешь платформы.

> почему никто не сделает диалект C без UB.


Сделали кучу раз. Последняя попытка называется golang, можешь попробовать.
276 1885123
>>885121

> Ты эту концепцию сначала опиши нормально


описал выше уже подробно: возможность описать функцию, которая вызывается перед выходом объекта этого типа из области видимости.
С примерами описал где она многим требуется и жалуются, что не хватает. И как разрабы, так и пользователи.
Описал, что это ничего никому не испортит, а только добавит полезный функционал языку (видимо поэтому все почти разрабы компиляторов это уже сто лет реализовали)
277 1885130
#include <stdio.h>
#include <stdint.h>

int main(void)
{
long long result = INT64_MIN / -1;
printf("The result: %lld", result);
}
278 1885133
>>885123
Твоя концепция не решает твои проблемы вообще никак, а примеры твои работают только у тебя в голове.

Давай псевдокодом прям вот тут:
```
void _Free(array• a){
if(a->data) { free(a->data); a->data=NULL}
}

int foo(void)
{
array a = { .data=malloc(10 • sizeof(int)) };
fill(&a); // <= заполняем
check(a); // <= проверяем что заполнили
printf("%d", a.data[0]); // <= UaF :(
}
```
Вот абсолютно нормальный код, который с появлением деструктора стал крешится. Потому что в check передаётся копия структура, для которой при выходе из check вызывается деструктор и сносится data.

Чувак, серъёзно, что тебе мешает взять С++98 пожить с деструкторами и понять что в C они будут бесполезны, более того опасны? Я как будто с первокуром общаюсь.
279 1885136
>>885133
пиздец.. ты вообще пишешь какую-то хуйню про другое. Ты или перечитай внимательно, что обсуждаем или уж не лезь тогда. А то повылезают из серии дишь бы что-то сказать, даже не пытаясь понять о чем речь. Ты еще как умник выше скажи про реализацию на языке умных указателей.
280 1885139
>>885136
Я пишу именно то что надо. То что ты путаешь defer и деструктор и выдаёшь одно за другое - чисто твоя проблема.
281 1885166
>>885139
Если нужен defer в си - юзай
#define DEFER(f) __attribute__((cleanup(f)))

Ну и
DEFER(string_destroy) char ×huy = string_new();

А вот для умных деструкторов надо думать о передаче владения, а там уже растом тянет и std::move
282 1885202
>>885166

>А вот для умных деструкторов


Чем умнее язык, тем тупее программист. А си не для дебилов. Поэтому умного говна и деструкторов в частности не будет.
283 1885217
>>885202
Так и туалетная бумага для дебилов. Иначе зачем тебе голова и руки, с такими высказываниями-то?
284 1885251
>>885217
Проблема современной цивилизации в толерастии. Тупому быдлу внушают, что все люди одинаковые, равны. В результате, дебилы лезут в треды умных считая себя такими же и кукарекают "то не так, это не так", не понимая, что это только от их тупости. Но указать некому, толерастия же.
285 1885324
286 1885337
>>885092
Два чаю. Вот пример, когда человек просто хотел сделать сигнатуру чуть более правильной, добавив const на указатель, который и так не должен быть изменён: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2526.htm
Оказалось, что это breaking, потому что компиляторы начали бы генерить предупреждения, а вендоры считают новые варнинги (даже семантически верные, даже не ошибка компиляции) ломающим изменением: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2565.pdf
Правильно это или нет: хз, тут это философский вопрос
287 1885386
>>884749
Все сводится к байтовым массивам. Все байты можно переписать.
288 1885387
>>884835
Вызывается когда?
289 1885605
>>883289

>В параметрах функций


Кто то у нас путает параметры и аргументы.
290 1885656
>>885337

>Правильно это или нет: хз, тут это философский вопрос


Правильно. Библиотека существует для пользователей, это не игрушка её разработчиков, которой можно вертеть как захочешь. Разработчик должен думать не о себе, а о пользователях. Если его изменения будут поводом высирания кучи варнингов где их раньше не было, это головная боль пользователям, поэтому так делать не надо. А свои "ну такжы лучшы!" можешь в анус себе засунуть, это типичный лепет тупых эгоцентричных малолеток.
sshot-2020-12-20-22-16-32.png10 Кб, 591x204
291 1885721
Что у вашего охуитительного языка с локалью? Почему не конвертит в привычную для венды кодировку?
292 1885742
>>885721
Винда сосёт, переходи на линупс или бздю. Привычная для винды кодировка - их собственная, все одно используют, а винда как всегда.
293 1885747
Сап Керниганы и Ричи, помогите найти годные книги или на крайняк татуриалы на тему геймдева на Си с меня нихуя как обычно.
Пробовал гуглировать, но либо нахожу таки код на крестах, либо какие-то демки 1989 года под ДОС, либо нихуя, так как попробуй нагуглить что-то с просто символом «C». Хотелось бы чего-то современного, с ECS, дата ориентед дизайном, Vulcan/Metal хотя сейчас подумал что там наверное апи уже под плюсы/обжективные плюсы минимум. Выручай анон.
294 1885770
>>885721
Russian_Russia.1251
295 1885771
>>885747
берешь SDL2 и гуглишь
296 1885808
>>885721
Так это ты в коносли chcp должен менять
297 1885809
>>885747
Поищи awesome c
299 1885861
>>885860
Их несколько там разный набор
300 1886016
Нашёл предположительный участок кода, который вешает мой программный цикл на микроконтроллере.

https://www.onlinegdb.com/edit/S1gOeSa6hv

Тут могут быть объёбы?
Чего я хотел этим добиться: по состоянию флага нужна подмена символа, входящего в массив строк, для поиска по новому - подменному значению в строке.
Реализовал как мог.

Беда вот какая: как только отработает этот код, следующая за ним функция (работающая с джи-сон) виснет, вешая весь цикл.

Ещё есть либа cJSON, которая используется для пакинга \ парсинга джи-сон строки: https://github.com/DaveGamble/cJSON
Но там вобще мрак и я не знаю как её проверить.
301 1886027
>>885747
Короче на Гите в awesome C есть ссылки на ресурсы. Но я знаю один ресурс в котором объясняют на пряниках всё про векторы и так далее. Но там очень тяжело. Позже скину.
302 1886030
>>885061
Как я рад что был прав на счёт CS50, такой раковый вброс. Они даже код писать не могут, более того учат своих студентиков писать некачественный код с умершими конструкциями которые никто не использует. Кому нужен do while в 2021? Ну если только для макросов каких нибудь и то не знаю, не использовал.
303 1886032
>>885069
Ты не тролишь случайно?
304 1886033
>>885069
У меня мозг щас сломался, кто-то на дваче оказался прав, вот этот анончик >>882983
305 1886035
Байтоеблю пропускать? Я имею ввиду bit fiddling. Хочу в пыху уже перекатиться после структур и юнионов. Зачем мне для веба перестановка битов?
306 1886037
Ку анонче, вообщем это опять я с файлами и прочим своим говном. У меня есть файл в котором символы, мне нужно взять этот файл, подставить после каждого символа пробел и сохранить в этом же файле. Пока что не получается, только сохраняя в новый файл. Переписать прошлый не получается.

Вот что я напилил
https://www.ideone.com/m00C2E
307 1886040
>>885251
Язык Си требует много дисциплины, фокусировки, ответственный подход и абсолютную волю.
308 1886043
>>886030
Толсто.
309 1886046
>>886043
Недурно.
310 1886105
Вроде работает, можете посмотреть на ошибки и моменты которые можно исправить? Или есть ли идеи как получше написать циклы и т.д? Щас буду писать версию с уравниванием значений в массиве, типа если у символа есть разница более чем на единицу с соседом, то нужно будет поставить среднее значение между ними.

https://www.ideone.com/Q2gKlk
311 1886108
anon-3590367.jpeg154 Кб, 576x802
312 1886110
313 1886113
Кто-нибудь может подкинуть ресурс почитать про то, как работает printf с format specifiers? Вот к примеру я хочу вывести signed char, на экран (и использую вместо %hhd, %hd), тогда printf должен считать не 1 байт, а 2 байта начиная с точки, где хранится число захватив предположительно участок памяти с рандомными значениями сделав UB (читал, что такое точно происходит в учебнике, но там несколько значений выводилось), но он просто продлевает лишними нулями до размера signed short число типа signed char. Зато когда суем signed short в signed char, у нас случается integer overflow, если не помешается число в тип. Так что именно происходит? C продлевает число до нужного типа или все таки не продлевает и просто выводит то, что было в памяти согласно размеру типа?
314 1886125
>>886113
Ну короче там есть ячейки памяти, каждый спецификатор выделяет определенную память согласно размеру типа. Если int 4 байта, если вставишь вместо int - long размером 8, то выведется половина, те 4 байта вместо 8. Если тип меньше спецификатора (поменяем long и int местами) то одна половина памяти будет просто нулями, а вторая значением которое тебе нужно вывести. Но есть проблема, незанятое пространство из первого спец. перенесется на второй соседний спец. если ты его туда поставишь. Либо он просто останется в памяти и тут UB.
315 1886149
>>886113
Если совсем педантичный ответ дать, то смотри соглашения о вызове функций и то, как там реализован vararg. Например, вот выдержка из SystemV x64 ABI (стандартный линуксовый):

>The prologue of a function taking a variable argument list and known to call the macro va_start is expected to save the argument registers to the register save area


То есть у тебя копируются в память регистры и va_arg просто шагает по памяти. Указал va_arg(args, int)? Шагнули на столько-то байт в памяти. va_arg(args, double)? Шагнули на столько-то.
316 1886156
>>886125
Если выводим signed char = 1 как %hd, то будет

|00000000| + |00000001|
Просто продление до нужного спецификатора.

Если signed short = 1 как %hhd и потом еще один %hhd

То значение в памяти разделится на два?
|00000000| |00000001| и будет выведено 0 и 1? А до второй переменной дело даже не дойдет. Ведь будет шагать от начала числа по заданному кол-ву байт. Что-то в онлайн компиляторе проверил, все равно все верно выводит.

Правильно понял?
317 1886190
318 1886215
>>886190
Тогда почему, когда все так понятно в теории на практике:

int main(void)
{
signed short i = 1;
signed char j = 2;
printf("%hhd %hhd\n", i, j);

return 0;
}

Дает 1, 2 на выходе?
319 1886303
У меня есть прога на плюсах где просто дохуя вычислений надо сделать. Она по времени немного не заходит. (Вычислений столько, что дано аж 7 секунд). Может ли смена крестов на си без использования всяких std::min улучшить ситуацию?
320 1886337
>>886215
Судя по стандарту va_args промоутит все до инта
То есть реально в твоем примере ты вызываешь как бы
printf(const char*, (int)i, (int)j)
321 1886346
>>886190
>>886108
Зарепортил.
Траллирование выглядит жалко и не к месту. Детский сад.
322 1886372
>>886337
Да, точно меньше инта ради скорости промоутится, это понял. Но тогда с лонгом и интом пример должен сработать.

int main(void)
{
int n1 = 1;
long n2 = 2;

printf("%zd %zd %d %d\n", sizeof(int), sizeof(long), n2, n1);

return 0;
}

Вывод: 4 8 2 1, инт в два раза короче лонга, но когда подсовываем лонг и говорим читать как инт и затем еще инт он похоже читает с конца, а не с начала и нигде не спотыкается. Читал просто в учебнике как все это происходит, но даются две версии разные, в одной читается с конца применяя modulus или просто отбрасывая лишнюю часть, если в двоичной системе смотреть, а в другой (там где объясняется UB) наоборот говорится, что все стартует с начала по кол-ву байту соответствующему спецификатору. Не понимаю, в итоге компилятор то понимает, что от него хотят, то не понимает.
323 1886422
>>886372

>инт он похоже читает с конца


Ну так ты запускаешь скорее всего на x64 архитектуре с Little-endian.
Попробуй с большими числами, не 1 а какое нибудь 0x13579246

>Не понимаю, в итоге компилятор то понимает, что от него хотят, то не понимает.


А это в принципе неважно, потому что раз у тебя спецификаторы не соответствуют переданным аргументам, у тебя UB, а при UB компилятор не обязан ничего понимать.
Так что то что ты исследуешь, это не какое то истинное свойство языка, а просто стечение обстоятельств, как это работает на каком то одном компьютере с каким то одним компилятором с каким то набором флагов компиляции.
324 1886487
>>886422
Понял, спасибо. Как я понял, операция modulus точно происходит при конвертировании типов, но необязательно при спецификаторах форматов в printf, тут уже зависит от архитекторы и может быть по-разному. Лучше UB не делать играясь со спецификаторами и все делать вне printf с помощью арифметики. Я думал это как-то можно понять как пресловутый integer overflow, который вроде как ошибка, но в рамках логики.
325 1886510
>>886303
Интеловский крестокомпилятор вроде оптимизирует. Правда, если у тебя амуда, то соснул, но есть кое какие оптимизации и для неинтелов.
326 1886555
>>886113
Параметры уже Инта расширяются до Инта при вызове: integer promotion.
327 1886558
>>886372
Для %d long ты должен был получить предупреждение.
328 1886586
>>877090
Чтобы не хранить по указателю для каждого поля.
329 1886625
Есть что-то такое, но по сишечке?
https://en.cppreference.com/w/cpp/compiler_support
330 1886638
>>886586
Вообще ничего не дает в этом плане. Ну будет у тебя [esp+1], [esp+3] вместо [esp+4], [esp+8]
331 1886655
>>886638
А в куче как?
332 1886698
>>885123

Дядям в комитете нужно менеджить главный язык программирования этого чёртового шарика, который должен транслироваться в опкоды для всего: начиная от суперкомпьютера и заканчивая твоим вибратором. С такой ответсвтвенностью люди становятся оочень консервативными и действуют по принципу: "работает - не трогай".
333 1886783
>>886698
Ууу, прям херои. А как же тогда с++ справился, а кода ведь на нем в разы больше.
download.jpg12 Кб, 225x224
334 1886807
>>886783

>с++ справился, а кода ведь на нем в разы больше


Бля, школьник, пиздуй тралить в другом месте.
335 1886818
>>886807
Ребенок, открой сорцы хрома и посчитай.
images.jpg4 Кб, 224x225
336 1886819
>>886818

>открой сорцы хрома и посчитай


Всё, в цирк можно не ходить целый год. Твоего представления достаточно.
337 1887194
>>873113 (OP)

>clang


чем это лучше gcc?
338 1887243
>>886698
Лол, долбоеб, дяди из комитета еще 31 год назад всех хардварщиков нахуй послали. Они нихуя не делают, только иногда собираются на свои сходочки и отклоняют предложения людей не входящих в СОВЕТ.
339 1887246
>>887194
ллвм
340 1887292
>>886818
Погоди разве хром не перешел на Го?
341 1887293
>>886819
Прослезился, это легендарный пост.
342 1887333
>>887243
Именно поэтому сишка еще не растеклась в то бесформенное говно, в которое превратился соседний язык. Вон давеча в комитет притаскивали замыкания с маллоком внутри, это ж где я им маллок возьму, когда у меня на МК памяти два килобайта?
343 1887344
>>887333
Никто и нигде последние лет 15 не использует сишку на мк, сдохнут легаси станки сдохнет и сишка. Вместе со своим профнепригодным комитетом. Ну а если ты на полном серьезе отрицаешь что комитет хуево справляется со своей работой то ты долбоеб
344 1887352
>>887333

>два килобайта


И.е. си останется только на открытках?
345 1887369
>>887344

> Никто и нигде последние лет 15 не использует сишку на мк, сдохнут легаси станки сдохнет и сишка.


Сам работаешь? А что тогда по-твоему используют? Трансо раст?
346 1887371
>>887344> Никто и нигде последние лет 15 не использует сишку на мк
Толсто.
347 1887376
>>887369
JS и Питон, что еще могут школьники осилить.
348 1887378
>>887376
А при чем тут школьники?
349 1887383
>>887378
А кто? Кто еще сомневается в моще Си, да еще на мк?
350 1887384
>>887378
в юнет-фактори 18+ проста((((
351 1887481
>>886113
Я твоим потоком сознания чуть не подавился, но выстрелю на удачу. Я подобное высирал, когда не знал про little/big endian
352 1887484
>>885063
Нет, sizeof тебе не вернет размер адресного регистра целевой архиктуры. Просто в любых операциях компилятор подставляет константу либо вычисление по стеку адреса нулевого элемента.
353 1887487
бля, посоны, ламповый тредик у вас, аж захотелось вернуться в студенчество безработное чтоб с сями играться
или устроиться по сабжу ага, правда все равно творчества будет не хватать
354 1887525
>>887383
А кто-то сомневается?
355 1887788
Как сравнивать си по алфавиту? например "aa "> "bb" > "bc" .. "zz" и так далее. Может есть какая-нибудь функция для этого? Длинна слов может быть не 2
356 1887800
>>887788
strcmp
Конечно есть нюансы, такие как в разных локалях может быть другой порядок букв в каких нибудь европейских языках
Или например если ты хочешь не лексикографический, а натуральный порядок, как в папках, чтобы file15 шел после file2.
357 1887805
>>887800
Спасибо
358 1888317
>>873113 (OP)
Привет, аноны. Так вышло, что мне нужно так скажем распарсить строку. Вот пример

на вход дается строка CD , мне нужно чтобы что-то запустилось, если на вход будет дана CD и еще что-то. Например так
if ( strcmp(line, "CD") == 0 )){
printf("odin")
if (strcmp(line, "CD + пробел иные символы") == 0)){
printf("dwa");

как мне это сделать? вот пример пишу CD - просто переходит в домашний каталог и все
пишу CD Desktop/Folder/ перейдет в соотв. место

Помогите, пожалуйста, уж силы иссякли ебаться с этим.
359 1888330
>>888317
Если правильно понял
https://dpaste.com/6BBL9J4YT
360 1888358
>>888330
Если на вход идёт строка, то оно разве разбивает по пробелу ? То бишь если на вход CD, то это 2 символа, а если test, то это уже 4, но если cd test , то как выцепить инфу после пробела ?
361 1888369
>>888330
Я просто к тому спрашиваю, что мне надо обрабатывать текст после предполагаемой команды, например чтобы разные настройки доступа менять и тд(пишу терминал)
362 1888401
>>888358
argv изкоропки разбивает все аргументы, расспличенные одним и более пробелом
Нулевой индекс включает в себя вызов программы e.g. ./a.out
Зачем тебе сырые строки ковырять?
363 1888440
>>888401
Говорю же, терминал надо написать, а в нем очевидно что ввод строки, на вход аргументами программы это не сделать, ведь он сделает 1 команду и все, а надо обрабатывать динамически. Если я сделаю функцию, которая принимает строку с стандартного входа как char *list[] , то обращаясь к скажем индексу 1 , разве я получу символы до первого пробела , ведь он отдаст первый символ и все? Понимаю, что это ебля ещё та, но надо.
364 1888576
>>873113 (OP)
Здарова, байтоебы, бля ну си конечно заебись язык ничего лишнего, да и ничего нужного, аля сам ебись придумывая связные списки под каждый пук. Короче си - говно без задач в современном мире, если только вы не пилите ядро линукс или драйвера, хотя и драйвера уже на с++ пишутся.

удаляйте тред.
365 1888597
>>888576
Не осилил нагуглить готовую либу?
366 1888611
>>888597
Лол, я на си в свое время много писал и много чего использовал, но ты сам то видел эти "готовые" либы? Это хуйня полная и неудобная.

Да и вообще какой смысл писать на си сейчас? Быстрее чем с++ это точно не будет, при разумном использовании последнего. А вот скорость написания, читабельность и емкость кода будет намного намного выше.
c.png5 Кб, 741x125
367 1888908
Почему при вычитании всех типов, кроме int, он конвертирует результат операции к этому типу? Потому что типа int на конкретно моей платформе самый быстрый и он соптимизировал?

Приведение типов это насколько затратная операция? Если я впишу условное (short int) x - y это скажется?
368 1888924
>>888908

>Потому что типа int на конкретно моей платформе самый быстрый и он соптимизировал


Да, размер инта зависит от платформы, но это всегда самый оптимальный тип.
c.png44 Кб, 1172x511
369 1888980
>>888924
А почему, что есть приведение типов, что его нет - код один и тот же?
370 1889005
>>888440
Может функцию сделать которая строку на слова по поробелу разбивает?
371 1889031
>>888980
компилер знает что делать и сука делает это
emf.jpg8 Кб, 480x360
372 1889047
>>888980
INTEGER PROMOTION
INTEGER PROMOTION
INTEGER PROMOTION
INTEGER PROMOTION
INTEGER PROMOTION
373 1889136
>>889005
Можно, а как? В питоне просто, тут.- нет
374 1889330
>>889136
ctype.h используй
375 1889338
>>888980
Если я правильно понимаю то у тебя идентичный код. Ведь результат все равно скастится к типу возврата.
376 1889341
>>888440
Не пробовал готовые либы искать? Curses там
377 1889434
>>889136
Может быть тебе подключить питон и вызывать его...
378 1889648
>>888440

>Говорю же, терминал надо написать,


В смысле?

Получил строку и пользуешь функцию strchr(mystr, " ");
Вернёт указатель на первый пробел или NULL, если пробела нет.
Или создай массив указателей и разбивай строку на токены в цикле.

Пиздец вопросы. Пиздец ответы. Убить вас всех нахуй. Или отправить на лесоповал озеленять вырубленные площади.
379 1889658
char buf[max];

main() {..}

Законно ли писать поверх buf + max в таком случае? Я думал, что что-то вроде сигсегв будет, там же за границу .bss пишется.
Снимок экрана 2020-12-24 в 19.42.12.png54 Кб, 671x509
380 1889669
381 1889719
>>889669
Но это же просто сегмент данных размером 2*MAXLINE.
382 1889725
>>889669
+ sizeof(int), разумеется
Стикер512x512
383 1889774
384 1890313
>>873113 (OP)
Почему для того чтобы из буфера не читался \n в условиях проверки стоит
while(getchar() != '\n')
continue;
Почему НЕ равно? Потому что оно в любом случае перейдёт в тру, т.к ты ввод нажимаешь, и вместо continue пойдёт проверка следущего символа буфера, т.е \n
385 1890314
>>890313
*в false. То есть в любом случае contine не происходит, а происходит итерация внешнего цикла с проверкой оставшегося \n
20160418120453a599bd83bce6598baaa450727aed45c9.jpg37 Кб, 604x604
386 1890458
Здравствуйте. Я полный нуб пришел к вам из ньюфаготреда.
Мне нужно скомпилить вот это дело, желательно без установки и настройки тонн софта и докачки библиотек.

https://github.com/pmaillot/X32-Behringer/blob/master/XAir_Command.c

GCC уже посоветовали, но я нихуя не понимаю как он настраивается и обязательно ли качать всю хуйню по нему или есть просто компиллер.
Помоги анон.
387 1890639
Помогите незнающему студенту. У меня задание сделать аницаию в openGL, с самой рисовкой я разобрался, только не знаю, как реализовать таймер/пропуск определённого количества времени. То есть я рисую 1 кадр, проходит 30 милисекунд и этот кадр должен нарисоваться ещё раз, но с изменениями, которые я прописал в программе.
388 1890671
>>890639
в цикле проверяешь разницу текущего времени с временем отрисовки предыдущего кадра и если больше нужного значения рисуешь кадр
389 1890974
>>890458
gcc -O3 XAir_Command.c -o prog_name
390 1891050
>>890671
Такое прокатывало в DOS, но сейчас операционки многозадачные. Загрузка проца 100% без причины это говнокод.
391 1891065
>>891050
это самый простой рабочий вариант а он студент
сейчас процессоры по 6 ядер имеют так что никто не заметит
392 1891352
Как сохранить данные структур в файле вместе с текстом? Какие функции использовать?
393 1891369
>>890671
>>891050
Решил проблему, в библиотеке которая нужна для отрисовки была своя функция таймера, с запуском функции по окончании, нахер я с этим 2 часа ебался, если можно было так легко сделать.

void Time()
{
glutPostRedisplay();
glutDisplayFunc(renderScene);
glutTimerFunc(30, Time, 0);
}
394 1891381
Подсобите, пожалуйста, свернуть формулы со скринов и скормить их компилятору gcc.

Надо получить RPM_A.

Если можно, то в двух вариантах: 1) кратко пошагово; 2) в одно действие.
395 1891391
>>890974
Спасибо анон, но нихрена в итоге не получилось все равно. Для компиляции еще надо собрать библиотеку, этого я не осилил.
Написал разработчику с просьбой скомпилять и он скомпилил.
7z - extwebp.7z.png3,9 Мб, 80x80
396 1891409
>>880733
Написал для интереса. Говнокод или все хорошо?
397 1891490
>>891381
Одноклассника попроси
180efc3227b70e92b88fd3e71826fbad.jpg29 Кб, 600x568
398 1891523
>>891490
Хуй будешь?
Будешь моим одноклассником, чепушь?
399 1891536
У питона есть pip. С помощью него можно устанавливать всякие крутые библиотеки. Есть ли что-то подобное для си?
400 1891548
>>891536

>всякие крутые библиотеки


Кокие?
401 1891552
На ревью.

Патч с реализацией мягкой защиты Active(file), с тремя крутилками. В настройках по умолчанию побочек не выявлено, в отличие от всех других вариантов. По умолчанию жесткая защита отключена, а мягкая соответственно действует весьма мягко, но ощутимо положительно при своппинге.

https://github.com/hakavlad/le9-patch/blob/main/le9aa1-5.10.patch
402 1891558
>>891536
Скачиваешь библиотеку в сорцах
@
Готово
403 1891574
У меня есть структура состоящая из трех полей. Одно поле это значение, а другие просто какие то свойства (число от 1 до n). Допустим я отсортировал кучу таких объектов (n^n) по возрастанию значения. Теперь мне нужно сделать так: перебираю каждый объект и мне нужно посчитать сколько элементов, которые по значению меньше чем текущий объект и при этом у них ни одно из оставшихся двух полей не совпадает. Есть ли в программировании для этого какая нибудь структура данных для быстрого подсчета таких объектов?
404 1891614
Сап, программач.
Пишу протокол обмена с железякой ARM. Объявляю enum cmd_type_t наподобие CMD_0001 = 0x0001U и т.п. несколько кодов команд. Компилятор для железки (GCC) успешно делает поле кода команд двухбайтовым, а такой же точно код на Винде (Qt) делает его четырехбайтовым. Запись CMD_0001 = (uint16_t)0x0001 не помогает. Упаковывание структуры pragma pack(push,1) тоже не дает эффекта.

Как заставить компилятор под комп сделать правильную разрядность cmd_type_t - два байта?
405 1891618
>>891614
typededef uint16_t cmd_t;
406 1891621
>>891618
А через enum никак?
407 1891642
>>891621
Рамер енума не определен.
408 1891645
>>891642
Спасибо
409 1891721
>>891621
enum достаточно большой, чтобы вместить используемые в нём числа, плюс компилятор можно попросить упаковать его поплотнее какими-нибудь __attribute__ ((__packed__)) или -fshort-enums если загуглишь `sizeof enum`, первая же ссылка ведёт на stack overflow, где это всё написано
410 1891732
>>891558

> Скачиваешь библиотеку в сорцах



Ну да, логично...
411 1892014
>>889658
>>889658
Твой буффер будет расположен в сегменте данных.
Поэтому сигнал может быть сгенерирован если выйдешь за границу виртуальной страницы. Но пока не перешагнёшь границу страницы, исключения не будет.

БОЛЕЕ ТОГО! В сегмент данных попадают переменные из разных исходников. Т.ч. граница сегмента данных может далеко - при выходе за границы массивы ты просто прочитаешь или перезапишешь глобальные или статические переменные, обхявленные в других файлах.
412 1892047
>>891381
RPM_R = ( ((n - 1) x f x m x 60) / (COUNT x poles) );

y = ( (n - 1) / (2 x poles) );

RPM_A = RPM_R x y;
14334349766410.jpg50 Кб, 300x300
413 1892073
Есть байт, третий и четвёртый биты в котором принимают значение: 0x00, 0x08, 0x10, 0x18.

Надо с помощью операций с битами вывести следующие значения: 0x00 => 3, 0x08 => 5, 0x10 => 7, 0x18 => 9.
Т.е. если в байте третий и четвёртый биты равны 0x08, то надо вывести 5 и т.д.

Понятно, что какой-нибудь switch-case и маска 0x18 решили бы проблему.
Но надо вычленить это именно битовыми операциями.

Хелпуйте, парни.
414 1892182
>>892073
Начни с функции, которая реализует сложение через битовые операции.
415 1892199
>>889658
Тебе всякой чуши поотвечали. В языке никаких сигналов нет. А писать за пределы все равно незаконно.
416 1892202
>>892073
Ты видишь последовательные комбинации битов, и у тебя не загорелась идея как превратить их в последовательность индексов от 0?
417 1892236
>>892199

>А писать за пределы все равно незаконно.


Наоборот. Си - свободный язык, позволяет очень много всего делать, и так и надо. Можно всё, а делать или не далеть решать только тебе. Язык не запрещает, не сковывает руки, а наоборот помогает делать что угодно. И из за этого он прозрачен, что ты пишешь, то и получаешь. Ты видишь что ты пишешь, в отличие от других параш, где язык является черным ящиком, хуй знает что там под капотом реально происходит.
418 1892308
>>892236
Читай стандарт, маняфантазер. Чтение за пределом массива UB
419 1892326
>>892308
Странная рекомендация.
UB - все что не описано в стандарте языка.
Ты же рекомендуешь почитать об UB в стандарте. Как-то странно.
420 1892337
Ретят, где найти ISO/IEC 9899:1990? (Да, именно 1990.)
421 1892338
Да, забыл добавить:
Продолжаю искать: DO-178C.PDF (A и В тоже подойдут), DO-254.PDF, DO-385.PDF (всё ещё некритично), ARINC-653.PDF.
Без смс и регистрации!
422 1892340
>>892337
read.pudn.com/downloads133/doc/565041/ANSI_ISO%2B9899-1990%2B[1].pdf
423 1892347
>>892326
Ну открой ты стандарт чтобы чушь не пороть. Ситуации при которых возникает UB описаны именно в стандарте.
424 1892353
Хочу работать с компьютерной графикой. Что мне нужно читать, чтобы создать хотя бы куб на си?
425 1892395
>>892347

> Ситуации при которых возникает UB описаны именно в стандарте.


Ты даун? Ты хоть раз читал стандарт? Тебе пояснили, что ситуации при которых UB происходит наоборот в стандарте не описаны.
1594708604830.png191 Кб, 1024x1036
426 1892422
>>892395
Ты наркоман? Зашел потроллить тупостью? Ты хоть раз открывал стандарт? Там описаны ВСЕ ситуации при которых происходит UB.
427 1892447
>>892422
Ебать у тебя полыхнуло))
Туши жопку, маня
428 1892472
>>892047
Спасибо, пока что робит.
429 1892508
>>892308
И что? Следуя твоим дебильным мемасам, свобода это и есть UB. Когда можно делать всё, значит предскащзать действия невозможно. И тут нет проблемы. Поедсказать невозможно только со стороны, например дебил как ты или компилятор, который вообще машина, не сможет предсказать, но это и не нужно. Главное, что умный человек, либо не будет так делать, либо будет когда ему это нужно. Главное есть возможность, это всегда плюс. Важно что язык предсказуем, ты пишешь код заранее зная что он делает, буквально.

А вот всякая пидарасня из других говноязыков программирует наоборот. Сначала "предполагает" от балды, что "наверное" код будет делать надо, но не факт, ибо неизвестно. Так что сначала надо запустить и посмотреть что выйдет. Посмотрел, если "сработало", ну окей, если "не сработало", продолжает гадать на кофейной гуще пока наконец не "сработает".

Программирование на си это техника - выдача устройству четких команд на исполнение. Ты сначала должен знать работу устройства и поддерживаемые команда, а потом просто перечисляешь что делать и всё четко исполняется.

"Программирование" же на другом говне - как бюрокрания: "Господин язык, мне тут надо сделать это, я вроде составил прошение по форме (но неуверен), пожалуйста рассмотрите, если у вас будет время и желание, а я холоп, человек маленький, дальше не моего ума дело, подожду решения господина, если что не так, перепишу и подам прошение снова и снова, пока вас не устроит. С низким поклоном, макака Чухан Объебосов".

И вот таких чуханов объебосов, из говна залетевших в си-тред видно сразу. Си - четкий язык, поэтому программист на си всегда знает что делает, ведь есть доки. А залетные чуханы делают наоборот, пишут на авось от балды примерно так:

>char a[NN], b[NN]


>"введите 1 строку:", a


>"введите 2 строку:", b


>if (a == b) "строки одинаковые"


Потом запускают, не понимают результата, и бегут в тред с вопросами "а пачиму ниработаит?". Потому что привыкли писать хуету, сами не зная какую, чисто интуитивно, на авось "может прокатит". И вот этот вот пиздец эти ебланы считают протраммированием.
В си-то всё четко, прежде чем писать, читаешь доку, и заранее знаешь что получишь. Вообще не вопрос, проблемы не существует. А у хуесосов, в говне вместо языков, никакой ясности нет, язык - черный ящик, делает хуй знает что, вот и "программисты" тоже пишут хуй знает что, на удачу.
429 1892508
>>892308
И что? Следуя твоим дебильным мемасам, свобода это и есть UB. Когда можно делать всё, значит предскащзать действия невозможно. И тут нет проблемы. Поедсказать невозможно только со стороны, например дебил как ты или компилятор, который вообще машина, не сможет предсказать, но это и не нужно. Главное, что умный человек, либо не будет так делать, либо будет когда ему это нужно. Главное есть возможность, это всегда плюс. Важно что язык предсказуем, ты пишешь код заранее зная что он делает, буквально.

А вот всякая пидарасня из других говноязыков программирует наоборот. Сначала "предполагает" от балды, что "наверное" код будет делать надо, но не факт, ибо неизвестно. Так что сначала надо запустить и посмотреть что выйдет. Посмотрел, если "сработало", ну окей, если "не сработало", продолжает гадать на кофейной гуще пока наконец не "сработает".

Программирование на си это техника - выдача устройству четких команд на исполнение. Ты сначала должен знать работу устройства и поддерживаемые команда, а потом просто перечисляешь что делать и всё четко исполняется.

"Программирование" же на другом говне - как бюрокрания: "Господин язык, мне тут надо сделать это, я вроде составил прошение по форме (но неуверен), пожалуйста рассмотрите, если у вас будет время и желание, а я холоп, человек маленький, дальше не моего ума дело, подожду решения господина, если что не так, перепишу и подам прошение снова и снова, пока вас не устроит. С низким поклоном, макака Чухан Объебосов".

И вот таких чуханов объебосов, из говна залетевших в си-тред видно сразу. Си - четкий язык, поэтому программист на си всегда знает что делает, ведь есть доки. А залетные чуханы делают наоборот, пишут на авось от балды примерно так:

>char a[NN], b[NN]


>"введите 1 строку:", a


>"введите 2 строку:", b


>if (a == b) "строки одинаковые"


Потом запускают, не понимают результата, и бегут в тред с вопросами "а пачиму ниработаит?". Потому что привыкли писать хуету, сами не зная какую, чисто интуитивно, на авось "может прокатит". И вот этот вот пиздец эти ебланы считают протраммированием.
В си-то всё четко, прежде чем писать, читаешь доку, и заранее знаешь что получишь. Вообще не вопрос, проблемы не существует. А у хуесосов, в говне вместо языков, никакой ясности нет, язык - черный ящик, делает хуй знает что, вот и "программисты" тоже пишут хуй знает что, на удачу.
430 1892518
>>892508

>пук


Дальше не читал. Ты не достоит программировать на Си. Все изящество программиста на Си в том, чтобы читать раздел J2 в стандарте языка, и избегать всяческого UB по коду. Ты не имеешь права с такими мыслями писать код на Си. Ты меня слышишь? Не имеешь права!!
431 1892540
>>892518

>Дальше не читал.


Я и говорю. Быдло макаки залетевшие из своей параши в си - читать не приучены, не читают они, а значит не знают что пишут, тогда как программист на си - наоборот, сначала читает и уже знает, а только потом пишет. Или, еще яснее: если не знает, не пишет ничего, пока не разберется в том, что собственно собирвается напечатать в редактор кода. В си нельзя ебашить непонятный код, в надежде на авось или на "потом докрутить по результату". Это и есть тот самый, настоящий UB, UB головного мозга дебиломакаки, которой в си делать нечего.
432 1892613
>>892508
Пчел, решил дать шанс твоему шизовысеру.
Так вот, язык Си не имеет никакого отношения ни к устройству, ни к его командам. Язык - это лингвистический конструкт. В языке Си нет никаких .bss секций, page faults и прочего. Зато в языке четко сказано что запись за пределами массива - UB, то есть лажа.
433 1892640
Есть ли случаи, где С++ показывает себя лучше?
434 1892661
435 1892667
>>892661
Например?
436 1892669
>>892667
А я ебу?
437 1892672
438 1892754
>>892640
Нету, уфы
439 1892820
>>892613

>Си не имеет никакого отношения ни к устройству, ни к его командам. Язык - это лингвистический конструкт


Как в воду глядел. Как раз об этом размышлял, но писать было лень, а тут ты такой. Поражаюсь себе. То ли я такой умный, то ли глупцы такие предсказуемые. Хоть и отрицаешь голословно, но, по крайней мере, это говорит, что более-менее понял написанное. Уже хорошо. А то я уже привык к ответам уровня пеньков.

Для ясности, начну с терминологии. Будет так: си – «язык (программирования)», соответственно: «программирование», «программисты». Другие языки – «говно», соответственно: «говношлепство», «говношлепы / макаки».

Итак, рассмотрим следующий код:
int a=1;
Говношлепов учат так: «переменная – это ячейка памяти, в которой хранится значение». Определение – гуманитарное, в соответствии с обычным житейским здравым смыслом – философия. Ячейка является сущностью, объектом. Ничего учить не надо, любой человек по дефолту – понимает простую философию на интуитивном уровне. И хорошо, правильно учат, оно так и работает, но только в говне.

А вот в си это не работает, от слова совсем, потому что си – это программирование машины, техника, а вовсе не пиздоблядская гуманитарная философия.
Начнем с того, что переменная в си это не объект, а значит никакая не ячейка. Ячейка имеет защиту, она изолирована стенками. Нельзя из одной ячейки попасть в другую. Если попытаться засунуть в ячейку слишком много, ничего страшного не произойдет, просто часть не влезет и всё. Именно так работает говно, но не си.
Си это машинный интерфейс. Прежде чем написать эту простейшую строчку кода, ты должен понимать как работает железо (процессор+память) и выучить, что переменная это просто место в памяти, никакими «стенками» не защищенное и не ограниченное. Это технические спецификации машины и языка си как её интерфейса. Этому нельзя догадаться философской интуицией – только выучить, заранее читая документацию. Иначе, без этих технических знаний, ты уже крупно обосрался одной этой строчкой.

Ты полном дерьме, по уши, по одной простой причине – гуманитарное говноблядство безопасно. Ты можешь на дваче пиздеть любую хуйню, не зная, заливать в уши лапшу, и максимум тебя просто пошлют и всё. Именно так происходит в говне, Тебе просто либо выдается ошибка, либо получаешь не тот результат. Ничего страшного, просто крутишься как уж на сковородке пока не получишь желаемое. Обычная повседневная жизнь любого быдлана, бытовая философия – суть говношлепства.
А техника, машина – наоборот, очень уязвима. Машина – не автомобиль для быдла, а большой сложный механизм на заводе (компьютер) и пульт управления на всю стену с кучей лампочек, кнопок и рычажков, её интерфейс (язык си). Ты не можешь просто подойти, не изучив, что это за машина, как устроена и работает, как на неё воздействует каждая кнопка, и просто наугад тыкать гуманитарнным способом: «та кнопочка зелененькая, значит можно жать, будет только лучше, а вот та красная, значит лучше не трогать» и так далее. С машиной, любое неверное движение и она просто ломается нахуй. Поэтому говношлепов к машинам не подпускают, сначала требуют выучить всё и сдать экзамен. Иначе еблан первым же действием всё ломает нахуй. Тут не прокатит метод научного тыка как у говношлепов гуманитарных, вторых шансов нет, машина слишком сложная. Даже повторяя косяки, ты ничему не научишься. Только читать документацию заранее, до полного понимания куда ты лезешь.
439 1892820
>>892613

>Си не имеет никакого отношения ни к устройству, ни к его командам. Язык - это лингвистический конструкт


Как в воду глядел. Как раз об этом размышлял, но писать было лень, а тут ты такой. Поражаюсь себе. То ли я такой умный, то ли глупцы такие предсказуемые. Хоть и отрицаешь голословно, но, по крайней мере, это говорит, что более-менее понял написанное. Уже хорошо. А то я уже привык к ответам уровня пеньков.

Для ясности, начну с терминологии. Будет так: си – «язык (программирования)», соответственно: «программирование», «программисты». Другие языки – «говно», соответственно: «говношлепство», «говношлепы / макаки».

Итак, рассмотрим следующий код:
int a=1;
Говношлепов учат так: «переменная – это ячейка памяти, в которой хранится значение». Определение – гуманитарное, в соответствии с обычным житейским здравым смыслом – философия. Ячейка является сущностью, объектом. Ничего учить не надо, любой человек по дефолту – понимает простую философию на интуитивном уровне. И хорошо, правильно учат, оно так и работает, но только в говне.

А вот в си это не работает, от слова совсем, потому что си – это программирование машины, техника, а вовсе не пиздоблядская гуманитарная философия.
Начнем с того, что переменная в си это не объект, а значит никакая не ячейка. Ячейка имеет защиту, она изолирована стенками. Нельзя из одной ячейки попасть в другую. Если попытаться засунуть в ячейку слишком много, ничего страшного не произойдет, просто часть не влезет и всё. Именно так работает говно, но не си.
Си это машинный интерфейс. Прежде чем написать эту простейшую строчку кода, ты должен понимать как работает железо (процессор+память) и выучить, что переменная это просто место в памяти, никакими «стенками» не защищенное и не ограниченное. Это технические спецификации машины и языка си как её интерфейса. Этому нельзя догадаться философской интуицией – только выучить, заранее читая документацию. Иначе, без этих технических знаний, ты уже крупно обосрался одной этой строчкой.

Ты полном дерьме, по уши, по одной простой причине – гуманитарное говноблядство безопасно. Ты можешь на дваче пиздеть любую хуйню, не зная, заливать в уши лапшу, и максимум тебя просто пошлют и всё. Именно так происходит в говне, Тебе просто либо выдается ошибка, либо получаешь не тот результат. Ничего страшного, просто крутишься как уж на сковородке пока не получишь желаемое. Обычная повседневная жизнь любого быдлана, бытовая философия – суть говношлепства.
А техника, машина – наоборот, очень уязвима. Машина – не автомобиль для быдла, а большой сложный механизм на заводе (компьютер) и пульт управления на всю стену с кучей лампочек, кнопок и рычажков, её интерфейс (язык си). Ты не можешь просто подойти, не изучив, что это за машина, как устроена и работает, как на неё воздействует каждая кнопка, и просто наугад тыкать гуманитарнным способом: «та кнопочка зелененькая, значит можно жать, будет только лучше, а вот та красная, значит лучше не трогать» и так далее. С машиной, любое неверное движение и она просто ломается нахуй. Поэтому говношлепов к машинам не подпускают, сначала требуют выучить всё и сдать экзамен. Иначе еблан первым же действием всё ломает нахуй. Тут не прокатит метод научного тыка как у говношлепов гуманитарных, вторых шансов нет, машина слишком сложная. Даже повторяя косяки, ты ничему не научишься. Только читать документацию заранее, до полного понимания куда ты лезешь.
440 1892859
>>892820
Пиздец шиза. Не пиши мне больше.
441 1892917
>>892820
Интересно что будет когда этот шиз научится включать оптимизацию в компиляторе
442 1892973
Что мне сделать чтобы вкатиться в эмбед по Си без образования? Хочу пойти получить, а вдруг прокатит и без него? Сам язык то знаю, пишу всякие приложухи. Говорят могут даже не знающего дауна на завод взять у которого есть вышка и за неделю научат.
443 1892982
Нахуй создали ООП?
444 1892996
>>892982
Потому что поняли что писать сложную логику, в которой друг с другом взаимодействуют десятки пользовательских сущностей, на процедуропараше — пустая трата времени.
445 1893011
>>892996

>пустая трата времени


И придумали оопговно, лол
446 1893015
>>893011
Школьник, плиз.
447 1893036
>>893015
Пока что не знаю ООП, просто не понимаю почему вьебали это если в Си есть всё. Чем обосновано хуй знает.
448 1893037
А хотя стандартный Си программист не знает даже слова пользователь.
449 1893039
>>893036
Школьнексон, плиз. ООП — это не о языке. Это концепция. И эта концепция старше чем езык погромирования це. Ты можешь на каком угодно языке писать в ООП стиле. И ты скорее всего и пишешь, просто не знаешь об этом.
450 1893099
>>893039

>Это концепция


Не нужная концепция
451 1893261
>>893099

>Не нужная


Ты же сам себя обосрал.
Не ООП, ряяя.png95 Кб, 644x796
452 1893370
453 1893574
>>893370
Ляяяя, красота какая. У меня аж пиструн привстал.
454 1893600
455 1893648
>>893370
Что за шрифт?
456 1893677
>>893370
это у вас нормальная практика в си кастить
надеюсь структуры и мутабельные
457 1893699
>>893600
Нет. Общая часть в начале.
>>893648
dejavu sans mono bold
458 1895365
>>880709
>>880733
пиздец интересно
459 1895438
>>893699

> Нет. Общая часть в начале.


Это гарантируется?
460 1895472
461 1895494
>>895472
Покажи пункт стандарта.
463 1895699
>>895365
А что тебе интересно?
464 1896520
Аноны, программирую уже давольно давно на python, недавно появилось желание вкатиться в какой-нибудь по настоящему фундаментальный язык, выбрал си. Прочел книгу Ритчи уже на две трети, попрактиковался на прогах аля "хело ворлд" и тд. Хотелось бы узнать, а что вообще интересного пишут на си? да да, в гугле не забанили, в интернетах встречается много противоречивой, глупой, очень поверхностной информации по этому вопросу. И второй вопрос: на чем бы вы порекомендовали попрактиковаться начинающиму?
465 1896521
>>896520
Пиши все что относится к системщине и твоей душе угодно. Это самый простой вариант.
466 1896524
>>896521
Например?
Я в этом вашем "системном" не шарю от слова совсем. На пайтоне я пишу боты, парсеры, и веб на джанго/фласке. Приведи примеы, пожалуйста
467 1896529
>>896524

>я пишу боты, парсеры, и веб на джанго/фласке


Говноед, уходи
468 1896586
>>896524
Python, Nginx, Linux.
arigato-mem.jpg32 Кб, 490x362
469 1897574
>>892014
Спасибо. А вот ещё назрел вопрос: что тогда делает sys_brk(addr)? В гуглах несколько противоречивая информация, в мануале же написано, что по успешному выполнению конец ДС становится равным addr, т.е. простая аллокация/деаллокация для сегмента. Типа еще линкер рожает символ _end, указывающий на конец сегмента; он виден в отладчике, но в рантайме простой программы _end всегда равен 0x00.
Одним словом, что определяет начало и размер сегмента?
Вообще я так понял, что brk() просто проверяет лежит ли addr в пределах сегмента данных, если - нет, то ENOMEM
470 1897628
>>897574
Сегмент данных начинается в _end, а заканчивается там, где скажет brk.

> _end всегда равен 0x00.


extern _end[];
471 1897652
допустим я знаю адрес первого байта флота, и знаю что флот 32 битный. Как мне собрать флот? У меня получаются огромные инты и коневертация пораждает соотв. огромный флот, хотя там лежит 0.556
472 1897655
>>897652
Кастишь указатель на первый байт к flot*
sage 473 1897656
>>897655
ебать ты меня затролил, float* конечно
474 1897662
>>897652
Никак, это UB
475 1897672
>>897662
что за UB?

>>897655
Да об этом я не подумал. А есть ли способ узнать какой тип данных лежит по указателю?
476 1897704
>>897672
По указателю лежат только байты. "Какие там данные" это абстракции у тебя в воображении. Язык лишь имеет сахарок прочитать столько байт, сколько ты укажешь (типом), так что сам должен знать сколько тебе надо.
1608307397looped1608307396.mp4819 Кб, mp4,
640x360, 0:09
477 1897720
>>897704
А как кулцхакеры тогда программы взламывают?
478 1897801
>>897720
Смотрят кто и куда обращается и на основании своего опыта подобных явлений делают предположения, которые потом проверяют. Так же смотрят на сами данные. Опытные кулхацкеры просто глядя на хекс-дамп могут сказать что это такое, лишь по внешнему виду чисел. Изучаешь все аспекты программ и с обытом набиваешь глаз.
479 1897817
>>897801
А как можно посмотреть кто и куда обращается?
480 1897835
>>897817
Любым дебагером. Из них самая навороченная йоба это IDA.
481 1897892
>>873113 (OP)
Привет, аноны, извиняюсь за совсем уж даунский вопрос. Но

Как грубо говоря распаковать указатель на чар?
Имеется
char c[128];
char test

нужно содержимое
test положить в c , strcpy(c, *test) так или иначе не сработало.
482 1897894
>>897892
char *test (указатель), почему-то удалилось
быстрофикс
483 1897925
Каков вопрос--такой ответ:
memcpy(с, &test, sizeof test)
484 1897951
>>897892

>так или иначе не сработало


>>892508
Смотри второй абзац.
485 1899726
>>897892
#define InitArr(dst, src) memcpy(dst, src, sizeof(dst))
486 1899947
https://pastebin.com/z0BXNTze
Почему segmentation fault?

Тестирую, что быстрее, копировать сначала по первому адресу двумерного массива, или по второму?
copyij будет копировать аргументы или передовать память из рук в руки?
Сколь большой массив можно объявить?
487 1899976
Как маллокнуть под двумерный массив?
488 1900020
>>899947
Ты копируешь аргументы через stack, два массива по 2048 * 2048 байт(~8 миллионов байт), вполне вероятно ты вываливаешься из-за этого в SIGSEGV.
А вот если бы ты имел операционную систему с дефрагментацией стэка, то думаю бы с бы такой бы проблемой бы ты бы не бы столкнулся бы.
>>899976
Яхуйзнает, может так:

>int8_t ××array = (int8_t ××)malloc(sizeof(int8_t ×) × LEN);


>for (size_t i = 0; i < LEN; ++i) {


> array = (int8_t ×)malloc(sizeof(int8_t) × LEN);


>}


Хотя я не уверен до самого конечного конца...
489 1900022
>>900020
Макаба сожрала индексацию у array со скобочками и i внутри них, эээээээээх
490 1900038
>>900020
Это такой подъёб что я на линухе? ЖD
491 1900040
>>899976
Я вспомнил что надо именно так на плюсах маллокать
492 1900078
>>900038
Это тупой рофл одного шизика, который мечтает дефрагментировать стэк.
old.jpg66 Кб, 400x400
493 1900482
>>899976
int @p = malloc(sizeof p @ xsize @ ysize);
...
p[x+xsize@y] = 123;
494 1901089
Есть ли готовые функции для символьного вычисления в си?
495 1901122
>>885061
Пости код в моноширинном шрифте
496 1901470
Слава Языку!
497 1901825
>>901089
Нет, но у популярных пакетов обычно есть возможность писать расширения на Си.
498 1903819
Может кто подсказать, как сделать префиксный калькулятор со стеком, но оператор пользователь вводит словами.
Тип + add, - sub, ^ pow и тд.
Алгорит действий вроде понимаю, но понять не могу, какие функции использовать, чтоб разделить слова и цифры на входе
499 1903840
>>903819
strtol/strtod распарсит столько символов, сколько сможет, и отдаст тебе указатель туда, где число закончилось. Подумай об этом.
500 1904081
>>903819
читаешь символ по аски смотришь цифра или буква, строчная или заглавная и т. п.
501 1904225
>>904081
а зачем мне заглавная?
Мне надо, чтоб оно считывало к примеру так:
1 2 add =
или так
7 0.5 add 2.2 0.2 sub mul
Да и не особо понимаю, как я потом числа анси, могу использовать в расчетах.
502 1904256
>>904225
Ты говоришь о распознавании текстового синтаксиса. Либо пишешь парсер сам, либо используй готовые интерпретаторы скриптов. К языку программирования это не относится и быть в нём не может. Это относится к написанию компилятора/интерпретатора языка.
503 1904320
Как можно сократить текст этой программы? Как? КАК? Не потоками! А как тогда?

#include <stdio.h>
void main(void)
{
char, name[50];
FILE *in;
printf("Enter file name:");
scanf("%s", name);
if((in=fopen(name, "r"))==NULL)
printf("Error open %s", name);
else
while(!feof(in))
{
ch=getc(in);
putchar(ch);
}
}
504 1904481
Помогите, говно даёт ошибку сегментирования при входе в функцию возвращающую указатель на пробел.

char res;
char word[SIZE];
успешная запись в массив...
res = spaces(word, SIZE);
...

char
spaces(char st, int n)
{
printf("Выполнен вход в space()");
char
ch;
int i;
printf("%c", *st);
for(i = 0;i < n || st == '\0';i++)
{
if(st == ' ')
{
ch = st;
}
}
return ch;
}
505 1904485
>>904481
Разметка слетела, звёздочки на res, char st, char ch
506 1904791
>>904481
pastebin
507 1904796
>>904791
Что pastebin?
508 1904807
>>904796
в пастбин сделай ссылку кинь.
510 1904817
>>904813
*strchr в первоначальной версии не использовалась
Тред утонул или удален.
Это копия, сохраненная 29 апреля 2021 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски