Программирование

Ответить в тред Ответить в тред
C Programming Language #66 /clang/ Аноним # OP 04/12/20 Птн 20:21:00 18731131
C Propaganda.jpg 1965Кб, 2000x2610
2000x2610
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь 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)
Аноним 06/12/20 Вск 15:47:58 18742722
хочу работать со строками, но ехидный vs19 запрещает передавать аргументы в scanf_s("%s", str) - как лечить?
Аноним 06/12/20 Вск 16:08:23 18742903
>>1874272
Так крякни его, и сразу сможешь использовать эту функцию нормально без деморежима.
Аноним 06/12/20 Вск 22:46:17 18746744
Здрасьте. argv[] принимает аргументы в регистры согласно ABI?
Аноним 07/12/20 Пнд 00:29:53 18747035
>>1874674
Да, если архитектура это предусматривает.
main не фактическая точка входа в программу
argv это массив указателей, элементы будут все так же лежать где-то в памяти.
07/12/20 Пнд 09:30:04 18747996
>>1874674
Чё ты несешь.
Аргументы в main передаются согласно ABI.
Аноним 07/12/20 Пнд 15:04:20 18749417
Экспериментирую с CLI программами, вот хочу поинтересоваться, а как можно вызвать аргументы для ввода через TAB?
К примеру: беру я название программы которую нужно открыть, ввожу первые 3 буквы, нажимаю TAB и чтобы все файлы которые начинаются с этих букв показывались в консоли.
Это как то через какие то готовые утилиты делается и библиотеки да?
Аноним 07/12/20 Пнд 15:13:35 18749458
Еще спрошу. А как открыть файл в режиме w+ и сделать так чтобы можно было не просто его дополнять, но и менять содержимое. Намекните хотя бы на библиотеку или инструменты которые можно использовать. Редактор будет тоже в CLI.
Если что я сейчас изучаю stdlib с fopen и т.д
Аноним 07/12/20 Пнд 16:13:12 18749859
>>1874941
Какой-то bash это и так сделает если твоя приложуха лежит в пути который в PATH.
А если ты хочешь ещё и аргументы дополнять - там уже надо читать как bash autocomplete настраивать и писать скрипт.
Powrshell кажись тоже там умеет.
>>1874945
r+ тебе нужен.
Ну а вообще если файл большой, и надо активно мелкие моменты в нем менять - изволь делать через mmap, но если ты начинающий, то даже не связывайся с этим.
Аноним 07/12/20 Пнд 16:40:12 187500310
>>1874985
Спасибо. Тогда не буду. Буду учить дальше.
Аноним 08/12/20 Втр 17:29:43 187593511
Аноны объясните дауну последовательность действий
a=b++ b++ b++;
Аноним 08/12/20 Втр 17:37:23 187594812
Аноним 08/12/20 Втр 17:46:17 187595713
>>1875935
Вообще UB. Ты не знаешь точно когда компилятор может всунуть инкремент - после всего блока вычислений три раза, или после каждого взятия значения из b.
https://ideone.com/QrjJty
Аноним 08/12/20 Втр 17:52:48 187596714
08/12/20 Втр 22:49:49 187619715
>>1875935
Откуда лезут с этим вопросом? Это троллинг или на собеседованиях такое спрашивают?
Аноним 08/12/20 Втр 23:23:29 187621616
Screenshot2020-[...].png 82Кб, 1060x522
1060x522
Аноним 08/12/20 Втр 23:35:40 187622217
>>1876197
В пабликах, это мем уровня "любой пятиклассник решит эту задачку"
Аноним 09/12/20 Срд 04:15:30 187630218
изображение.png 35Кб, 731x665
731x665
Как что-то отправить процессу-потомку по созданному анонимному каналу?
Аноним 09/12/20 Срд 05:37:17 187630919
Как работает выравнивание? Если я в мейне объявлю char x; и int y;, то x находится по адресу 10, а y - по адресу 11. Разве не должно быть какого-то выравнивания в памяти? То есть, почему y размещается по адресу 14? Ведь на 32 бит системе, машинное слово составляет 4 бита. То есть проц не сможет обратиться к 11-му адресу, ибо он читает по 4 бита, а 11 не кратко четырем. Или я что-то не так понимаю?
09/12/20 Срд 08:26:09 187633720
Аноним 09/12/20 Срд 13:13:48 187648921
>>1875935
>a=b++ b++ b++;

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

то же самое что
a = b+b+b;
b++;
Аноним 09/12/20 Срд 13:41:01 187651522
Аноним 09/12/20 Срд 13:53:14 187653123
>>1876515
Тогдв вывод неправильный.
Должен быть 1 и 4
Аноним 09/12/20 Срд 18:41:12 187679324
>>1876216

выбрось эту книгу. дважды изменение одного объекта в памяти, не разделённое секвенс поинтом - ub
Аноним 09/12/20 Срд 18:58:59 187681525
>>1876531
Тут не бывает правильного вывода, как не бывает правильного значения у фразы "нельзя казнить помиловать"
Аноним 09/12/20 Срд 19:34:17 187684526
Сап, программач, начал изучать С и не понимаю одну вещь. Как я понял, когда инициализируем переменную к примеру

long i = 5 + 3;

То сами 5 и 3 перед тем как быть посчитанными и стать i принимаются за int, если не хватает места то unsigned int - long - unsigned long - long long - unsigned long long. Так вот в чем смысл добавлять суффиксы к этим статическим числам типо ULL (unsigned long long), если язык сам это делает автоматически? Не понимаю зачем это нужно именно с интами, с числами с плавающей точкой понятно, там изначально все числа даблы и если хотим сэкономить память, то используем флоаты при вычислении. В итоге контролируем не только к какому типу приводить, но и с каким вычислять. Но насколько я понимаю с интами все наоборот и изначально отчет стартует с самого минимального типа инта, и сам приводится автоматически к нужному типу. Так зачем это нужно? Сэкономить не выходит очевидно.
Аноним 09/12/20 Срд 19:54:42 187686227
>>1876845
> если не хватает места то
хуй в рот. (1 << 32) == 0
Аноним 09/12/20 Срд 19:57:24 187686428
1572125282773.png 19Кб, 567x340
567x340
>>1876845
Надеюсь данный скрин поможет тебе приблизиться к пониманию.
Аноним 09/12/20 Срд 20:56:54 187691129
>>1876845
> Сап, программач, начал изучать С
Рекомендую дальше продолжать изучение и искать смысл для каждой возможности этого чудесного и максимально простого языка.
>Так вот в чем смысл добавлять суффиксы к этим статическим числам типо ULL (unsigned long long), если язык сам это делает автоматически?
Чтобы подсказать компилятору как лучше сделать, очевидно же. Если ты пока не столкнулся с проблемой, это не значит что ее нет.
Аноним 09/12/20 Срд 21:43:11 187693830
>>1876911
Ну меня конкретные случаи применения интересовали.

>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 нет, они только в выражениях играют роль, если приводить надо.
Аноним 09/12/20 Срд 23:49:46 187702031
>>1876815
У операции "присваивание" приоритет выше, чем у постинкремента.
У постинкремента самый низкий приоритет.
Покажи мне компилятор, который посчитает это выражение как 6 и 4.
Аноним 10/12/20 Чтв 00:07:39 187703132
image.png 9Кб, 458x130
458x130
Аноним 10/12/20 Чтв 00:11:28 187703433
image.png 87Кб, 1541x730
1541x730
>>1876337
Пруф в пикриле.
Так что вопрос >>1876309 актуален

Аноним 10/12/20 Чтв 00:16:16 187703534
>>1877034
Это какой-то феерический пиздец с ключами.
Где вы такие "компиляторы" находите?
Сами пишите?
Аноним 10/12/20 Чтв 00:17:19 187703635
>>1877034
%p для адреса чего не пользуешь?
Аноним 10/12/20 Чтв 00:18:44 187703736
>>1877034
А может быть у тебя 8-битный процессор? Тогда вполне может быть.
Аноним 10/12/20 Чтв 00:20:20 187703837
>>1877035
>Это какой-то феерический пиздец с ключами.
Что с ними не так?
>Где вы такие "компиляторы" находите?
Обычный онлайн компилятор. Написал в нем, потому что пк не под рукой.
>>1877036
Чтобы явно показать, что следующий адрес на единицу больше в десятичной системе. В общем, для наглядности конкретного примера, не более.
Аноним 10/12/20 Чтв 00:21:28 187704038
1537388666261.png 116Кб, 1920x750
1920x750
>>1877020
>У постинкремента самый низкий приоритет.
Это неважно, потому что в данном случае важны точки следования (sequence points) а их тут нет
Это UB (Undefined behavior), неопределенно поведение. Оно не определено, хоть и не является ошибкой. Компилятору на вход дали мусор, компилятор может выдать мусор.
Более того, сегодня он тебе выдаст 1 и 4, а завтра ты допишешь какую то функцию, оптимизация поменяется, и выведет что то другое - why not?
>Покажи мне компилятор, который посчитает это выражение как 6 и 4.
Clang, GCC.
Аноним 10/12/20 Чтв 00:22:51 187704139
>>1876309
Если у тебя не ARM, x86 умеет обращаться к любой ячейка памяти, почему же нет?
Аноним 10/12/20 Чтв 00:43:13 187704640
image.png 42Кб, 1349x765
1349x765
image.png 53Кб, 990x576
990x576
>>1877037
Вряд ли на хосте того веб-компилятора используется восьмибитный проц. Ниже результаты msvc и gcc. В обоих случаях компилировалось под x86 32-бит. Видно, что char всегда располагается по нечетному адресу, а int - по четному (возможно, кратному 4-м). Чем это обусловлено? Еще раз повторю вопрос: разве не должно применяться принудительное выравнивание памяти по 4 байта на 32-бит и по 8 байт на 64-бит, дабы соответствовать машинному слову? Ведь так процу на 32 бит придется бегать не по 4 294 967 296 адресам, а по 1 073 741 824 фрагментам по 4 байта. Я вообще раньше думал, что так и работает. Но факт того, что char'ы размещаются в нечетных адресах уже приводит к тому, что разметка наебется. Плюс, чел >>1877041 говорит, что x86 может обращаться к любой ячейке. Если по умолчанию компиляторы для x86 не включают выравнивание в ОЗУ, то нахуя они это делают в структурах, например?

Аноним 10/12/20 Чтв 00:44:58 187704841
>>1877034
А выравнивание стека включено? Если нет, то все верно на скриншоте.
Аноним 10/12/20 Чтв 00:56:27 187705642
>>1877040
А разве у тебя компиляторы не соптимизировали в константы оба числа?
Аноним 10/12/20 Чтв 00:57:05 187705843
>>1877048
Я хз, что за компилятор там используется и с какими ключами он запускается по умолчанию. Вообще, такие вещи касательно выравнивания как-то описываются в стандарте языка? Или это уже приколы компиляторов и только?
Аноним 10/12/20 Чтв 00:58:06 187706044
>>1877046
Процессор всё равно будет выбирать с шины или из кэша целым словом. Ради теста сделай два char, а затем int
Наверняка в памяти каждое из них будет в границах 4-х байт.
А уже как внутри этих 4-х байт будет выровнен char это уже дело десятое.

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

Аноним 10/12/20 Чтв 01:00:53 187706245
>>1877058
>такие вещи касательно выравнивания как-то описываются в стандарте языка?

va_arg должен понимать выравнивание и он платформо и системо зависим. Но видя какое выравнивание тут постят троллят вестимо, лучше всегда смотреть что сгенерировал компилятор, когда выравнивание критично.
Аноним 10/12/20 Чтв 01:12:34 187707046
>>1877056
А какая разница? Язык это язык, компилятор это компилятор.
Аноним 10/12/20 Чтв 01:34:45 187708347
>>1877060
>Наверняка в памяти каждое из них будет в границах 4-х байт.
Да, так и вышло. Если добавить еще три чара, то адреса будут:
41 - char
40 - char
39 - char
38 - char
34 - int (с 34-го по 37-й байт -- 4 байта)
То есть фрагменты действительно по 4 байта, если объявлять char компилятор ставит его в самый последний байт фрагмента. Т.е., фрагмент в 4 байта заполняется от начала к концу.
>Хотя... с другой стороны, если приведёшь неыровненный указатель к указателю на int, то получится чушь. Странно. Но проверять лениво.
Почему чушь? Указатель же может в любой адрес указывать. Тип, на который он указывает, нужен лишь для адресной арифметики.
Аноним 10/12/20 Чтв 01:41:01 187708548
изображение.png 39Кб, 1062x582
1062x582
>>1876309
Выравнивают структуры.
Зачем одинокую переменную выравнивать? Нету смысла.
Более того, есть команды во всяких армах/riscv которые могут делать load/store для байтных значений. По твоей логике выходит если у процессора машинное слово это 4 байта, то он с другими типами не должен иметь возможности работать и нужно городить костыли?
На пикриле можешь увидеть как компилятор спокойно кладет по адресу SP + 31 значение char командой strb. И ничего плохого не случается.
Аноним 10/12/20 Чтв 01:53:14 187709049
>>1877085
>Выравнивают структуры.
Так а в чем смысл применять выравнивание к структуре?
Аноним 10/12/20 Чтв 02:58:10 187710650
Пытаюсь написать трубу 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);
}
}
10/12/20 Чтв 08:39:01 187715051
>>1877034
Переформулируй вопрос. На пике все объекты выравнены (остаток от деления адреса на размер = 0)
Аноним 10/12/20 Чтв 21:42:27 187763652
>>1877106
>dup2(g[0], 0);
dup2(desc[0], 0)
фикс
10/12/20 Чтв 22:47:40 187771053
Аноним 11/12/20 Птн 12:53:04 187797054
VirtualBoxdeb92[...].png 143Кб, 1024x768
1024x768
Ядерные хакеры здесь? извольте ревьюить: 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
Аноним 11/12/20 Птн 13:15:32 187799155
>>1877970
Нахуя крестовый коммент.
Аноним 11/12/20 Птн 13:19:08 187799356
>>1877970
>, without this patch, freeze the OS for minutes
Linux kernel. 29 years gone.
Are you serious?
Аноним 11/12/20 Птн 13:19:29 187799457
>>1877991
Где?

более ценные замечания есть? какие-то явные ошибки логики?
Аноним 11/12/20 Птн 13:20:23 187799658
>>1877993
Да. В ридми ссылки в конце. КАк раз этот патч исправляет корень проблемы.
Аноним 11/12/20 Птн 13:22:20 187800159
>>1877996
Ну да, теперь "замерзает" ни на минуты, а "всего-лишь" на одну секунду. Это не пиздец ли?
Аноним 11/12/20 Птн 13:24:09 187800360
VirtualBoxdeb92[...].png 90Кб, 1024x768
1024x768
>>1878001
нет никакой секунды как правило, все мгновенно
Аноним 11/12/20 Птн 13:32:48 187801261
>>1878003
Патч посмотрел. Почему именно 250 Мб?
Отпишешь сюда что Торвальдс скажет. Или мэйнтенейр. Интересно же.
Аноним 11/12/20 Птн 13:33:30 187801362
>>1878003
Ты даже свап сделал 2xRAM, ути.
Сколько тебе лет?
Аноним 11/12/20 Птн 13:34:19 187801663
>>1878013
>Ты даже свап сделал 2xRAM, ути.
Это проблема?

32 годика
Аноним 11/12/20 Птн 13:35:35 187801864
>>1878012
>Почему именно 250 Мб?

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

Читай ридми внимательно - патч создал анон и исчез\. Я воссоздал его труды.
Аноним 11/12/20 Птн 13:51:15 187803465
>>1878012
Потому что это реально хороший порог. В федора 33 демон uresourced резервирует 250м для DE.
Аноним 11/12/20 Птн 21:30:56 187840966
сап, глупый вопрос. Учусь в ПТУ на 09 02 03. Основной язык программирования у нас Си , а также параллельно Js c php и SQL. Таки вот это рассчитано лишь на 1 год обучения. Что будет ждать меня на следующем курсе? Неужели C++ или C#. Или продолжим зубрежку? Поделитесь опытом с зеленым, как у вас проходило обучение в ПТУ.нет, программы на следующий год нету, только 1 год существует в моей мухосране ПТУ где обучают программированию(конкретно на базе 11 класса) Не бейте плиз, просто ответьте.
Аноним 11/12/20 Птн 22:03:36 187843767
>>1878409
Запомни, учишься ты сам. А пту/универ/остальная шарага нудны чтобы подтянуть слегка уровень в общем развитии и найти людей с такими же взглядами как ты.
Без разницы что дальше изучаешь.
Можешь вообще хоть забить, не ходить туда. Главное самостоятельно обучаться.
Аноним 11/12/20 Птн 23:43:57 187849868
>>1878437
Я так и делаюмои бивисы некоторые еще до массивов не дошли, лол, но просто интересно, что ждет дальше? Какой язык программирования будет, или последующая зубрешка си'шки и js. Просто хочу знать и да, и смешно слушать про саморазвитие и т.п в си треде, лол.
Аноним 12/12/20 Суб 04:23:52 187859869
>>1878409
план обучения ищи на сайте своей шараги
Аноним 12/12/20 Суб 04:55:21 187859970
>>1878437
>Запомни, учишься ты сам.
Да.
>А пту/универ/остальная шарага нудны чтобы подтянуть слегка уровень в общем развитии и найти людей с такими же взглядами как ты.
Лолнет. Учебки не учат, а калечат. Это такой фильтр/экзамен на "взрослую жизнь", принуждающий делать всякое бессмысленное говно уровня копать от забора и до обеда "потому что важный начальник (здесь препод) скозал нада" молча повинуясь, и заодно вертеться в обществе, выкручиваясь с оценачками и прочей поебалой, чтобы не делать всё как честный дурак и не сдохнуть от стресса в результате. В итоге выходят годные члены общества - рабочие мураввьи, без мозга, но исполнительные и умеющие в коллектив, где можно - откосить, кому нужно - подсосать, и так далее. Вот что учат все эти учебки.
Аноним 12/12/20 Суб 07:07:39 187861171
Ладна, какой-то тред обиженнок собрался
Аноним 12/12/20 Суб 08:27:54 187861672
>>1878599
Высер душевно больного школьника который не осилил пту?
Аноним 12/12/20 Суб 08:43:08 187861873
>>1878599
Все так, а это что, плохо?
Аноним 13/12/20 Вск 00:41:53 187905074
stack.png 17Кб, 854x582
854x582
ida-code.png 15Кб, 285x466
285x466
c-code.PNG 8Кб, 370x288
370x288
>>1873113 (OP)
Сап байтоебач. Дублирую пост с C++ треда. >>1879047 →
Есть функция на Си и ее интерпретация на асме, пик тотали рилейтед.
Казалось бы, компилятор должен выделить 16 байт под буфер и 4 байта под флаг, и тогда стек должен выглядеть как на рисунке 1, но нет, он выглядит как на рисунке 2. А именно -- флаг, 12 байт непонятной хуйни, 16 байт буфера, 8 байт указатель (типа в регистре он их оставлять не хотел) и еще 8 байт выделенных хуй знает зачем. Больше всего меня беспокоят 12 байт между флагом и буфером, т.к. от этого зависит, как будет работать эксплойт через переполнение буфера.
Через компилер эксплорер код прогнал, гцц и клэнг выдают примерно то же самое. Пока что нагуглить смог только canary value, но не уверен, что это оно.
Аноним 13/12/20 Вск 01:30:19 187906575
>>1879050
Портфель собирай, хакерман это паддинг
Аноним 13/12/20 Вск 03:34:22 187910476
>>1879050
>Казалось бы, компилятор должен выделить 16 байт под буфер и 4 байта под флаг,
размер слова в стеке равен разрядности процессора.

Ассемберный код не соответствует картинке с исходником.
Аноним 13/12/20 Вск 11:01:37 187918877
Я не понимаю, почему нельзя избавить стандарт 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 отдельно. Неужели, эта проблема не решается?
Аноним 13/12/20 Вск 11:19:35 187919278
ida-codeB.PNG 16Кб, 256x449
256x449
stackB.png 61Кб, 1657x702
1657x702
>>1879065
>это паддинг
Понял, спасибо. Забыл сказать, что компилировалось скорее всего с флагом -fno-stack-protector. Нагуглил, что gcc выравнивает стек по 16 байт. Т.е. там получается как на картинке пикрилейтед слева? Почему он не может сделать как второй вариант? Гцц без флагов оптимизации просто в тупую выделяет переменные по одной и каждый раз делает алигнмент, вместо того, чтобы выделить сразу все и сделать алигнмент для всех? Второй вариант расценивается уже как оптимизация?
Олсо, попробовал флаг mpreferred-stack-boundary=3, я думал, что он выдаст третий вариант, но раздутый пэддинг никуда не пропал, как будто гцц вспомнил, что стэк баундари равно 3 только когда отнял из rsp 40 байт.
>>1879104
>размер слова в стеке равен разрядности процессора.
Так тут все равно лишнее место получается, даже если выравнивалось по 8 байт.
>Ассемберный код не соответствует картинке с исходником.
Не понимаю, о чем ты, compiler explorer почти идентичную залупу выдает.
https://godbolt.org/z/nTqYen
Аноним 13/12/20 Вск 11:20:41 187919379
>>1879192
На второй картинке ошибка в четвертом варианте, там последнего пэда нет, ну вы поняли в общем.
Аноним 13/12/20 Вск 13:33:32 187925080
>>1879192
С -O3 вообще переменной flag нету, просто в аккумуляторе значение и сразу возврат.
Аноним 13/12/20 Вск 14:21:38 187927581
нужно получить сертификат на sololearn по С курсу,но я не знаю английский и не хочу вникать в суть так как мне это не очень нужно.Вопрос???? где найти готовые ответы или может есть другие варианты
Аноним 13/12/20 Вск 14:24:02 187927682
Стикер 0Кб, 512x512
512x512
Аноним 13/12/20 Вск 14:26:13 187927883
>>1879276
Ответ отрицательный,еще варианты?
Как пофиксить? Аноним 13/12/20 Вск 14:35:38 187928584
subj.PNG 46Кб, 1296x1000
1296x1000
Аноним 13/12/20 Вск 14:41:55 187928885
>>1879285
Либо перестаешь пользоваться scanf и переходишь на какой нибудь fgets
Либо затыкаешь варнинг, задав #define _CRT_SECURE_NO_WARNINGS как там написано
Аноним 13/12/20 Вск 14:44:48 187929386
>>1879285
А, ну что касается первого ворнинга, scanf возвращает количество распарсеннгого, то есть ты можешь обрабатывать ошибки
int read_x = 0;
do {
read_x = scanf("%f", &x);
if(read_x == 0) printf("ошибка ввода бла бла");
} while (readx == 0 && ready == 0);
Аноним 13/12/20 Вск 14:58:40 187930387
>>1879285
scanf_s (если ругает ко всей хуйня добать _s) и будет робить
Аноним 13/12/20 Вск 14:59:53 187930588
13/12/20 Вск 15:05:56 187931289
>>1879285
Поменяй компилятор или подкрути, чтобы были ПРЕДУПРЕЖДЕНИЯ, а не ШУМ.
Аноним 13/12/20 Вск 15:09:07 187931790
>>1879285
и зачем тебе булевская библиотека в таком примере?
Аноним 13/12/20 Вск 15:14:58 187932291
>>1879317
что такое булевская библиотека?
Аноним 13/12/20 Вск 15:17:38 187932592
Аноним 13/12/20 Вск 15:47:38 187933893
>>1879192
>Не понимаю, о чем ты, compiler explorer почти идентичную залупу выдает.

var_4 откуда взялась?
Аноним 13/12/20 Вск 15:48:38 187933994
>>1879278
Учи английский. Без него тебе только в 1С программировать придётся.
Аноним 13/12/20 Вск 16:07:54 187934595
>>1879250
Получается так.
>>1879338
Это flag, я не весь код скинул, а только фрагмент, который меня интересует, дальше там условные переходы.
Без -fno-stack-protector кстати там реально будет лишняя переменная, видимо защищающая стек от повреждения.
Аноним 13/12/20 Вск 16:34:39 187935796
>>1879325
так нахуя тут проверка? Явно человек учиться и до циклов не дошел, а ты его грузишь лишней инфой. Да и проверка на дурака нахер тут не нужна в реалиях.
Аноним 13/12/20 Вск 17:35:18 187938697
>>1879357
Он спросил что у него за ворнинг. Там прямым текстом написано что программист игнорирует возращаемое значение. Я написал зачем эта функция что-то возвращает.
Аноним 13/12/20 Вск 19:02:59 187946298
>>1879386
Стандартный варнинг в vs19, если не написать _s в конце scanf. Держу в курсе. Эта хуита и так будет работать, без проверки
на дурака.
Аноним 13/12/20 Вск 20:36:13 187955899
image.png 516Кб, 699x628
699x628
>>1873113 (OP)
ЯННП. Объясните пж.
Вот у меня есть файл yoba.c. К нему я инклюжу yoba.h.
Так вот, в файле yoba.c у меня было несколько переменных и функций с идентефекатором static и все компилится/билдится. И я часть из них перенес в файл yoba.h и прога все равно компилтся без ошибок.
Но какого хуя? Ведь идентефикатор static делает видимость только в пределах одного файла, почему тогда функции и переменные, обозначенные в файле yoba.h видны в файле yoba.c????
13/12/20 Вск 22:07:51 1879624100
>>1879558
> одного файла
Объектного
Аноним 13/12/20 Вск 22:38:36 1879671101
>>1873113 (OP)
Няшки подскажите, на сколько рекурсия отсасывает в производительности? У меня есть рекурсивная функция, четкая и красива, а вот переписать ее это получается ебаный нечитаемый ад.
Аноним 13/12/20 Вск 22:43:16 1879675102
Как записать переменную в файл в big endian?
Аноним 13/12/20 Вск 22:55:22 1879691103
>>1879675
Напиши лучше функцию, которая будет делать биты в твоей переменной наоборот.
Аноним 13/12/20 Вск 23:13:56 1879712104
изображение.png 4Кб, 524x183
524x183
13/12/20 Вск 23:21:36 1879727105
Аноним 13/12/20 Вск 23:22:55 1879730106
>>1879727
Что бы измерить, нужно переписать в нерекурсию, а это пиздец
Аноним 13/12/20 Вск 23:45:53 1879765107
>>1879730
Сравни количество слов, сохраняемых на стеке с тем, сколько будешь сохранять после переписывания. Есть разница в разы?
А глубина рекурсии какая?
Аноним 13/12/20 Вск 23:49:03 1879768108
>>1879765
>А глубина рекурсии какая?
Не более 5
>сколько будешь сохранять после переписывания
Я там сам стек заводил пихал туда состояния и я ебанулся за ним следить, код превратился в нечитаемое говно и мой мозг поломался
Аноним 13/12/20 Вск 23:58:35 1879780109
>>1879768
> 5
Это хорошо, возвраты будут предсказываться. Оставь как есть.
Аноним 14/12/20 Пнд 00:55:43 1879842110
>>1879671
Лол, как это вообще возможно? Все итеративные алгоритмы в разы проще и понятней.
Аноним 14/12/20 Пнд 01:50:50 1879930111
>>1879671
>на сколько рекурсия отсасывает в производительности?
С чего бы это? Если не гоняешь по стеку большое количество аргументов функции, то рекурсия вполне хороша.

Ну а так считай сам - на первом входе будут Page Faults при росте стека. Но дальше эта память твоя и просадки по скорости не будет.
Аноним 14/12/20 Пнд 11:43:43 1880106112
7z - test.7z.png 7Кб, 80x80
80x80
Си для программ[...].png 2842Кб, 300x420
300x420
test
Аноним 14/12/20 Пнд 20:44:47 1880561113
>>1879842
>Все итеративные алгоритмы в разы проще и понятней.
Чигобля? Даже школьный фибоначчи легче в рекурсивном виде.
Аноним 14/12/20 Пнд 20:45:49 1880562114
>>1879930
>С чего бы это?
Там же вроде при вызове функции контекст сохраняется?
Аноним 14/12/20 Пнд 23:04:45 1880701115
Чего бы интересного забабахать на Си?
Аноним 14/12/20 Пнд 23:09:24 1880707116
>>1880562
Точно, ещё и локальные переменные к аргументам добавляются.
Но всё равно стек "дрочится" только единожды. Дальше виртуальные страницы стека уже отображены процессу и всё быстро работает.
Аноним 14/12/20 Пнд 23:11:36 1880709117
>>1880701
Виртуальную машину. Не полностью, а просто выполнение инструкций. Без прерываний, без видео и любой периферии - просто виртуальную машину, чтобы умела по шагам выполняться и показыват текущее значение регистров, верхушки стека и по желанию дамп памяти.
Аноним 14/12/20 Пнд 23:35:18 1880733118
sshot-2020-04-2[...].png 31Кб, 789x557
789x557
>>1880701
Поиск и извлечение всех webp-файлов из произвольного контейнера, используя небольшой буфер, 64 Кб, например.
Аноним 15/12/20 Втр 00:52:47 1880788119
>>1880561
Лолчто? Итеративный фибоначчи занимает пару строк
int sum = 1;
while (n > 1) {
sum *= n;
n--;
}
Аноним 15/12/20 Втр 00:59:47 1880794120
>>1880788
Иы хуйню написал, школьник
Аноним 15/12/20 Втр 01:03:19 1880796121
>>1880794
Иди стек прокручивай, неуч.
Аноним 15/12/20 Втр 01:07:26 1880798122
>>1880794
Ой всё.
int x = 0, y = 1, z = 1;
for (int i = 0; i < n; i++) {
x = y;
y = z;
z = x + y;
}
Аноним 15/12/20 Втр 01:18:50 1880808123
>>1880798
И ты обосрался снова
Аноним 15/12/20 Втр 01:37:55 1880815124
Аноним 15/12/20 Втр 01:45:43 1880818125
Аноним 15/12/20 Втр 01:58:28 1880827126
>>1880818
По делу есть что? То что у зумеров считают с нуля меня не интересует.
Аноним 15/12/20 Втр 02:06:43 1880832127
>>1880827
Ну конечно, у тебя сразу с двух, лол
Аноним 15/12/20 Втр 18:01:58 1881265128
Срочно нужен разбирающийся человек, чтобы помочь лабы доделать.
лабы первого курса
Аноним 15/12/20 Втр 18:22:03 1881269129
Аноним 15/12/20 Втр 18:26:21 1881271130
Аноним 15/12/20 Втр 18:46:04 1881285131
>>1881271
Пошёл нахуй. И не возвращайся.
Аноним 15/12/20 Втр 18:50:37 1881296132
>>1881285
ты агрессивный какой-то, родители в детстве много били?
Аноним 15/12/20 Втр 20:05:21 1881377133
Аноним 15/12/20 Втр 20:43:28 1881395134
>>1881377
Прочитал, там нет ничего, что позволило бы анону выше послать меня
Аноним 15/12/20 Втр 21:56:24 1881443135
>>1881395
Напомни, зачем тебе помогать бесплатно да еще и срочно?
Аноним 15/12/20 Втр 23:01:23 1881512136
>>1881395
Лабы нахуй, это стандарт борды.
Аноним 16/12/20 Срд 01:04:37 1881591137
>>1881443
Возможно тебе будет интересно, порешать простые задачки, поотвечать на нелепые вопросы начинающего в этом деле. Там не очень много
Аноним 16/12/20 Срд 06:20:47 1881634138
>>1881591
Нет, это не интересно
Аноним 16/12/20 Срд 16:23:17 1881981139
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 допускает применение нескольких спецификаторов через пробел.
Аноним 16/12/20 Срд 16:38:06 1881992140
Аноним 16/12/20 Срд 16:40:10 1881995141
>>1881992
Я реально не понимаю. Я только-только осваиваю
Аноним 16/12/20 Срд 16:41:41 1881997142
>>1881995
Сколько спецификаторов столько и указателей в аргументах scanf должно быть.
Аноним 16/12/20 Срд 16:42:20 1881998143
Аноним 16/12/20 Срд 16:44:50 1882001144
>>1881997
>>1881998
Спасибо. На счёт целочисленных массивов прата не уточнял. Хотя вроде подобное на строке сработало и там я индексов не вводил.
Аноним 16/12/20 Срд 21:25:00 1882155145
Собираю модуль ядра, большую часть исходников kbuild собирает сам, но некоторые мне нужно собирать самому в особом виде, а потом подкладывать объектники просто. Типа filename.o_shipped

Но вот проблема, kbuild хочет .cmd файлы иметь для всех объектников. Якобы, чтоб как-то проверять что-то связанное с необходимостью пересборки.
И он их сам генерит, если сишники сам собирает.
Но для готовых объектников не генерит.
Я воткнул везде touch .object_file_name.o.cmd - помогло. Но это вроде как костыль. Знает кто?
Аноним 16/12/20 Срд 21:58:31 1882180146
Приветствую. Как написать прокси-сервер для игры на Winsock2? Обязательно ли ставить ловушку на функцию connect или можно как-то из ловушки WSASend / WSARecv передавать данные на мой сокет а потом с него уже на клиент / сервер? Помогите пожалуйста.
Аноним 16/12/20 Срд 22:52:57 1882234147
>>1882155
Enjoy your сборка проприетарного модуля с блобами.
Аноним 16/12/20 Срд 23:42:34 1882256148
>>1882234
Так-то необязательно проприетарного. Там асмовые исходники собираются отдельным ассемблером.
Аноним 17/12/20 Чтв 03:04:34 1882356149
>>1882256
Тогда почему не добавить его нормально в систему сборки ядра? Вроде как модули на ассемблере в линуксах тоже есть.
Аноним 17/12/20 Чтв 08:39:49 1882432150
>>1882155
> Когда лень писать Makefile
Аноним 17/12/20 Чтв 14:46:14 1882729151
image.png 29Кб, 740x345
740x345
image.png 30Кб, 719x337
719x337
image.png 12Кб, 498x114
498x114
Почему пикрил 1 код работает как надо, а пикрил 2 выдает ошибку пикрил 3? Ведь по сути они делают одно и то же, какая разница, передать указатель и разыменовать его, или передать структуру?
(Про -> знаю, записал именно так для наглядности)
Аноним 17/12/20 Чтв 14:51:13 1882734152
>>1882729
в строках из ошибки присваивание элементу s.data значения и распечатывание соответственно.
Аноним 17/12/20 Чтв 14:53:25 1882736153
>>1882432
В смысле лень?
Это всё в мейкфайле
Аноним 17/12/20 Чтв 15:54:42 1882777154
>>1882729
Потому что во втором случае создается копию структуру и инициализируется. Изначальный объект, который в main, при этом остаётся неинициализированным.
Аноним 17/12/20 Чтв 16:18:33 1882785155
>>1882777
> Потому что во втором случае создается копию структуру и инициализируется. Изначальный объект, который в main, при этом остаётся неинициализированным.
Не понял. Как инициализация зависит от вызова функции где-то дальше по программе?
Аноним 17/12/20 Чтв 16:20:39 1882787156
>>1882785
Ты вызываешь InitStack, где полям структуры присваивается значения, в том числе происходит аллокация памяти.
После выхода из функции копия структуры уничтожается (а память утекает).

struct stack s остаётся дефолтным, с не инициализированными полями, без аллоцированной памяти.
Аноним 17/12/20 Чтв 16:24:40 1882791157
>>1882787
А лол, понял, спс большое.
Аноним 17/12/20 Чтв 19:41:20 1882983158
image.png 111Кб, 500x483
500x483
Аноним 17/12/20 Чтв 23:23:40 1883121159
Кто-нибудь может пояснить за conversion specifier %g? Как я понимаю он сравнивает результаты %e и %f и выдает наиболее короткий. Только можно ли к нему применять аргументы в стиле %5.2g? У меня фигня какая-то выходит на этом моменте.
Аноним 17/12/20 Чтв 23:41:03 1883127160
>>1881981
#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");
}

Жду советов олдфагов как можно сделать лучше, потому что в С новичок.
Аноним 17/12/20 Чтв 23:43:53 1883132161
>>1883127
Ой, блять

#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");
}

Пропустил
Аноним 17/12/20 Чтв 23:44:25 1883134162
>>1883127
>>1883132
Лол макаба двойные скобки кушает, ну ладно
Аноним 18/12/20 Птн 00:36:34 1883165163
>>1883127
Если ты о задаче из Праты то тебе надо просто распечатаь масив в обратном порядк, не нужно отдельный создавать.
Аноним 18/12/20 Птн 00:45:06 1883182164
>>1882155
В общем, никто не знает.
Анлаки.
Аноним 18/12/20 Птн 09:07:22 1883289165
>>1882785
В параметрах функций всегда передается не то, что ты в них пишешь, а делается его копия и уже эта копия отправляется в параметр. Таким образом, функция получает копии, а исходная сущность всегда остается неизменной.
То есть, если ты отправляешь константу, создается переменная (параметр) с этим значением. Если отправляешь переменную, создается копия этой переменной. И не важно какой тип. Если переменная int, создается новая переменна int, если указатель, создается новая переменная указатель, если структура, создается новая структура. Параметры функций (переменные-копии) существуют пока работает функция, когда функция завершается, они естественно уничтожаются.

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

И возвращаясь к началу, в крестах таки можно передавать в параметр саму сущность, а не копию, для этого там есть ссылки. Но в си ссылок нет, тут для изменения исходной сущности передают указатель на неё.
Аноним 18/12/20 Птн 14:41:53 1883470166
пацаны, я новичок в си и у меня появилась проблема: при вводе через scanf буквы(задумана цифра) начинается бесконечный вывод printf'a, как с этим бороться?
Аноним 18/12/20 Птн 16:05:00 1883620167
Привет анончики. Есть задачка, нужно создать прогу которая будет подставлять слова в конец файла, задача в том чтобы создать нумерацию добавленных слов по порядку и при повторном заходе в программу нужно чтобы порядок возобновлялся с того же места
1 слово
2 слово
3 слово

Я так понял использовать нужно бинарный формат, я создал отдельный файл для этого в бинарной форме, через fwrite вставил туда переменную которая сохраняется каждый раз при закрытий программы, т. е задача решена.
Но я хотел бы поинтересоваться, могу ли я использовать один файл для сохранения этой переменной не создавая второй? И как это сделать?
Открыть этот же файл в текстовой форме и присвоить на один указатель на файл, а бинарную форму на второй указатель?
Аноним 18/12/20 Птн 17:38:46 1883738168
sshot-2020-12-1[...].png 11Кб, 475x246
475x246
Аноним 18/12/20 Птн 17:43:03 1883746169
>>1873113 (OP)
Реквестирую курс по с/с++, где объясняется оформление исполняемого файла и добавление встроенный или

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

библиотек. Можно в виде статьи.
Аноним 18/12/20 Птн 17:48:00 1883754170
>>1883470
Scanf не занимается выводом
>>1883620
Как тебе пришла в голову светлая мысль про бинарный.формат?
>>1883738
И какой по твоему должен быть sizeof обычного указателя?
Аноним 18/12/20 Птн 17:49:04 1883756171
>>1883746
Язык не специфицирует форматы экзешников. Смотри в доках на свою ОС
Аноним 18/12/20 Птн 17:55:47 1883763172
>>1883754
>И какой по твоему должен быть sizeof обычного указателя?
Такой же как у int

Почему тогда a не 4? Он жи есть указатель на первый элемент массива.
Аноним 18/12/20 Птн 17:57:32 1883767173
>>1883620
чел это в cmd exe делаеться
Аноним 18/12/20 Птн 18:12:55 1883787174
>>1883763
а объявлен как массив, ь как указатель.
Аноним 18/12/20 Птн 18:23:17 1883795175
>>1883763
> Такой же как у int
Нет. Язык такого не гарантирует
Аноним 18/12/20 Птн 18:30:22 1883803176
>>1883754
Ну типа, fwrite пишет в бинарном формате в файл переменные.
>>1883767
На линуксе?
Аноним 18/12/20 Птн 18:32:43 1883809177
>>1883803
те кто на линуксе такое не спрашивают
Аноним 18/12/20 Птн 18:33:34 1883812178
Аноним 18/12/20 Птн 18:34:35 1883816179
>>1883809
Аргументы будут ааа бля на дваче же сидим
Аноним 18/12/20 Птн 18:35:57 1883820180
Аноним 18/12/20 Птн 18:39:25 1883824181
>>1883812
>>1883816
потому что если не пердолишь то нет смысла сидеть на хуевой кастрированной глючной версии винды когда есть собственно винда
а раз пердолишь то и такие базовые вещи умеешь
Аноним 18/12/20 Птн 18:42:31 1883831182
>>1883824
Я не понимаю тебя. Причем тут ОС и доступ к файлам через язык программирования? Ты о чем вообще? Я учусь. Мне нужно через stdlib создать файл в который будут добавляться слова после ввода и печатать в каком порядке были добавлены слова.
Аноним 18/12/20 Птн 18:44:47 1883836183
Аноним 18/12/20 Птн 18:57:01 1883847184
Аноним 18/12/20 Птн 19:09:29 1883852185
>>1883820
Значит ты пишешь на каком то другом языке, возможно на яваскрипте.
Аноним 18/12/20 Птн 19:12:56 1883856186
>>1883803
Ну ты скорее всего не понял задачу, спроси у учителя.
Очевидно что ты можешь просто прочитать файл по одной строке и сосчитать таким образом их количество.
Или ты можешь прочитать последнюю строку и распарсить число которое у нее в начале.
Аноним 18/12/20 Птн 20:44:38 1883979187
>>1883856
Ага, уже сообразил. Проще было посчитать количество строк. А вообще как это работает с fprintf, fwrite? Если юзаешь fprintf то пишешь в текстовый режим текст, а fwrite или fwrite то только в бинарном сохраняешь данные правильно? Т.е я не смогу достать переменную сохраненную в текстовом режиме?
Аноним 18/12/20 Птн 20:45:47 1883981188
В пизду пойду по новой читать главу и эти моменты. А может мне просто хуево объясняют, но я беру на заметку что я дибил.
Аноним 18/12/20 Птн 20:54:01 1883993189
>>1883127
#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);
}
Тоже новичек, но в пту так учили
Аноним 18/12/20 Птн 20:56:43 1883998190
>>1883993
#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);
}обосрався
Аноним 18/12/20 Птн 21:32:34 1884025191
>>1879558
.h это заголовочный файл, если ты включил заголовочный файл в .c файл то он исчезает при комплияций и становится единым целым с исходным файлом, по крайней мере так видит это компилятор. Если ты используешь static в заголовочном файле, то ты не напрямую получаешь инфу, а копируешь. Если бы ты использовал static в другом исходном файле и пытался получить доступ с другого, компилятор бы тебя не понял, потому что для него это слепая зона.
Аноним 18/12/20 Птн 21:38:27 1884031192
>>1883998
Пиздец даунов делают в пту, соболезную.
Аноним 18/12/20 Птн 21:41:43 1884038193
>>1883998
Не слушай пидоров с пту, развивайся сам а? Я смотрю на этот код и мне хочется блевать.
Аноним 18/12/20 Птн 21:45:04 1884042194
>>1884038
>>1884031
Ебать, ну давай , предложи свое решение. Я посмотрю поучусь
Аноним 18/12/20 Птн 21:49:59 1884047195
>>1884038
Ну так предложи свое решение, все такие умные, а как просишь показать так сразу по сьебам.
Аноним 18/12/20 Птн 22:58:53 1884165196
Зашел в этот тред случайно. Никогда не писал на C, но накидал тут что-то.
>>1883998
>>1883127
Нахуя создавать 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;
}


Аноним 18/12/20 Птн 23:00:26 1884173197
Аноним 19/12/20 Суб 00:04:17 1884217198
>>1883998
#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();
}
Аноним 19/12/20 Суб 07:41:29 1884347199
>>1884217
А ты умен сука. Жаль что рекурсия бесполезна.
Аноним 19/12/20 Суб 07:42:26 1884348200
>>1884165
Я изначально так решал когда то. Интересно если им дать написать алгоритм сортировки че будет?
Аноним 19/12/20 Суб 08:40:25 1884357201
Нихуя не понимаю. Почему я не могу записать бинарные данные в текстовый формат? В один файл? Я использую fprintf, чтобы вписать строки в файл, если я напишу бинарную переменную через fprintf, я смогу ее сохранить в бинарном формате потому через fwrite? Потому что когда я пытаюсь так сделать, она становится мусором по какой то причине.
Аноним 19/12/20 Суб 08:42:32 1884358202
>>1884357
>бинарные данные в текстовый формат
Это как?
Аноним 19/12/20 Суб 08:48:09 1884359203
>>1884358
Ну переменные в бинарном формате, т.е они сохраняются так как компьютер их видит. Есть текстовый формат, в котором сохраняется только текст, а есть бинарный в котором может сохраняться и текст и переменные но в бинарном виде.
Аноним 19/12/20 Суб 08:49:22 1884360204
>>1884358
Короче могу ли я сохранить переменные в текстовом файле, вот в чем вопрос. Можно же как то раз предполагается, пишут что в текстовом файле можно сохранять бинарные данные.
Аноним 19/12/20 Суб 09:18:30 1884366205
>>1884360
>>1884359
Нет текстового и бинарного формата, все хранится в бинарном, просто твой текстовый редактор будет отображать бинарные данные говном, юзай hex-editor.
Аноним 19/12/20 Суб 10:00:23 1884374206
yoba.png 5Кб, 129x129
129x129
>>1884366
> Нет текстового и бинарного формата, все хранится в бинарном
Но есть флажок b для fopen. Ой...
Аноним 19/12/20 Суб 11:26:59 1884405207
>>1884374
Это режим, а не формат.
Аноним 19/12/20 Суб 11:30:10 1884406208
>>1884360
Что тебе мешает сохранить переменную текстом?
Что по твоему случится с переменной в бинарном виде, если твой текстовый файл откроют блокнотом, поменяют пару строчек, а потом сохранят?
Аноним 19/12/20 Суб 11:38:32 1884409209
>>1884405
Спасибо. Я снова прочитал различия, в юниксе их нет для файла оказывается. Но вот почему когда я пытаюсь вытащить переменную из текстового файла, при этом сохраняя её через fwrite, выходит мусор при использований этой переменной типа -123123123123123123? Влияет ли на это использование fscanf и fprintf?
Аноним 19/12/20 Суб 11:41:43 1884410210
>>1884406
Ну смотри, мне нужно достать из файла эту переменную потом, нужно писать функцию которая будет искать внутри текста это число, потом конвертировать его через atoi? Аааа ничего не понимаю.
Кто нибудь подскажите я смогу посмотреть через дебагер что творится внутри программы в плане просмотра содержимого буфера итд?
Аноним 19/12/20 Суб 12:22:19 1884418211
Аноним 19/12/20 Суб 13:41:59 1884453212
Про мейкфайл не нашёл лучшей ветки спросить:
В моём мейкфайле есть куча одинаковых команд, с разными таргет/пререквизтами
Application.o: Core/Application.cpp
$(CXX) $< -c $(INCLUDES) -o $@
Log.o: Logger/Log.cpp
$(CXX) $< -c $(INCLUDES) -o $@

Как записать это в одно правило? Везде пишут %.o: %.cpp, но мне не нужно для всех целей, а только для определённых, плюс непонятно, как dirname отбросить для таргета.
Аноним 19/12/20 Суб 13:46:57 1884460213
>>1884410
Fprintf - fscanf
Fread - fwrite
Понял?
Аноним 19/12/20 Суб 13:59:56 1884481214
>>1884217
как это работает, объясни плиз.
Аноним 19/12/20 Суб 14:05:14 1884491215
Xsq-l3hWV7c.jpg 135Кб, 635x825
635x825
Няши, как научиться красиво писать код? Основы знаю, но вот писать красиво код не могу. Как научиться? рандомпик
Аноним 19/12/20 Суб 14:14:08 1884505216
Где есть какой-нибудь быстрый гайд по Си? Есть одна библиотека, но так как в елиспе нельзя подключать Си библиотеки, решил написать на программу на Си и вызывать её из елиспа.
Аноним 19/12/20 Суб 14:19:08 1884512217
>>1884505
Есть, в хорошей книжке Кернигана и Ричи - первая глава. Книжка в шапке первым пунктом.
Аноним 19/12/20 Суб 14:21:47 1884516218
Аноним 19/12/20 Суб 14:52:39 1884556219
>>1884505
>елисп
Дедуль, 2021 на носу.
Аноним 19/12/20 Суб 14:54:55 1884558220
>>1884481
Рекурсия на стеке.
Представь себе колоду карточек
Ты пытаешься считать число и если получилось, то записываешь его на карточку в поле n
Когда числа закончились, ты начинаешь выводить записанное на верхней карточке n, а потом скидываешь эту карточку открывая ту что под ней.
Аноним 19/12/20 Суб 15:16:47 1884588221
>>1884491
Читай хороший код (ядро bsd очень чистенько выглядит).
Аноним 19/12/20 Суб 15:57:20 1884614222
>>1884491
Для начала определись что такое красивый код, когда выведешь формальные критерии - их и придерживайся.
Вообще C маловыразительный язык, поэтому красоты в нем мало.
Аноним 19/12/20 Суб 16:03:17 1884619223
>>1884516
>char гарантированно имеет длину 1 байта
Забыли упомянуть только, что C-байт может быть не 8 бит.
Аноним 19/12/20 Суб 16:07:07 1884621224
>>1884491
Есть же книжки на тему, так и называются, серия "Чистый код" Мартина, "Совершенный код" Маконнела.
Аноним 19/12/20 Суб 16:15:15 1884630225
1458234767062.jpg 9Кб, 195x259
195x259
>>1884621
*МакКоннела, конечно.
Аноним 19/12/20 Суб 18:12:55 1884749226
>>1884460
Вопрос в другом. Влияют ли они как то друг на друга? Может ли fwrite переписать данные fprintf и наоборот?
Аноним 19/12/20 Суб 18:13:11 1884751227
Аноним 19/12/20 Суб 19:51:33 1884835228
Почему в сишечку ни в каких новых стандартах не хотят ввести деструкторы в каком-нибудь виде? Да хоть слизнуть у конкретного комипилтора.
Там же есть всякие директивы компиляторам. Почему не ввести еще одну типа destructor, что когда ее объявляешь для какого-то типа (а у нас он будет один - это пользовательсая структура), то вызовется эта данная функция.
Т.е. будет что-то вида
destructor my_struct f() { // что-то делаем }
Аноним 19/12/20 Суб 19:58:41 1884840229
>>1884835
upd:
это же по сути никак не изменит язык, не переусложнит его. Он же и сейчас отслеживает, когда структура выходит из области видимости и выкидывает ее, а так просто при создании ассемблерного выхлопа перед этим освобождением бы всовывал имеющуюся деструктурную функцию.
Аноним 19/12/20 Суб 20:00:34 1884842230
>>1884835
Посмотри в сторону Zig там есть defer для этого.
Аноним 19/12/20 Суб 20:03:17 1884844231
>>1884842
Речь про C и его все новые стандарты 11/17/2x.. Почему все не вводят и не вводят такую мега удобную вещь. Это же не испортит старую кодовую базу никак, не добавит накладных расходов.

> в сторону Zig
да есть плюсы и раст тогда уж
Аноним 19/12/20 Суб 20:19:30 1884858232
>>1884844
Раст говно, плюсы переутяжеляны. Zig идет именно как замена /надстройка Си.
Аноним 19/12/20 Суб 20:20:36 1884859233
Аноним 19/12/20 Суб 20:26:02 1884863234
Аноним 19/12/20 Суб 20:30:44 1884866235
>>1884863
Ну так и в чем изменится его нелинейность при создании на этапе компиляции ассемблерного выхлопа? Просто вместо освободить память у базового типа удет вставляться при необходимости вызов еще одной функции.
Ну вот как в это gcc, например. Почему не берут очевидную полезную и нужную вещь в стандарт. Это же избавило бы от кучи возможного забытия очищения памяти, не добавляя никаких накладых расходов.
Аноним 19/12/20 Суб 21:36:44 1884918236
>>1884858
плюсы самый быстрый язык, не гони
Аноним 19/12/20 Суб 21:41:17 1884920237
>>1884918
плюсы с растом сейчас плюс-минус на одном уровне по скорости, и - да, в крупных сложных проектах, а не линейных алгоритмах, они обгоняют уже сишечку по скорости из-за того же отсутсвия расходов для некоторых действий в рантайме
Аноним 19/12/20 Суб 22:22:53 1884951238
>>1884866
Нелинейность будет не в ассемблерном коде, а в программе на Си.
Появляется неявный вызов не в той точке, где он написан. Ну это как... Исключения в c++.
Аноним 19/12/20 Суб 22:23:40 1884952239
Аноним 19/12/20 Суб 22:32:37 1884958240
>>1884951
Так кому не надо и не будут этим пользоваться, а вот кому из-за отсутствия деструкторов библиотеки приходится переусложнять и апи для них, что потом пользователям надо помнить не забывать делать free для кучи вещей, хотя это можно было бы от них скрыть - это сильно бы помогло.
Аноним 19/12/20 Суб 22:38:05 1884962241
>>1884958
Так это не переусложнение, когда у тебя есть явное _Free. Переусложнение будет когда будет разброд и шатание. У одних есть, у других нету.
Аноним 19/12/20 Суб 22:40:36 1884965242
>>1884962
в смысле, ну так это такая же функция. Вот ты вызвал из сторонней либы f() ты же тоже не знаешь, что она под капотом делает и что вызывает. Поэтому читаешь доки или смотришь код, где уже и видешь, что именно оно делает.
Если тебе в твоем коде это не нужно, то и не используешь никак.
Ну во всех компиляторах это есть в том или ином виде, просто нужно это стандартизовать.
Аноним 19/12/20 Суб 23:06:13 1884982243
>>1884965
Я знаю что я вызвал f() и вернусь в строчку ровно после f(), а не улечу куда-то по неявному обработчику, не?
Аноним 19/12/20 Суб 23:11:00 1884985244
>>1884982
Пользователь функции f() получит точно такие же два исхода: либо внутри функции все поломалось либо он вернулся к строчке после ее вызова.
Аноним 20/12/20 Вск 00:20:10 1885035245
>>1884835
Ты хочешь разменять протечку по памяти/ресурсам на потенциальную протечку по памяти при отсутствии деструктора и потенциальный UaF при его наличии. Спизди себе набор _cleanup_ макросов из systemd если очень надо.
Аноним 20/12/20 Вск 00:33:40 1885041246
>>1885035
> Спизди себе набор _cleanup_ макросов из systemd если очень надо.
Куда я его спизжу, если он не на всех компиляторах работает.
> на потенциальную протечку по памяти при отсутствии деструктора и потенциальный UaF при его наличии.
утечка будет только в том случае, если предоставляемый код был кривым, от этого ты и так не застрахуешься
снимается возможность забыть пользователем освободить ресурс
соответственно при его отсутствии мы имеем все как было, при его наличии всего лишь выполнется +1 функция, которую не пользователь вынуждено вызывает ручками, а она сама на этапе компиляции вставится
Аноним 20/12/20 Вск 00:57:59 1885046247
>>1885041
Нет, ты не понял. Тебе всё-равно ВСЕГДА нужно будет проверять не забыл ли ты конкретно для этой структуры определить деструктор. А заодно и для вложенных полей этой структуры (их нужно удалять в своём деструкторе или нет, как считаешь?).
Кстати, если так подумать, то нахуй тебе деструктор, если у тебя и конструктора нет? Если в структуре хранится что-то что надо чистить, то это что-то всегда было передано извне и сруктура этим не владеет и не может почистить сама.
И ты прелагаешь непонятный костыль, который приносит в код UB.

> Куда я его спизжу, если он не на всех компиляторах работает.
Ну сорян, сделай ifdef и крэшся если собирают не шлангом с gcc.
Аноним 20/12/20 Вск 01:04:56 1885051248
>>1885046
так UB появиться неоткуда, из минусов только чуть дольше происходит компиляция

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

ну вот есть допустим структура, а в ней вектор есть динамический
функции есть для работы с этой структурой типа добавить элемент/удалить
а вот при выходе самой структуры из области видимости пользователи часто забывают вызвать условное free() для этой структуры
поэтому и говорю, что очень часто не хватает деструкторов (хотя напоминаю, что почти во всех компиляторах они есть, с разными названиями)
Аноним 20/12/20 Вск 01:12:10 1885061249
марио.png 35Кб, 732x467
732x467
>>1873113 (OP)
Двач, не гони меня тряпками, а лучше объясни. Без какого либо бэкграунда начал вкатываться. Пытаюсь осилить курс CS50, смотрю как украинскую так и ангельскую версии лекций. Собственно вопрос в PSETe 1, а именно mario. У меня получилось сделать задание, но я его всё написал через printf, понял, что получилась стена говна и пошёл в интернет. Нашёл пикрелейтед и нихуя не понимаю. Как работает этот алгоритм. Знакомых которые могли бы объяснить у меня нет. Если можно, то прям как бабуину на пальцах. Cпасибо.
Аноним 20/12/20 Вск 01:15:29 1885063250
>>1883289
> Исключением являются массивы, которые вроде как не копируются, а передаются по указателю, вопреки тому, что передаешь именно сам массив, а не указатель.
Но ведь "сам массив" и есть указатель на его первый элемент, вроде все логично, нет?
Аноним 20/12/20 Вск 01:17:24 1885064251
>>1885051
>так UB появиться неоткуда, из минусов только чуть дольше происходит компиляция
Если ты неправильно отследил кто владеет памятью и почистил её, то возникает UaF и что в программе произойдёт дальше тебе никто не гарантирует. Также пользователь либы может вытащить из твоей структуры указатель, которым не владеет, и сохранить у себя.

> ну вот есть допустим структура, а в ней вектор есть динамический
> функции есть для работы с этой структурой типа добавить элемент/удалить
Без внятной концепции владения деструктор только сделает хуже. Тебе не деструктор нужен, а умные указатели.
Я не пробовал - https://github.com/Snaipe/libcsptr
Аноним 20/12/20 Вск 01:20:25 1885069252
марио1.png 26Кб, 329x721
329x721
марио2.png 28Кб, 357x698
357x698
>>1885061
вот примерно то, что я сам понаделал...
Аноним 20/12/20 Вск 01:29:55 1885076253
>>1884982
Сразу вспоминается libpng с его обработкой ошибок через setjmp
Аноним 20/12/20 Вск 01:32:38 1885078254
>>1885041
А у ms вродебы есть _try _catch
Аноним 20/12/20 Вск 01:34:23 1885080255
>>1885078
почитаю всю ветку, я вообще не о том спрашиваю как кому-то что-то сделать в конкретном случае, я про стандарт и его развитие и про причины торможения
Аноним 20/12/20 Вск 01:35:59 1885082256
>>1885061
Всё просто, на пикрелейтеде написана полная хуйня, которая скорее всего и не работает.
Держи - https://ideone.com/VxBsws
Тут всё просто, сам разберёшься.
Аноним 20/12/20 Вск 01:43:10 1885089257
>>1885061
>>1885069
В программировании стараются избегать повторения кода, поэтому придумали циклы.
Цикл for выполняется от, до (пока условие соблюдается), и с шагом.
Внешний цикл выполняется size раз, рисуя строчки. В конце каждой строчки рисуется перевод на новую строку.
Внутренний цикл выполняется _для каждого шага внешнего цикла_, size раз
Внутри него рисуется по 1 символу (пока забьем на условие), таким образом у тебя будет нарисована таблица size на size.
Остается вопрос какой символ рисовать, закрашенный или пустую клеточку. Для этого грубо говоря складывают x и y координату. Можешь проверить в тетради в клетку. Примерно так: если строка 23, то нарисовать можно только в столбце 0; если строка 22, то логично что можно нарисовать в столбце 0 и 1; если 21, то в 0, 1 и 2; и так далее.
Аноним 20/12/20 Вск 01:43:37 1885090258
>>1885080
Ещё раз ты просишь деструкторы, не понимая зачем они появились в плюсах, для задач которые деструкторы нормально не решают впринципе.
Никто такую хуйню в стандарт тащить не будет.
Аноним 20/12/20 Вск 01:44:09 1885092259
>>1885080
Потому что в комитете Си консерваторы, которые не хотят тащить все подряд из плюсов, но тебе такой ответ вряд ли понрваится.
Аноним 20/12/20 Вск 01:45:01 1885093260
Аноним 20/12/20 Вск 01:46:13 1885094261
>>1885092
плюсы тут ни при чем, это ж просто концепция, а тут она более чем востребована и опять же всеми разрабами компилатор уже как-то да запилена, но каждый написал свой костыль и поэтому почти никто не пользуется
Аноним 20/12/20 Вск 01:48:18 1885095262
>>1885094
Помню читал такой срач и там чуваку просто скинули ссылку где вступить в WorkGroup чтобы официально давать предложения в стандарт :3 Погугли, запплайся, напиши, вдруг добавят.
Аноним 20/12/20 Вск 01:49:13 1885096263
>>1885094
Мне больше интересно почему никто не форкнет компилер (или напишет свой, там же немного писать) и не сделает диалект C без UB.
Аноним 20/12/20 Вск 01:51:01 1885099264
>>1885096
компилер - это дохуя сложно
>C без UB
rust
Аноним 20/12/20 Вск 01:52:12 1885101265
>>1885099
>компилер - это дохуя сложно
В случае с Си - легко. И воспроизводилось кучей людей.
>rust
Гавно без задач и нинужно.
Аноним 20/12/20 Вск 01:53:02 1885102266
Аноним 20/12/20 Вск 01:53:32 1885103267
>>1885101
когда напишешь еще один компилятор, то ты просто увеличишь их количество, а польза будет отрицательной, нужно сам язык улучшать
Аноним 20/12/20 Вск 01:54:14 1885104268
>>1885103
Компилятор же детектит UB, надо просто пропатчить чтобы это была хард ошибка.
Аноним 20/12/20 Вск 01:54:36 1885105269
>>1885102
ну там минимизировали эти ub, меньша пока не придумали как
Аноним 20/12/20 Вск 01:54:56 1885106270
Аноним 20/12/20 Вск 01:57:32 1885110271
>>1885106
это уже вообще другая тема
Аноним 20/12/20 Вск 01:58:18 1885112272
>>1885110
Я думаю что в большинстве существующих языков нет UB.
Аноним 20/12/20 Вск 02:00:39 1885116273
>>1885112
в интерпретируемых - да, в работающих уровнем пониже - пока не получится избавится, т.к. железо разное и его поведение разное, порой принципиально
Аноним 20/12/20 Вск 02:01:55 1885117274
>>1885116
Железо тут не причем. Речь про Undefined, а не про Implementation defined. Алсо толсто, C# компилируется AOT либо JIT
Аноним 20/12/20 Вск 02:07:50 1885121275
>>1885094
Ты эту концепцию сначала опиши нормально.
>>1885096
> UB
Есть один нюанс. UB в стандарте появился не от балды, а потому что C - кроссплатформенный ассемблер под абсолютно разную хуйню с абсолютно разной реакцией на граничные ситуации которые потом и назвали UB. И когда ты решаешь UB ты по сути отрезаешь платформы.
> почему никто не сделает диалект C без UB.
Сделали кучу раз. Последняя попытка называется golang, можешь попробовать.
Аноним 20/12/20 Вск 02:13:46 1885123276
>>1885121
> Ты эту концепцию сначала опиши нормально
описал выше уже подробно: возможность описать функцию, которая вызывается перед выходом объекта этого типа из области видимости.
С примерами описал где она многим требуется и жалуются, что не хватает. И как разрабы, так и пользователи.
Описал, что это ничего никому не испортит, а только добавит полезный функционал языку (видимо поэтому все почти разрабы компиляторов это уже сто лет реализовали)
Аноним 20/12/20 Вск 02:26:26 1885130277
#include <stdio.h>
#include <stdint.h>

int main(void)
{
long long result = INT64_MIN / -1;
printf("The result: %lld", result);
}
Аноним 20/12/20 Вск 02:36:01 1885133278
>>1885123
Твоя концепция не решает твои проблемы вообще никак, а примеры твои работают только у тебя в голове.

Давай псевдокодом прям вот тут:
```
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 они будут бесполезны, более того опасны? Я как будто с первокуром общаюсь.
Аноним 20/12/20 Вск 02:39:52 1885136279
>>1885133
пиздец.. ты вообще пишешь какую-то хуйню про другое. Ты или перечитай внимательно, что обсуждаем или уж не лезь тогда. А то повылезают из серии дишь бы что-то сказать, даже не пытаясь понять о чем речь. Ты еще как умник выше скажи про реализацию на языке умных указателей.
Аноним 20/12/20 Вск 02:47:03 1885139280
>>1885136
Я пишу именно то что надо. То что ты путаешь defer и деструктор и выдаёшь одно за другое - чисто твоя проблема.
Аноним 20/12/20 Вск 05:30:19 1885166281
>>1885139
Если нужен defer в си - юзай
#define DEFER(f) __attribute__((cleanup(f)))

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

А вот для умных деструкторов надо думать о передаче владения, а там уже растом тянет и std::move
Аноним 20/12/20 Вск 08:48:00 1885202282
>>1885166
>А вот для умных деструкторов
Чем умнее язык, тем тупее программист. А си не для дебилов. Поэтому умного говна и деструкторов в частности не будет.
Аноним 20/12/20 Вск 09:36:58 1885217283
>>1885202
Так и туалетная бумага для дебилов. Иначе зачем тебе голова и руки, с такими высказываниями-то?
Аноним 20/12/20 Вск 10:29:26 1885251284
>>1885217
Проблема современной цивилизации в толерастии. Тупому быдлу внушают, что все люди одинаковые, равны. В результате, дебилы лезут в треды умных считая себя такими же и кукарекают "то не так, это не так", не понимая, что это только от их тупости. Но указать некому, толерастия же.
Аноним 20/12/20 Вск 12:07:10 1885324285
Аноним 20/12/20 Вск 12:22:49 1885337286
>>1885092
Два чаю. Вот пример, когда человек просто хотел сделать сигнатуру чуть более правильной, добавив 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
Правильно это или нет: хз, тут это философский вопрос
Аноним 20/12/20 Вск 13:58:32 1885386287
>>1884749
Все сводится к байтовым массивам. Все байты можно переписать.
Аноним 20/12/20 Вск 13:59:50 1885387288
Аноним 20/12/20 Вск 18:46:49 1885605289
>>1883289
>В параметрах функций
Кто то у нас путает параметры и аргументы.
Аноним 20/12/20 Вск 20:41:19 1885656290
>>1885337
>Правильно это или нет: хз, тут это философский вопрос
Правильно. Библиотека существует для пользователей, это не игрушка её разработчиков, которой можно вертеть как захочешь. Разработчик должен думать не о себе, а о пользователях. Если его изменения будут поводом высирания кучи варнингов где их раньше не было, это головная боль пользователям, поэтому так делать не надо. А свои "ну такжы лучшы!" можешь в анус себе засунуть, это типичный лепет тупых эгоцентричных малолеток.
Аноним 20/12/20 Вск 22:18:57 1885721291
sshot-2020-12-2[...].png 10Кб, 591x204
591x204
Что у вашего охуитительного языка с локалью? Почему не конвертит в привычную для венды кодировку?
Аноним 20/12/20 Вск 22:50:40 1885742292
>>1885721
Винда сосёт, переходи на линупс или бздю. Привычная для винды кодировка - их собственная, все одно используют, а винда как всегда.
Аноним 20/12/20 Вск 23:01:10 1885747293
Сап Керниганы и Ричи, помогите найти годные книги или на крайняк татуриалы на тему геймдева на Си с меня нихуя как обычно.
Пробовал гуглировать, но либо нахожу таки код на крестах, либо какие-то демки 1989 года под ДОС, либо нихуя, так как попробуй нагуглить что-то с просто символом «C». Хотелось бы чего-то современного, с ECS, дата ориентед дизайном, Vulcan/Metal хотя сейчас подумал что там наверное апи уже под плюсы/обжективные плюсы минимум. Выручай анон.
Аноним 20/12/20 Вск 23:27:15 1885770294
Аноним 20/12/20 Вск 23:28:43 1885771295
>>1885747
берешь SDL2 и гуглишь
Аноним 21/12/20 Пнд 02:36:31 1885808296
>>1885721
Так это ты в коносли chcp должен менять
Аноним 21/12/20 Пнд 02:37:36 1885809297
Аноним 21/12/20 Пнд 07:10:19 1885860298
Аноним 21/12/20 Пнд 07:12:53 1885861299
>>1885860
Их несколько там разный набор
Аноним 21/12/20 Пнд 11:23:28 1886016300
Hang.png 294Кб, 1920x1080
1920x1080
147682784418507[...].jpg 27Кб, 400x238
400x238
Нашёл предположительный участок кода, который вешает мой программный цикл на микроконтроллере.

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

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

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

Ещё есть либа cJSON, которая используется для пакинга \ парсинга джи-сон строки: https://github.com/DaveGamble/cJSON
Но там вобще мрак и я не знаю как её проверить.
Аноним 21/12/20 Пнд 11:46:23 1886027301
>>1885747
Короче на Гите в awesome C есть ссылки на ресурсы. Но я знаю один ресурс в котором объясняют на пряниках всё про векторы и так далее. Но там очень тяжело. Позже скину.
Аноним 21/12/20 Пнд 11:49:08 1886030302
>>1885061
Как я рад что был прав на счёт CS50, такой раковый вброс. Они даже код писать не могут, более того учат своих студентиков писать некачественный код с умершими конструкциями которые никто не использует. Кому нужен do while в 2021? Ну если только для макросов каких нибудь и то не знаю, не использовал.
Аноним 21/12/20 Пнд 11:49:59 1886032303
>>1885069
Ты не тролишь случайно?
Аноним 21/12/20 Пнд 11:50:56 1886033304
>>1885069
У меня мозг щас сломался, кто-то на дваче оказался прав, вот этот анончик >>1882983
Аноним 21/12/20 Пнд 11:53:15 1886035305
Байтоеблю пропускать? Я имею ввиду bit fiddling. Хочу в пыху уже перекатиться после структур и юнионов. Зачем мне для веба перестановка битов?
Аноним 21/12/20 Пнд 11:58:26 1886037306
Ку анонче, вообщем это опять я с файлами и прочим своим говном. У меня есть файл в котором символы, мне нужно взять этот файл, подставить после каждого символа пробел и сохранить в этом же файле. Пока что не получается, только сохраняя в новый файл. Переписать прошлый не получается.

Вот что я напилил
https://www.ideone.com/m00C2E
Аноним 21/12/20 Пнд 12:03:08 1886040307
>>1885251
Язык Си требует много дисциплины, фокусировки, ответственный подход и абсолютную волю.
Аноним 21/12/20 Пнд 12:05:26 1886043308
Аноним 21/12/20 Пнд 12:10:08 1886046309
Аноним 21/12/20 Пнд 13:39:47 1886105310
Вроде работает, можете посмотреть на ошибки и моменты которые можно исправить? Или есть ли идеи как получше написать циклы и т.д? Щас буду писать версию с уравниванием значений в массиве, типа если у символа есть разница более чем на единицу с соседом, то нужно будет поставить среднее значение между ними.

https://www.ideone.com/Q2gKlk
Аноним 21/12/20 Пнд 13:54:00 1886108311
Аноним 21/12/20 Пнд 13:57:47 1886110312
anon-3590367.jpeg 154Кб, 576x802
576x802
Аноним 21/12/20 Пнд 14:00:50 1886113313
Кто-нибудь может подкинуть ресурс почитать про то, как работает printf с format specifiers? Вот к примеру я хочу вывести signed char, на экран (и использую вместо %hhd, %hd), тогда printf должен считать не 1 байт, а 2 байта начиная с точки, где хранится число захватив предположительно участок памяти с рандомными значениями сделав UB (читал, что такое точно происходит в учебнике, но там несколько значений выводилось), но он просто продлевает лишними нулями до размера signed short число типа signed char. Зато когда суем signed short в signed char, у нас случается integer overflow, если не помешается число в тип. Так что именно происходит? C продлевает число до нужного типа или все таки не продлевает и просто выводит то, что было в памяти согласно размеру типа?
Аноним 21/12/20 Пнд 14:15:02 1886125314
>>1886113
Ну короче там есть ячейки памяти, каждый спецификатор выделяет определенную память согласно размеру типа. Если int 4 байта, если вставишь вместо int - long размером 8, то выведется половина, те 4 байта вместо 8. Если тип меньше спецификатора (поменяем long и int местами) то одна половина памяти будет просто нулями, а вторая значением которое тебе нужно вывести. Но есть проблема, незанятое пространство из первого спец. перенесется на второй соседний спец. если ты его туда поставишь. Либо он просто останется в памяти и тут UB.
Аноним 21/12/20 Пнд 14:43:35 1886149315
>>1886113
Если совсем педантичный ответ дать, то смотри соглашения о вызове функций и то, как там реализован 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)? Шагнули на столько-то.
Аноним 21/12/20 Пнд 14:47:31 1886156316
>>1886125
Если выводим signed char = 1 как %hd, то будет

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

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

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

Правильно понял?
Аноним 21/12/20 Пнд 15:20:25 1886190317
Аноним 21/12/20 Пнд 15:39:55 1886215318
>>1886190
Тогда почему, когда все так понятно в теории на практике:

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

return 0;
}

Дает 1, 2 на выходе?
Аноним 21/12/20 Пнд 17:25:31 1886303319
У меня есть прога на плюсах где просто дохуя вычислений надо сделать. Она по времени немного не заходит. (Вычислений столько, что дано аж 7 секунд). Может ли смена крестов на си без использования всяких std::min улучшить ситуацию?
Аноним 21/12/20 Пнд 17:52:19 1886337320
>>1886215
Судя по стандарту va_args промоутит все до инта
То есть реально в твоем примере ты вызываешь как бы
printf(const char*, (int)i, (int)j)

Аноним 21/12/20 Пнд 18:04:26 1886346321
>>1886190
>>1886108
Зарепортил.
Траллирование выглядит жалко и не к месту. Детский сад.
Аноним 21/12/20 Пнд 18:43:23 1886372322
>>1886337
Да, точно меньше инта ради скорости промоутится, это понял. Но тогда с лонгом и интом пример должен сработать.

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) наоборот говорится, что все стартует с начала по кол-ву байту соответствующему спецификатору. Не понимаю, в итоге компилятор то понимает, что от него хотят, то не понимает.
Аноним 21/12/20 Пнд 19:19:29 1886422323
>>1886372
>инт он похоже читает с конца
Ну так ты запускаешь скорее всего на x64 архитектуре с Little-endian.
Попробуй с большими числами, не 1 а какое нибудь 0x13579246
>Не понимаю, в итоге компилятор то понимает, что от него хотят, то не понимает.
А это в принципе неважно, потому что раз у тебя спецификаторы не соответствуют переданным аргументам, у тебя UB, а при UB компилятор не обязан ничего понимать.
Так что то что ты исследуешь, это не какое то истинное свойство языка, а просто стечение обстоятельств, как это работает на каком то одном компьютере с каким то одним компилятором с каким то набором флагов компиляции.
Аноним 21/12/20 Пнд 20:33:33 1886487324
>>1886422
Понял, спасибо. Как я понял, операция modulus точно происходит при конвертировании типов, но необязательно при спецификаторах форматов в printf, тут уже зависит от архитекторы и может быть по-разному. Лучше UB не делать играясь со спецификаторами и все делать вне printf с помощью арифметики. Я думал это как-то можно понять как пресловутый integer overflow, который вроде как ошибка, но в рамках логики.
Аноним 21/12/20 Пнд 20:53:39 1886510325
>>1886303
Интеловский крестокомпилятор вроде оптимизирует. Правда, если у тебя амуда, то соснул, но есть кое какие оптимизации и для неинтелов.
Аноним 21/12/20 Пнд 21:43:34 1886555326
>>1886113
Параметры уже Инта расширяются до Инта при вызове: integer promotion.
Аноним 21/12/20 Пнд 21:49:09 1886558327
>>1886372
Для %d long ты должен был получить предупреждение.
Аноним 21/12/20 Пнд 22:28:36 1886586328
>>1877090
Чтобы не хранить по указателю для каждого поля.
Аноним 21/12/20 Пнд 23:34:17 1886625329
Аноним 21/12/20 Пнд 23:52:16 1886638330
>>1886586
Вообще ничего не дает в этом плане. Ну будет у тебя [esp+1], [esp+3] вместо [esp+4], [esp+8]
Аноним 22/12/20 Втр 00:41:38 1886655331
Аноним 22/12/20 Втр 03:59:30 1886698332
>>1885123

Дядям в комитете нужно менеджить главный язык программирования этого чёртового шарика, который должен транслироваться в опкоды для всего: начиная от суперкомпьютера и заканчивая твоим вибратором. С такой ответсвтвенностью люди становятся оочень консервативными и действуют по принципу: "работает - не трогай".
Аноним 22/12/20 Втр 06:19:52 1886783333
>>1886698
Ууу, прям херои. А как же тогда с++ справился, а кода ведь на нем в разы больше.
Аноним 22/12/20 Втр 07:48:01 1886807334
download.jpg 12Кб, 225x224
225x224
>>1886783
>с++ справился, а кода ведь на нем в разы больше
Бля, школьник, пиздуй тралить в другом месте.
Аноним 22/12/20 Втр 08:35:41 1886818335
>>1886807
Ребенок, открой сорцы хрома и посчитай.
Аноним 22/12/20 Втр 08:41:54 1886819336
images.jpg 4Кб, 224x225
224x225
>>1886818
>открой сорцы хрома и посчитай
Всё, в цирк можно не ходить целый год. Твоего представления достаточно.
Аноним 22/12/20 Втр 16:28:25 1887194337
Аноним 22/12/20 Втр 17:03:23 1887243338
>>1886698
Лол, долбоеб, дяди из комитета еще 31 год назад всех хардварщиков нахуй послали. Они нихуя не делают, только иногда собираются на свои сходочки и отклоняют предложения людей не входящих в СОВЕТ.
Аноним 22/12/20 Втр 17:05:32 1887246339
Аноним 22/12/20 Втр 17:34:27 1887292340
>>1886818
Погоди разве хром не перешел на Го?
Аноним 22/12/20 Втр 17:35:26 1887293341
>>1886819
Прослезился, это легендарный пост.
Аноним 22/12/20 Втр 18:07:36 1887333342
>>1887243
Именно поэтому сишка еще не растеклась в то бесформенное говно, в которое превратился соседний язык. Вон давеча в комитет притаскивали замыкания с маллоком внутри, это ж где я им маллок возьму, когда у меня на МК памяти два килобайта?
Аноним 22/12/20 Втр 18:16:27 1887344343
>>1887333
Никто и нигде последние лет 15 не использует сишку на мк, сдохнут легаси станки сдохнет и сишка. Вместе со своим профнепригодным комитетом. Ну а если ты на полном серьезе отрицаешь что комитет хуево справляется со своей работой то ты долбоеб
Аноним 22/12/20 Втр 18:24:19 1887352344
>>1887333
>два килобайта
И.е. си останется только на открытках?
Аноним 22/12/20 Втр 18:34:49 1887369345
>>1887344
> Никто и нигде последние лет 15 не использует сишку на мк, сдохнут легаси станки сдохнет и сишка.
Сам работаешь? А что тогда по-твоему используют? Трансо раст?
Аноним 22/12/20 Втр 18:37:41 1887371346
>>1887344> Никто и нигде последние лет 15 не использует сишку на мк
Толсто.
Аноним 22/12/20 Втр 18:39:24 1887376347
>>1887369
JS и Питон, что еще могут школьники осилить.
Аноним 22/12/20 Втр 18:43:59 1887378348
>>1887376
А при чем тут школьники?
Аноним 22/12/20 Втр 18:47:41 1887383349
>>1887378
А кто? Кто еще сомневается в моще Си, да еще на мк?
Аноним 22/12/20 Втр 18:47:50 1887384350
>>1887378
в юнет-фактори 18+ проста((((
Аноним 22/12/20 Втр 20:47:23 1887481351
>>1886113
Я твоим потоком сознания чуть не подавился, но выстрелю на удачу. Я подобное высирал, когда не знал про little/big endian
Аноним 22/12/20 Втр 20:52:20 1887484352
>>1885063
Нет, sizeof тебе не вернет размер адресного регистра целевой архиктуры. Просто в любых операциях компилятор подставляет константу либо вычисление по стеку адреса нулевого элемента.
Аноним 22/12/20 Втр 20:54:49 1887487353
бля, посоны, ламповый тредик у вас, аж захотелось вернуться в студенчество безработное чтоб с сями играться
или устроиться по сабжу ага, правда все равно творчества будет не хватать
Аноним 22/12/20 Втр 22:03:35 1887525354
>>1887383
А кто-то сомневается?
Аноним 23/12/20 Срд 08:20:32 1887788355
Как сравнивать си по алфавиту? например "aa "> "bb" > "bc" .. "zz" и так далее. Может есть какая-нибудь функция для этого? Длинна слов может быть не 2
Аноним 23/12/20 Срд 09:17:53 1887800356
>>1887788
strcmp
Конечно есть нюансы, такие как в разных локалях может быть другой порядок букв в каких нибудь европейских языках
Или например если ты хочешь не лексикографический, а натуральный порядок, как в папках, чтобы file15 шел после file2.
Аноним 23/12/20 Срд 09:25:25 1887805357
Аноним 23/12/20 Срд 17:11:04 1888317358
>>1873113 (OP)
Привет, аноны. Так вышло, что мне нужно так скажем распарсить строку. Вот пример

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

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

Помогите, пожалуйста, уж силы иссякли ебаться с этим.
Аноним 23/12/20 Срд 17:28:48 1888330359
Аноним 23/12/20 Срд 17:42:23 1888358360
>>1888330
Если на вход идёт строка, то оно разве разбивает по пробелу ? То бишь если на вход CD, то это 2 символа, а если test, то это уже 4, но если cd test , то как выцепить инфу после пробела ?
Аноним 23/12/20 Срд 17:46:05 1888369361
>>1888330
Я просто к тому спрашиваю, что мне надо обрабатывать текст после предполагаемой команды, например чтобы разные настройки доступа менять и тд(пишу терминал)
Аноним 23/12/20 Срд 18:05:25 1888401362
>>1888358
argv изкоропки разбивает все аргументы, расспличенные одним и более пробелом
Нулевой индекс включает в себя вызов программы e.g. ./a.out
Зачем тебе сырые строки ковырять?
Аноним 23/12/20 Срд 18:44:56 1888440363
>>1888401
Говорю же, терминал надо написать, а в нем очевидно что ввод строки, на вход аргументами программы это не сделать, ведь он сделает 1 команду и все, а надо обрабатывать динамически. Если я сделаю функцию, которая принимает строку с стандартного входа как char *list[] , то обращаясь к скажем индексу 1 , разве я получу символы до первого пробела , ведь он отдаст первый символ и все? Понимаю, что это ебля ещё та, но надо.
Аноним 23/12/20 Срд 20:32:48 1888576364
>>1873113 (OP)
Здарова, байтоебы, бля ну си конечно заебись язык ничего лишнего, да и ничего нужного, аля сам ебись придумывая связные списки под каждый пук. Короче си - говно без задач в современном мире, если только вы не пилите ядро линукс или драйвера, хотя и драйвера уже на с++ пишутся.

удаляйте тред.
Аноним 23/12/20 Срд 20:44:05 1888597365
>>1888576
Не осилил нагуглить готовую либу?
Аноним 23/12/20 Срд 20:50:23 1888611366
>>1888597
Лол, я на си в свое время много писал и много чего использовал, но ты сам то видел эти "готовые" либы? Это хуйня полная и неудобная.

Да и вообще какой смысл писать на си сейчас? Быстрее чем с++ это точно не будет, при разумном использовании последнего. А вот скорость написания, читабельность и емкость кода будет намного намного выше.
Аноним 24/12/20 Чтв 02:45:54 1888908367
c.png 5Кб, 741x125
741x125
Почему при вычитании всех типов, кроме int, он конвертирует результат операции к этому типу? Потому что типа int на конкретно моей платформе самый быстрый и он соптимизировал?

Приведение типов это насколько затратная операция? Если я впишу условное (short int) x - y это скажется?
Аноним 24/12/20 Чтв 03:37:37 1888924368
>>1888908
>Потому что типа int на конкретно моей платформе самый быстрый и он соптимизировал
Да, размер инта зависит от платформы, но это всегда самый оптимальный тип.
Аноним 24/12/20 Чтв 09:02:07 1888980369
c.png 44Кб, 1172x511
1172x511
>>1888924
А почему, что есть приведение типов, что его нет - код один и тот же?
Аноним 24/12/20 Чтв 10:02:16 1889005370
>>1888440
Может функцию сделать которая строку на слова по поробелу разбивает?
Аноним 24/12/20 Чтв 10:45:49 1889031371
>>1888980
компилер знает что делать и сука делает это
Аноним 24/12/20 Чтв 11:26:44 1889047372
emf.jpg 8Кб, 480x360
480x360
>>1888980
INTEGER PROMOTION
INTEGER PROMOTION
INTEGER PROMOTION
INTEGER PROMOTION
INTEGER PROMOTION
Аноним 24/12/20 Чтв 13:15:48 1889136373
>>1889005
Можно, а как? В питоне просто, тут.- нет
Аноним 24/12/20 Чтв 15:40:29 1889330374
Аноним 24/12/20 Чтв 15:44:18 1889338375
>>1888980
Если я правильно понимаю то у тебя идентичный код. Ведь результат все равно скастится к типу возврата.
Аноним 24/12/20 Чтв 15:45:04 1889341376
>>1888440
Не пробовал готовые либы искать? Curses там
Аноним 24/12/20 Чтв 16:47:48 1889434377
>>1889136
Может быть тебе подключить питон и вызывать его...
Аноним 24/12/20 Чтв 19:20:26 1889648378
>>1888440
>Говорю же, терминал надо написать,
В смысле?

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

Пиздец вопросы. Пиздец ответы. Убить вас всех нахуй. Или отправить на лесоповал озеленять вырубленные площади.



Аноним 24/12/20 Чтв 19:31:58 1889658379
char buf[max];

main() {..}

Законно ли писать поверх buf + max в таком случае? Я думал, что что-то вроде сигсегв будет, там же за границу .bss пишется.
Аноним 24/12/20 Чтв 19:42:20 1889669380
Снимок экрана 2[...].png 54Кб, 671x509
671x509
Аноним 24/12/20 Чтв 20:24:24 1889719381
>>1889669
Но это же просто сегмент данных размером 2*MAXLINE.
Аноним 24/12/20 Чтв 20:27:43 1889725382
>>1889669
+ sizeof(int), разумеется
Аноним 24/12/20 Чтв 21:14:25 1889774383
Стикер 0Кб, 512x512
512x512
Аноним 25/12/20 Птн 09:46:46 1890313384
>>1873113 (OP)
Почему для того чтобы из буфера не читался \n в условиях проверки стоит
while(getchar() != '\n')
continue;
Почему НЕ равно? Потому что оно в любом случае перейдёт в тру, т.к ты ввод нажимаешь, и вместо continue пойдёт проверка следущего символа буфера, т.е \n
Аноним 25/12/20 Птн 09:48:50 1890314385
>>1890313
*в false. То есть в любом случае contine не происходит, а происходит итерация внешнего цикла с проверкой оставшегося \n
Аноним 25/12/20 Птн 13:06:26 1890458386
20160418120453a[...].jpg 37Кб, 604x604
604x604
Здравствуйте. Я полный нуб пришел к вам из ньюфаготреда.
Мне нужно скомпилить вот это дело, желательно без установки и настройки тонн софта и докачки библиотек.

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

GCC уже посоветовали, но я нихуя не понимаю как он настраивается и обязательно ли качать всю хуйню по нему или есть просто компиллер.
Помоги анон.
Аноним 25/12/20 Птн 15:25:49 1890639387
Помогите незнающему студенту. У меня задание сделать аницаию в openGL, с самой рисовкой я разобрался, только не знаю, как реализовать таймер/пропуск определённого количества времени. То есть я рисую 1 кадр, проходит 30 милисекунд и этот кадр должен нарисоваться ещё раз, но с изменениями, которые я прописал в программе.
Аноним 25/12/20 Птн 16:11:44 1890671388
>>1890639
в цикле проверяешь разницу текущего времени с временем отрисовки предыдущего кадра и если больше нужного значения рисуешь кадр
Аноним 25/12/20 Птн 23:30:45 1890974389
>>1890458
gcc -O3 XAir_Command.c -o prog_name
Аноним 26/12/20 Суб 01:30:04 1891050390
>>1890671
Такое прокатывало в DOS, но сейчас операционки многозадачные. Загрузка проца 100% без причины это говнокод.
Аноним 26/12/20 Суб 02:02:52 1891065391
>>1891050
это самый простой рабочий вариант а он студент
сейчас процессоры по 6 ядер имеют так что никто не заметит
Аноним 26/12/20 Суб 13:05:39 1891352392
Как сохранить данные структур в файле вместе с текстом? Какие функции использовать?
Аноним 26/12/20 Суб 13:31:09 1891369393
>>1890671
>>1891050
Решил проблему, в библиотеке которая нужна для отрисовки была своя функция таймера, с запуском функции по окончании, нахер я с этим 2 часа ебался, если можно было так легко сделать.

void Time()
{
glutPostRedisplay();
glutDisplayFunc(renderScene);
glutTimerFunc(30, Time, 0);
}
Аноним 26/12/20 Суб 13:48:09 1891381394
formp1.png 62Кб, 1341x590
1341x590
formp2.png 34Кб, 1317x431
1317x431
Подсобите, пожалуйста, свернуть формулы со скринов и скормить их компилятору gcc.

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

Если можно, то в двух вариантах: 1) кратко пошагово; 2) в одно действие.
Аноним 26/12/20 Суб 13:57:42 1891391395
>>1890974
Спасибо анон, но нихрена в итоге не получилось все равно. Для компиляции еще надо собрать библиотеку, этого я не осилил.
Написал разработчику с просьбой скомпилять и он скомпилил.
Аноним 26/12/20 Суб 14:14:28 1891409396
7z - extwebp.7z.png 4001Кб, 80x80
80x80
>>1880733
Написал для интереса. Говнокод или все хорошо?
Аноним 26/12/20 Суб 17:04:40 1891490397
>>1891381
Одноклассника попроси
Аноним 26/12/20 Суб 17:27:41 1891523398
180efc3227b70e9[...].jpg 29Кб, 600x568
600x568
>>1891490
Хуй будешь?
Будешь моим одноклассником, чепушь?
Аноним 26/12/20 Суб 17:36:05 1891536399
У питона есть pip. С помощью него можно устанавливать всякие крутые библиотеки. Есть ли что-то подобное для си?
Аноним 26/12/20 Суб 17:55:05 1891548400
>>1891536
>всякие крутые библиотеки
Кокие?
Аноним 26/12/20 Суб 18:01:21 1891552401
На ревью.

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

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

Как заставить компилятор под комп сделать правильную разрядность cmd_type_t - два байта?
Аноним 26/12/20 Суб 18:52:54 1891618405
Аноним 26/12/20 Суб 18:55:12 1891621406
Аноним 26/12/20 Суб 19:05:18 1891642407
>>1891621
Рамер енума не определен.
Аноним 26/12/20 Суб 19:06:54 1891645408
Аноним 26/12/20 Суб 21:04:50 1891721409
>>1891621
enum достаточно большой, чтобы вместить используемые в нём числа, плюс компилятор можно попросить упаковать его поплотнее какими-нибудь __attribute__ ((__packed__)) или -fshort-enums если загуглишь `sizeof enum`, первая же ссылка ведёт на stack overflow, где это всё написано
Аноним 26/12/20 Суб 21:15:31 1891732410
>>1891558
> Скачиваешь библиотеку в сорцах

Ну да, логично...
Аноним 27/12/20 Вск 03:06:25 1892014411
>>1889658
>>1889658
Твой буффер будет расположен в сегменте данных.
Поэтому сигнал может быть сгенерирован если выйдешь за границу виртуальной страницы. Но пока не перешагнёшь границу страницы, исключения не будет.

БОЛЕЕ ТОГО! В сегмент данных попадают переменные из разных исходников. Т.ч. граница сегмента данных может далеко - при выходе за границы массивы ты просто прочитаешь или перезапишешь глобальные или статические переменные, обхявленные в других файлах.

Аноним 27/12/20 Вск 04:48:13 1892047412
>>1891381
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;
Аноним 27/12/20 Вск 06:25:19 1892073413
14334349766410.jpg 50Кб, 300x300
300x300
Есть байт, третий и четвёртый биты в котором принимают значение: 0x00, 0x08, 0x10, 0x18.

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

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

Хелпуйте, парни.
Аноним 27/12/20 Вск 11:52:53 1892182414
>>1892073
Начни с функции, которая реализует сложение через битовые операции.
Аноним 27/12/20 Вск 12:35:51 1892199415
>>1889658
Тебе всякой чуши поотвечали. В языке никаких сигналов нет. А писать за пределы все равно незаконно.
Аноним 27/12/20 Вск 12:41:14 1892202416
>>1892073
Ты видишь последовательные комбинации битов, и у тебя не загорелась идея как превратить их в последовательность индексов от 0?
Аноним 27/12/20 Вск 13:43:53 1892236417
>>1892199
>А писать за пределы все равно незаконно.
Наоборот. Си - свободный язык, позволяет очень много всего делать, и так и надо. Можно всё, а делать или не далеть решать только тебе. Язык не запрещает, не сковывает руки, а наоборот помогает делать что угодно. И из за этого он прозрачен, что ты пишешь, то и получаешь. Ты видишь что ты пишешь, в отличие от других параш, где язык является черным ящиком, хуй знает что там под капотом реально происходит.
Аноним 27/12/20 Вск 15:38:44 1892308418
>>1892236
Читай стандарт, маняфантазер. Чтение за пределом массива UB
Аноним 27/12/20 Вск 15:53:09 1892326419
>>1892308
Странная рекомендация.
UB - все что не описано в стандарте языка.
Ты же рекомендуешь почитать об UB в стандарте. Как-то странно.
Аноним 27/12/20 Вск 16:04:23 1892337420
Ретят, где найти ISO/IEC 9899:1990? (Да, именно 1990.)
Аноним 27/12/20 Вск 16:07:30 1892338421
Да, забыл добавить:
Продолжаю искать: DO-178C.PDF (A и В тоже подойдут), DO-254.PDF, DO-385.PDF (всё ещё некритично), ARINC-653.PDF.
Без смс и регистрации!
Аноним 27/12/20 Вск 16:09:41 1892340422
>>1892337
read.pudn.com/downloads133/doc/565041/ANSI_ISO%2B9899-1990%2B[1].pdf
Аноним 27/12/20 Вск 16:17:35 1892347423
>>1892326
Ну открой ты стандарт чтобы чушь не пороть. Ситуации при которых возникает UB описаны именно в стандарте.
Аноним 27/12/20 Вск 16:28:23 1892353424
Хочу работать с компьютерной графикой. Что мне нужно читать, чтобы создать хотя бы куб на си?
Аноним 27/12/20 Вск 17:07:20 1892395425
>>1892347
> Ситуации при которых возникает UB описаны именно в стандарте.
Ты даун? Ты хоть раз читал стандарт? Тебе пояснили, что ситуации при которых UB происходит наоборот в стандарте не описаны.
Аноним 27/12/20 Вск 17:21:20 1892422426
1594708604830.png 191Кб, 1024x1036
1024x1036
>>1892395
Ты наркоман? Зашел потроллить тупостью? Ты хоть раз открывал стандарт? Там описаны ВСЕ ситуации при которых происходит UB.
Аноним 27/12/20 Вск 17:33:30 1892447427
>>1892422
Ебать у тебя полыхнуло))
Туши жопку, маня
Аноним 27/12/20 Вск 17:41:54 1892472428
>>1892047
Спасибо, пока что робит.
Аноним 27/12/20 Вск 18:00:02 1892508429
>>1892308
И что? Следуя твоим дебильным мемасам, свобода это и есть UB. Когда можно делать всё, значит предскащзать действия невозможно. И тут нет проблемы. Поедсказать невозможно только со стороны, например дебил как ты или компилятор, который вообще машина, не сможет предсказать, но это и не нужно. Главное, что умный человек, либо не будет так делать, либо будет когда ему это нужно. Главное есть возможность, это всегда плюс. Важно что язык предсказуем, ты пишешь код заранее зная что он делает, буквально.

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

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

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

И вот таких чуханов объебосов, из говна залетевших в си-тред видно сразу. Си - четкий язык, поэтому программист на си всегда знает что делает, ведь есть доки. А залетные чуханы делают наоборот, пишут на авось от балды примерно так:
>char a[NN], b[NN]
>"введите 1 строку:", a
>"введите 2 строку:", b
>if (a == b) "строки одинаковые"
Потом запускают, не понимают результата, и бегут в тред с вопросами "а пачиму ниработаит?". Потому что привыкли писать хуету, сами не зная какую, чисто интуитивно, на авось "может прокатит". И вот этот вот пиздец эти ебланы считают протраммированием.
В си-то всё четко, прежде чем писать, читаешь доку, и заранее знаешь что получишь. Вообще не вопрос, проблемы не существует. А у хуесосов, в говне вместо языков, никакой ясности нет, язык - черный ящик, делает хуй знает что, вот и "программисты" тоже пишут хуй знает что, на удачу.
Аноним 27/12/20 Вск 18:06:18 1892518430
>>1892508
>пук
Дальше не читал. Ты не достоит программировать на Си. Все изящество программиста на Си в том, чтобы читать раздел J2 в стандарте языка, и избегать всяческого UB по коду. Ты не имеешь права с такими мыслями писать код на Си. Ты меня слышишь? Не имеешь права!!
Аноним 27/12/20 Вск 18:20:56 1892540431
>>1892518
>Дальше не читал.
Я и говорю. Быдло макаки залетевшие из своей параши в си - читать не приучены, не читают они, а значит не знают что пишут, тогда как программист на си - наоборот, сначала читает и уже знает, а только потом пишет. Или, еще яснее: если не знает, не пишет ничего, пока не разберется в том, что собственно собирвается напечатать в редактор кода. В си нельзя ебашить непонятный код, в надежде на авось или на "потом докрутить по результату". Это и есть тот самый, настоящий UB, UB головного мозга дебиломакаки, которой в си делать нечего.
Аноним 27/12/20 Вск 19:06:38 1892613432
>>1892508
Пчел, решил дать шанс твоему шизовысеру.
Так вот, язык Си не имеет никакого отношения ни к устройству, ни к его командам. Язык - это лингвистический конструкт. В языке Си нет никаких .bss секций, page faults и прочего. Зато в языке четко сказано что запись за пределами массива - UB, то есть лажа.
Аноним 27/12/20 Вск 19:30:12 1892640433
Есть ли случаи, где С++ показывает себя лучше?
Аноним 27/12/20 Вск 19:46:20 1892661434
Аноним 27/12/20 Вск 19:51:59 1892667435
Аноним 27/12/20 Вск 19:53:49 1892669436
Аноним 27/12/20 Вск 19:54:59 1892672437
Аноним 27/12/20 Вск 21:02:55 1892754438
Аноним 27/12/20 Вск 22:32:03 1892820439
>>1892613
>Си не имеет никакого отношения ни к устройству, ни к его командам. Язык - это лингвистический конструкт
Как в воду глядел. Как раз об этом размышлял, но писать было лень, а тут ты такой. Поражаюсь себе. То ли я такой умный, то ли глупцы такие предсказуемые. Хоть и отрицаешь голословно, но, по крайней мере, это говорит, что более-менее понял написанное. Уже хорошо. А то я уже привык к ответам уровня пеньков.

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

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

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

Ты полном дерьме, по уши, по одной простой причине – гуманитарное говноблядство безопасно. Ты можешь на дваче пиздеть любую хуйню, не зная, заливать в уши лапшу, и максимум тебя просто пошлют и всё. Именно так происходит в говне, Тебе просто либо выдается ошибка, либо получаешь не тот результат. Ничего страшного, просто крутишься как уж на сковородке пока не получишь желаемое. Обычная повседневная жизнь любого быдлана, бытовая философия – суть говношлепства.
А техника, машина – наоборот, очень уязвима. Машина – не автомобиль для быдла, а большой сложный механизм на заводе (компьютер) и пульт управления на всю стену с кучей лампочек, кнопок и рычажков, её интерфейс (язык си). Ты не можешь просто подойти, не изучив, что это за машина, как устроена и работает, как на неё воздействует каждая кнопка, и просто наугад тыкать гуманитарнным способом: «та кнопочка зелененькая, значит можно жать, будет только лучше, а вот та красная, значит лучше не трогать» и так далее. С машиной, любое неверное движение и она просто ломается нахуй. Поэтому говношлепов к машинам не подпускают, сначала требуют выучить всё и сдать экзамен. Иначе еблан первым же действием всё ломает нахуй. Тут не прокатит метод научного тыка как у говношлепов гуманитарных, вторых шансов нет, машина слишком сложная. Даже повторяя косяки, ты ничему не научишься. Только читать документацию заранее, до полного понимания куда ты лезешь.
Аноним 27/12/20 Вск 23:53:09 1892859440
>>1892820
Пиздец шиза. Не пиши мне больше.
Аноним 28/12/20 Пнд 01:06:19 1892917441
>>1892820
Интересно что будет когда этот шиз научится включать оптимизацию в компиляторе
Аноним 28/12/20 Пнд 02:25:16 1892973442
Что мне сделать чтобы вкатиться в эмбед по Си без образования? Хочу пойти получить, а вдруг прокатит и без него? Сам язык то знаю, пишу всякие приложухи. Говорят могут даже не знающего дауна на завод взять у которого есть вышка и за неделю научат.
Аноним 28/12/20 Пнд 02:32:49 1892982443
Нахуй создали ООП?
Аноним 28/12/20 Пнд 02:48:15 1892996444
>>1892982
Потому что поняли что писать сложную логику, в которой друг с другом взаимодействуют десятки пользовательских сущностей, на процедуропараше — пустая трата времени.
Аноним 28/12/20 Пнд 03:11:33 1893011445
>>1892996
>пустая трата времени
И придумали оопговно, лол
Аноним 28/12/20 Пнд 03:19:06 1893015446
Аноним 28/12/20 Пнд 03:55:41 1893036447
>>1893015
Пока что не знаю ООП, просто не понимаю почему вьебали это если в Си есть всё. Чем обосновано хуй знает.
Аноним 28/12/20 Пнд 03:56:35 1893037448
А хотя стандартный Си программист не знает даже слова пользователь.
Аноним 28/12/20 Пнд 04:02:49 1893039449
>>1893036
Школьнексон, плиз. ООП — это не о языке. Это концепция. И эта концепция старше чем езык погромирования це. Ты можешь на каком угодно языке писать в ООП стиле. И ты скорее всего и пишешь, просто не знаешь об этом.
Аноним 28/12/20 Пнд 05:39:29 1893099450
>>1893039
>Это концепция
Не нужная концепция
Аноним 28/12/20 Пнд 10:08:44 1893261451
>>1893099
>Не нужная
Ты же сам себя обосрал.
Аноним 28/12/20 Пнд 13:07:17 1893370452
Не ООП, ряяя.png 95Кб, 644x796
644x796
Аноним 28/12/20 Пнд 15:55:49 1893574453
>>1893370
Ляяяя, красота какая. У меня аж пиструн привстал.
Аноним 28/12/20 Пнд 16:29:05 1893600454
Аноним 28/12/20 Пнд 17:09:17 1893648455
Аноним 28/12/20 Пнд 17:27:34 1893677456
>>1893370
это у вас нормальная практика в си кастить
надеюсь структуры и мутабельные
Аноним 28/12/20 Пнд 17:39:47 1893699457