Это копия, сохраненная 4 июня 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или звездочки.
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: 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 (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
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? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
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. Kochan "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://www.iso-9899.info/wiki/Books#Learning_C
Прошлые треды:
- №16: https://arhivach.org/thread/235327/
- №17: https://arhivach.org/thread/237852/
- №18: https://arhivach.org/thread/243867/
- №19: https://arhivach.org/thread/248880/
Шапка: http://piratepad.net/bJ1SdmkZyu
освятил_тред(959643, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
#endif
#include <stdarg.h> сцуко!
Хуевое проектирование.
Имхо, вот эта книга неплохая для вкатывальщиков: http://shop.oreilly.com/product/0636920015482.do
Осиливал в оригинале, про качество перевода не знаю.
Хотя обложка и оформление слегка ебанутые
Судя по оглавлению, книжка, по крайней мере, лучше чем hard way.
http://shop.oreilly.com/product/0636920028000.do
Книга? По указателям? Следующей будет книга по булевой логике, хотя подожди-ка...
А что там вкатываться в си то? Открываешь стандарт и читаешь, хули, это не с++
Не можешь сходу осилить стандарт, учишь сначала питон
я вот такую годноту там нашел:
#define RAII_VARIABLE(vartype,varname,initval,dtor) \ void _dtor_ ## varname (vartype v) { dtor(v); } \ vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
автодестпуктор для мэлока
А завтра пишешь ты на Си
>__attribute__
Это из какого стандарта?
>>959906
Стандарт плюсов в два раза толще. Чтобы из 1300 страниц выудить полезную информацию о том, как писать на языке, надо иметь недюжий ум.
как мне сравнить одну последовательность нулей с другой?
Как обычно ищут максимум: заведи max_length = 0, max_offset = -1, а когда очередная последовательность нулей закончится, сравни ее длину с max_length, и если она больше, запомни новую max_length и офсет последовательности (если нужно). Алсо, сейчас у тебя просто количество нулей считается, а тебе нужно детектить переход между ноль-неноль и обратно.
>__attribute__
из гцц
>плюсов в два раза толще
пишу все гуи на кют ложив хуй на стандарты, все отлично.
стандарты это мокрописька для хипстеров.
else break;
Ананасы, как правильно сделать проприетарную bare metal либу? То бишь нужно скомпилять код и поставлять в виде какого-нить бинарного формата + хедер с прототипами функций, доступных пользователю и всё это добро должно нормально линковаться. Очевидная статическая либа из объектных файлов не подходит, т.к. таким способом будут светиться все внешние функции/переменные из объектных файлов, что довольно некрасиво.
Скомпилированы и лежат скорее всего в виде shared либы где-то в /lib
>пишу все гуи на кют ложив хуй на стандарты, все отлично.
ты какой-то даун совсем отбитый, советую рассмотреть суицид
Посмотри на sqlite amalgamation - собирай (скриптами) гигантский сорс и компилируй его (ну или инклудь .c в .c). Не делай символы внешними, используй static где только можно.
Неужели это всё нельзя сделать силами конпелятора или линковщика и нужно городить костыли? Ведь shared либы для больших операционок легко чистятся от излишних экспортируемых символов, даже можно всякими __attribuute__ в gcc явно задавать, что нужно всем видеть, а что – нет.
Может лучше просто скомпилировать либу в готовый машинный бинарник, написать функции-обёртки (т.е. обертки тех функций, которые должны эскпортироваться), которые вызывают _настоящую_ функцию по конкретному адресу, а также написать скрипт для линковщика?
Можно сделать средствами линковщика. Можно перепидорасить объектники как угодно, но подход sqlite требует меньше всего трудозатрат.
>в плюсах тоже самое
Только стандарт си++ никто толком даже из комитета не читал. Была же история, что какой-то чувак в стандарт по шаблонам написал стишок и его никто не заметил, т.к. никто не читал. В итоге так и приняли стандарт вместе с этой хуйней
Даже не поленился и нашел: страница 362 стандарта 2013 - пункт 14.7.3 Explicit specialization, подпункт 7, самый конец абзаца:
When writing a specialization, be careful about its location; or to make it compile will be such a trial as to kindle its self-immolation.
В общем-то всё получилось намного проще: нужно всего-то сделать
ld -r куча_объектных_файлов -o yoba.o
strip yoba.o --strip-all --discard-all (или какой-либо другой способ избавиться от неугодных символов)
Подход с запихиванием всех исходников в один файл хоть и полезный для оптимизаций, но нахуй не нужен в моем случае по крайней мере пока хватает места на флешке, лол
Тупорылый петухевен, у тех двух ньюфагов тоже нет никаких неудобств с просмотром хедеров. До них не доходит, что реализации функций в хедере уже скомпилированны и не доступны для просмотра.
этот дебил у вас тут - местный клоун?
Я вчера ночью придумал решение.
Короче: http://www.stanford.edu/class/ee398a/handouts/papers/WittenACM87ArithmCoding.pdf
Длинее: Хранить выборки в массиве ты не сможешь, если число будет слишком большим (число выборок - примерно N! ). Тебе нужно закодировать упорядоченную выборку из набора числом, и потом по требованию разворачивать выборку в строку или ещё во что (то есть, у тебя массива не будет. У тебя будет функция).
Упорядоченная выборка некоторого размера M из набора N - это вектор из M чисел (индексов в наборе) от 1 до N-k где k - номер числа в векторе (число оставшихся вариантов зависит от того, сколько элементов уже выбрано, и каждое число обозначает номер выбранного продолжения в списке оставшихся).
Когда ты сжимаешь текст арифметическим кодированием, ты используешь индексы. Вот и здесь у тебя индексы, их ты и сжимаешь в одно число, и после этого каждое число ты сможешь развернуть в уникальную перестановку (зная размеры набора и выборки).
Например, выборка {1,7,4,8,9} из {0 ... 9} будет представлена дробью
1/(101)+6/(910)+3/(8910)+5/(78910)+5/(6789*10)
10 - размер набора.
EOL-символ тебе не нужен.
P.S. Если тебе нужно объединить выборки всех размеров в одну, то EOL-символ тебе понадобится.
На вашем говне еще что-нибудь пишут? Кроме корявых драйверов к какому-нибудь линуксу?
Все программы от А до Я на C99/C11 пишутся.
Аноны, у меня сортировка данных, вывел сам процесс в функцию, нужно посчитать кол-во обменов и перестановок. Можно задать цикл со счетом обменов/перестановок в самой функции, чтобы потом вывести это кол-во в консоль?
>Где они?
Можешь купить у майкрософт.
>Source code for runtime libraries is included in Visual C++[15] for reference and debugging (e.g. in C:\Program Files\Microsoft Visual Studio 11.0\VC\crt\src).
Как это устроено у красноглазиков не знаю, но думаю надо будет сделать apt-get install libc6-dev или нечто подобное.
В голосяндру.
Обычно у вуза тем более технического есть программы содействия трудоустройству выпускников, в твоем нет?
Дрочи электронику и иди пилить прошивки или ищи более нормальные языки. С поиском работы на Си в России все крайне хуево, всем нужны веб-макаки.
Ну щас тенденции такие. Байтоебство осталось в 90-нулевых, сейчас в рашке онли тырпрайз, делать сайты или писать приложения под ведроид. Но ты всегда можешь завести трактор и работать в нормальной ит компании, где еще пишут на плюсах/си - разные интол(интернет вещей), геймдев компании и тд
In any linux stdlibc installed by defaul in /lib64 headers in /usr/include
>>960782
>>960785
Спасибо, посоны, за эдвайсы. В вузе вроде были приколюхи в виде летних школ, курсов там каких-то, но я всё проебал, занимаясь полезными (нет) делами. Теперь вот чекнул вакансии, а там всякие модные слова и ваще всё то, что я не знаю и не умею. Прикольно вышку получил, хех. Не гоню на вуз, что типо зря учился, но кушать тоже хочется.. вот и думаю - что делать и куда идти.
1) Закрывать-то файл зачем? Сделай rewind или fseek(file, 0, SEEK_SET) после ftell().
2) Ты уже знаешь размер, но читаешь посимвольно. Делай сразу fread всего файла, пусть рантайм разбирается и читает так, как ему там удобнее читать.
3) Выделяешь n байт, читаешь n байт. В результате строка у тебя останется не завершенной нулем (если в файле нулевой байт не встретится). Выделяй n+1, явно делай str[m] = '\0' после чтения, где m = количество прочитанных байтов.
Добрый вечер, могу ли я в функцию ввести цикл для подсчета количества сравнений и обменов?
Хуй знает, что это и зачем, но либо считай руками (для сравнений счетчик можно прямо в сравнении увеличивать: if (compare_counter++, foo < bar) { ...), для обменов тем более никаких проблем. Либо сделай отдельные фукнции compare и exchange, и увеличивай счетчик в них.
> Кол-во сравнений
Это же просто обмен двух элементов местами. К чему этот комментарий? Массивы чтоль сортируешь?
В 2017 он единственный язык, на котором пишут игры.
Актуален, но лучше бери Unity и C#, быстрее вкатишься, а не погрязнешь в хелловорлдах и движкостроительстве. Алсо, тут тред не про кресты, вообще сходи к детям в /gd/ лучше.
> лучше бери Unity и C#
Попробовал сначала на жаве, но 90мб в озу на перемещение спрайта меня как то оттолкнуло. Юнити тоже выдает много мусора. Схожу в общем посмотрю что в /гд говорят.
В юнити и вообще готовых движках ты нормального потребления не добьёшься, да и производительности нормальной тоже. Зато программить на этом сможет даже ребёнок, всё максимально просто.
Если же хочешь, чтобы ресурсов мало выжирало и летало, то пердоль OpenGL/Vulkan на Си/Крестах, но на этом ты само-собой ультра йобу в два клика не сделаешь, тут думать нужно.
> 90 мб
Дай угадаю, а без спрайта хелловорлд ты не мерял? А чем всякие commit/reserve/heap отличаются не знаешь? Ничего плохого в 90 мб нет, если это не 90 мб на каждый спрайт. Тот же майнкрафт на моем старом 2 ядраодин целерон-2 гига середины 2000х упирается в проц, а не в память.
Вооот, уже начинают советовать делать свой движок... да еще на вулкане. Ты сам свой движок закончил? Ты представляешь, сколько нужно итераций "сжечь и переписать", чтобы у человека без предыдущего опыта в движке появилась архитектура? Сколько человекочасов, чтобы добиться современного уровня графики? Сколько соломки нужно подстелить для legacy-дров с багами? Сколько времени можно было бы потратить на разработку самой игры?
Сам пилю йобу на С в свободное время, но я старый и глупый, не повторяйте моих ошибок.
Если у него есть желание, то не вижу проблемы. В любом случае я сказал как есть:
Движки — быстрая разработка, тормоза, высокое потребление памяти.
Велосипеды — долгая разработка, высокая производительность, маленькое потребление памяти.
Алсо, если он хочет пилить 2D игорю, то тут всё просто.
>Сам пилю йобу на С в свободное время
Покажи скриншоты или что у тебя есть. Интересно.
мимо-крокодил
>legacy
Ненужно совершенно.
>дров
mesa-vulkan твои дрова, сам движок под wayland пили.
>человекочасов
Ты же не йобу собрался разрабатывать, сделай простую либу чтобы импортировались .blender файлы и все.
> legacy Ненужно совершенно.
Поэтому удел линукса - сервера.
> mesa-vulkan твои дрова, сам движок под wayland пили.
А почему это плохой совет, читай двумя строчками выше.
> сделай простую либу чтобы импортировались .blender файлы
> простую либу
> простую
> .blender файлы
А чего не .mb сразу?
Неа, совсем не палишься
Живу в рашкованском миллионнике и байтоёбствую под эмбедед и не только в продуктовой компании. ЧЯДНТ?
А много таких систем-то? Из популярных я имею в виду.
Не, ну я предполагал, что Сетунь-70 не поддерживает подобное, но из современных, есть какие-то значимые примеры?
Avr могу предположить, но там только в силу размера же.
Что за компани? Или это типичная оборонка?
> Кто-нибудь навскидку назовёт в пример подобную систему?
DSP, где память адресуется 24- или 32-битными словами?
У нефтянки и прочих недрокопателей софт до сих пор пишется и поддерживается на с/с++.
#include <stdio.h>
#include <setjmp.h>
jmp_buf env_generator;
int range_generator(int max)
{
int val = setjmp(env_generator);
while (val < max)
{
val++;
return val;
}
return -1;
}
void main()
{
for (int result = range_generator(10); result >= 0; longjmp(env_generator, result))
{
printf("Result: %d\n", result);
}
}
>генератор, типа питоновского/шарповского yield
нахуя? если нужно нечто подобное, используй итераторы, а не такие кривые велосипеды
Какие итераторы? Мне нужно на чистом Си.
Генератор, который выдавал бы значения внутрь цикла for и while (например, числа от 1 до 10) без хранения их в памяти.
Всё равно тебя не понимаю.
1) НАХУЯ тебе этот генератор в C??
2) setjmp - эту ебанину крайне редко используют в очень узких задачах. Ты уверен, что это надо в твоём проекте? Что ты пытаешься сделать?
>без хранения в памяти
Манямирок, отдельно функция и переменная не подойдет?
Если цикл один то и функции не надо.
Но вот итераторы раз они тебе нужны.
http://stackoverflow.com/questions/4961860/iterator-in-c-language#4962050
В С так не делается, не переноси свои ебанутые привычки с первого языка на все остальные, учи C и как на нем пишется код, а не переводи в своей голове с питона.
как хочет так пусть и делает. зато быстрей вкатится.
Не соснет ли такое решение по сравнению с обычным последовательным? Вычисли сразу все а потом делай что хотел.
Соснет, этот дебил хочет функциональщины в насквозь процедурном языке. Для этого и изобрели пайтон.
>Генератор, который выдавал бы значения внутрь цикла for и while (например, числа от 1 до 10) без хранения их в памяти.
Освобождай вручную и передавай ссылки, но это все хуита.
Библиотеку для коллекций с ленивыми вычислениями.
На С можно функционально писать. Но меру всегда надо знать ато бутет сосо в производительности или даже стековерфлоу. Лучшего кода за функциональный нет, писать удобно, никакого дублирования, маленькие исходники, но вызов функции сам по себе потребляет ресурсы.
longjmp предназначен для переходов внутри функции, или для "выпрыгивания" по стеку вызовов наружу. Если функция, которая вызвала setjmp, завершилась, можешь считать, что jmp_buf содержит мусор.
success=scanf("%d", &a);
printf("Введите b и с\n");
uspeh=scanf("%d %d", &b, &c);
Не могу заставить scanf считывать с новой строки b.
Просто пользователь может после первого сообщения ввести два числа, в переменную a попадёт первое введённое, а вот scanf-ить числа b и с уже надо со следующей строки.
А у меня если юзер введёт после первого сообщения "14 88", а после второго "13 37", то
а=14
b=88
c=13
А надо:
a=14
b=13
c=37
success=scanf("%d\n", &a) не помогает
Дак лол, не могу же.
Энивэй, если я попрошу вводить по одной цифре, то пользователь может ввести две по описанию задания. Алсо, он может ввести N переменных. Надо считать только первую, а потом заставить следующие scanf считывать с другой строки.
putchar('\n') не помогает
Почему не можешь?
Программа должна писатся для трезвого пользователя.
Можешь все за один scanf считать.
> Программа должна писатся для трезвого пользователя.
Не у меня. Понимаешь, я мог бы всё аккуратно сделать через гетчары, перевод в числа и обстоятельные проверки всего и вся, но я так не сделаю, пока меня не обоссут, а пока просто сканфики скобачки.
> Можешь все за один scanf считать.
Не могу. Там дальше в программе надо будет считать разные данные в зависимости от хода программы, это и мешает, причём ужасно.
> стандартных путей нет, кроме да, считывания.
Это и есть стандартный путь после scanf failure. Вычитать остаток строки и запросить данные заново.
Пыня плиз.
Железо все стерпит, процессоры с каждым годом все мощнее, 5GHz, дохуя ядер, scanf это ничто.
>>961848
Сожрать остаток строки можно самим scanf-ом: scanf("%∗[^\r\n]"). Взять число и выкинуть остаток строки можно, чуть исправив формат: scanf("%d%∗[^\r\n]", &n) (звездочки только на нормальные поменяй). С чтением одного числа из одной строки (а также нескольих чисел из обязательно одной строки) сложнее: самый простой подход - использовать fgets+sscanf, самый правильный - fgets+strtok+strtoul и прочие strtoX.
Спасибо, годно
Дак да, но блин, я уже сталкивался с таким, что позиция, с которой будет считан следующий getchar() не совпадает с позицией, с которой будет считан следующий scanf().
Или у меня тогда проблемы были не с этим. Но приходилось писать scanf("%d\n") - только тогда всё работало В общем, я осторожничаю с этими вот читалками.
В прочем, ты был прав. С гетчаром всё работает, я не смог сбить его с толку
Минусы: eбиная дирeктива компилятора, что шатаeт кросплатформeннсть, и нeвозможно динамичeски описать поля структуры, eсли парсятся извeстной формы набор байт.
Какиe ваши прeдложeния?
а, кстати, не ебу о чём ты там, но структуру можно объявлять динамически внутри функции.
типо как
f(a,b) {
struct a {
c[a];
d;
}
}
В прошлом треде (или позапрошлом, не помню) дохуя об этом срали, сходи почитай - ссылки в шапке.
Диванный нуб залетает в тред. Вылечил проблему банальным fflush(stdin); перед втором сканфом.
Лол, диванный это я. 3-й курс шараги еще.
И это еще раз иллюстрирует нам, насколько сильно комитет злоупотребляет UB. Здесь вполне можно было бы обойтись unspecified behavior.
>И это еще раз иллюстрирует нам, насколько сильно комитет злоупотребляет UB.
Не дорос ты определять, злоупотребляют или нет.
Удивитeльно, но да. Но крeстах совeршeнно нe хочeт так дeлать. Совeршeнно нe понятно, почему в сишкe работаeт
> Совeршeнно нe понятно, почему в сишкe работаeт
Потому что в C99 есть VLA, а в C++ их не взяли
8ll x 1024 x 1024 x 1024
Ну или long long gigs
Пик
>>962540
Я разобрался, кароче когда пофиксил число и оно стало не ноль выяснилось что винда тратит половину свободного места в никуда, я в итоге выделил но меньше.
Если у тебя size_t - unsigned int, значит у тебя 32-битная система, и выделить 8 гигов ты не можешь никак. И в закомментированной строчке на пике у тебя именно 8 гигов, а не 1. Память мы считаем в байтах, а не в битах.
Это я понял, но я также слышал что-то про pae и я не врубаю что это тогда если с ним всё равно ничё нельзя на 32битной
Я тебе уже пояснял за PAE (в винде это AWE). Выделяешь кусок адресного пространства, сколько не жалко - это "окно", и когда тебе нужно что-то положить в память или прочитать, просишь систему в это "окно" показать кусок оперативки. Выделить так можно более 4 Гб, но видно одновременно будет только столько, сколько размер твоего окна. Т.е., при желании ты можешь несжатую картинку 65536655364 байта (16 гигов) положить в память, но не можешь без дополнительных телодвижений обращаться к рандомному пикселу внутри нее. В 64-битной системе ты можешь делать банально bitmap[y * width + x]), а с PAE ты сосешь хуй: чтобы что-то прочитать или записать, тебе придется "отобразить" регион, содержащий пиксел в твое "окно", и потом внутри этого окна с пикселами работать, по необходимости сдвигая окно (т.е., отображая на него различные страницы физической памяти). Гугли AllocateUserPhysicalPages/MapUserPhysicalPages, только нахуя тебе это надо - непонятно.
причём тут язык c?
ты не как не можешь иметь на 32битной машине больше адресов чем 4к. это по стандарту невозможно.
не знаю как работали всякие виндовс сервисы - наверно также, на один процесс 4к адресов, просто сумма реальных больше.
В компиляторах Си они нахуй не нужны. Это достаточно низкоуровневый язык, чтобы извращениями занимался не компилятор втихомолку, а ты сам и явно. У тебя задача-то какая? Почему ты не можешь воткнуть 64-битную систему, если есть потребность в огромном адресном пространстве?
хотя нет, как же тогда системные библиотеки с их типами. да, это уже вопрос ос а не компилятора, наверно.
Смысла нет. Это был переходный механизм, когда 64-битные наборы инструкций еще не существовали (или были мало распространены), а возможность воткнуть более 4 Гб уже была. Да и юзкейсов, когда тебе нужно, много гигов на один процесс, не так уж много. Гораздо чаще хочется иметь много гигов для разных процессов - вот эту задачу PAE, в общем-то, и решает.
Пытаюсь сделать через raw-сокеты отправку пакетов с спуфом ип-адреса источника. Трабла в том, что софт запускается на роутере с включенным NAT и этот NAT заменяет в отправляемых пакетах любой адрес источника на внешний ип-адрес роутера, т.е. спуф идет по пизде.
Если ли способ может через установку какой-либо опции для сокета или может твик ядра линукса через /proc/sys/net/ipv4/ или еще как-то заставить блядский NAT не подменять адрес источника в пакетах, которые были сгенерированы на самом роутере?
Тебя ебёт это, что ли?
getchar() считывает символы, число можно собрать по цифрам
Таки вопрос:
Что б такого написать? не совсем нуб, но и сверхъестественное не надо, сроки как-никак. Думаю что-то типа библиотеки замутить, но выглядить слишком просто.
Можешь еще мыльце или вк добавить к записям.
Окай, спасибо за идеи, няш :3
Как после каждого занесения элемента в массив увеличить a на один, а потом вывести эту a в консоль, ничего не работает, выводиться всегда ноль.
Ну не стал весь код кидать.
Через printf("%d",a);
Возможно в выводе ошибка, первый раз с функцией работаю
Они же у тебя локальные. Ты выводишь какие-то другие "а" и "b"
Спасибо, анон, что-то не дошло, что проблема в выводе
Там дальше два счетчика для i и j должно быть как я понимаю,потом if(i<j),дальше без понятия как действовать.
А, это у вас тут такие правила , я понял. Больше не буду значит тут помощи просить. А в ротешник сам себе нассы ,дядя.
Вообще нет, походу дохуя в крестотред перебралось.
Делай массив, указатели не забывай освобождать.
Конечно лучше все на перед статически инициализировать.
Спасибо
Ньюфаг ворвался в тред.Собираюсь начинать.Как настроить чертов visual studio под C?
спасибо,антон
Никак, ничего настраивать не нужно. Ставишь Visual Studio, создаешь пустой C++-проект, добавляешь новый файл, сохраняешь как .c.
Нет и не может быть. Препроцессор, встречая #include, просто заменяет эту директиву на указанный в ней файл, поэтому для компилятора "пределов .h файла" просто не существует, существует только единица компиляции, а уж из чего ее препроцессор собрал, компилятору насрать.
Бля, и с функциями та же хуйня. А я почему-то думал, что static функция за пределы своего файла не выползает. Пизда.
static-функция не выползает за пределы юнита. Если ты пишешь header-only либу, то во-первых, сделай дефайн, чтобы различать включение для деклараций (многократно в проекте) и включение для реализации (однократно, с дефайном), а во-вторых, используй неймспейсы для бедных - добавь уникальный префикс или суффикс ко всем используемым символам. MyYobaLiba_ вполне подойдет. И похуй, что там будет торчать после этого.
Да я наверно просто от .h-only откажусь, так логичнее будет.
Это нужно будет создать .h файл с хедерами функций либы, скомпилять сошку "gcc -shared -o lib.so -fPIC lib.h", и для использования моей либы придётся просто инклюдить .h файл и компилять с -Llib.so, я правильно понимаю? Ни разу так не делал, всегда .h файлами обходился.Тайпдефов либы тоже видно не будет?
Header-only место в аду. Ты ведь не набиваешь параметры компиляции в командной строке руками, ведь правда?
Собрал на visual studio проект.Поменял разрешение в c..Запустил через конфигурацию решения release.Пишет.что не удаётся найти указанный файл
Антивирусы есть? Какая студия? С нуля ставил? Есть ли файл на диске? Есть ли русские буквы в пути?
Ану-ка попробуй собрать в Fedora GNU/Linux
Спермопроблемы-спермопроблемушки
> Ты ведь не набиваешь параметры компиляции в командной строке руками, ведь правда?
Вчера осваивал Makefile, было больно.
Прошу немного пояснить мне за либы. В моей либе есть структуры, много структур. И, допустим, мне нужно, чтобы пользователь либы мог работать с одной из них, например со структурой "type". Если я просто слинкуюсь с либой и начну использовать эту стуктуру как тип, то компилятор ругнётся. В структуре много вложенных структур, например "type->str", но в .h файле либы, который я создал во избежания еггогов просто написано:
typedef struct {
void *str; // Хотя в либе это большая структура
} type;
При таком варианте можно обратится к элементам структуры "type->str"? Сам проверить сейчас не могу, да и долго это, ответь же ты, тредик.
> Header-only место в аду.
Вот ты так говоришь, а пока от необходимости делать отдельную библиотеку я испытываю одни неудобства. Как минимум всё переусложнено.
Может кто доставить, так скажем, туториал о оформлении своей библиотеки? Вчера искал, не нашёл.
это не местные, это залётные
Пиздец, чего только обезьяна не надобавляла в эту анонимную социалочку. Пойду лучше на возрождённую мяту. Сажи этой помойке.
Какая же годнота С, по сравнению с жавоскриптом.
Сейчас дочитываю первую книгу, с синтаксисом разобрался, подскажите что можно написать на С?
Сегфолт
> подскажите что можно написать на С?
Все что угодно. Просто тратить время чтоб написать на Си какую то веб-перделку никто не будет, на нем пишутся сложные хуитки, быстрые хуитки (если не делать говнокод), много всего.
В первый раз я написал небольшую чит-программу которая использовала драйвер для скрытия от античит систем, банальные хуки в таблице SSDT ядра Windows.
Я уже не школьник, когда впервые этим занимался тогда был школьником, дико доставляло копаться в ядре. Всяким JS макакам вряд ли такой адреналин доставляет их макакинг, верно?
>хуки
в usermode довольно сложно реализовать правильные Inline хуки, т.к требуется дизассемблер длинны функций, иначе можно испортить все.
Системное программирование немногим сложнее веб-параши.
Вот такую штуку:
https://ru.wikipedia.org/wiki/Apache_Spark
на Си не напишешь.
В том то и дело, что это совсем другой мир.
Тут уже залетный из жс отписался, но как по мне, веб быстро надоедает. Даже несмотря на "обилие" языков, по сути все одно и тоже. А фронт-енд это такая хня, что лучше туда не лезть вообще. И дело не в сложности, как раз сложного там мало, но все приедается быстро.
Поэтому и пал выбор на С.
манямирок тупых байтоебов, не знающих алгоритмов и J-нотации и считающих, что выучить набор инструкций процессора сложнее, чем набор классов и методов в веб-фреймворке
манямирок тупых байтоебов, не знающих алгоритмов и O-нотации и считающих, что выучить набор инструкций процессора сложнее, чем набор классов и методов в веб-фреймворке
1. Императивный стиль программирования как начало байтоёбского пути.
2. Дрочка на машинно-ориентированные типы данных (собственно, основной симптом байтоёбства) и последующее за ней закономерное возмездие байтомудакам в виде big endian vs. little-endian, особенности обработки чисел с плавающей точкой и.т.д.
3. Предтерминальные стадии байтоёбства - интринсикоёбство и его более тяжёлая форма - инлайн-ассемблероёбство. Подсадка начинается с убеждённости поциента в необходимости ручками использовать SIMD -инструкции.
4. Терминальная стадия, как итог п.3, тру-ассемблероёбство и "хроническая низкоуровневая оптимизация головного мозга"
1. Гейдев. Байтоёбство в гейдеве берёт своё начало в 70х-80х, поскольку именно тогда зародилась традиция байтоёбства в геймдеве. Обязаны этим, в основном, восьмибитным соснолям и домашним компьютерам, которые, обладая малым объёмом ОЗУ и имея скудные средства программирования, требовали делать на них ёба-игры. Эта традиция продолжилась и далее, всё благодаря тем же консолям, на которых консолерабы должны были выпускать игры 5 лет, задрачивая их убогие байтоёбские архитектуры по полной. К сожалению, подобная практика перешла и на ПК, где байтоёбство, в общем-то не так оправдано. К слову байтоёбам-игроделам дали шанс выбраться из этой трясины в 2002 году, когда майкрософт запилила дуднет и менеджед дайректикс к нему. Но байтоёбы остались верны своим указателям, плюсам и байтоёбской оптимизации. Зашоренность, верность привычкам, безыдейность, десу.
2. Эмбеддед. Причины почти всё те же, что и в гейдеве. Маломощное железо, пара сотен байт озу, деревянные игрушки, прибитые к полу и.т.д. К этому прибавляется огромное количество разных железок разномастных архитектур, для которых нет толковых тулчейнов. Из хорошего - в последние годы байтоёбство в этой сфере потихоньку излечивается, спасибо дядям из ARM co ltd, сделавшим свою архитектуру более менее распространённым стандартом среди всех архитектур и огромному количеству появившихся фреймворков и компиляторов языков для этой платформы.
1. Процессорная архитектура
2. Memory map - адресное пространство, в которое отображаются RAM, ROM и внешние устройства
3. Протоколы управления этими самыми внешними устройствами.
Так вот, всё вышеперечисленное вполне можно вполне декларативно описать обычным конфигурационным файлом, не прибегая к программированию вовсе. Затем, скормить этот файл генератору платформ и на выходе получить готовый фреймворк-скелет нашей операционной системы, доступ к которому можно получить из любого языка программирования. Вот так вот просто, если бы байтоёбство гологного моска не мешало.
Это слишком просто для него, его ждёт смуззи и очередной круд.
Все с чего-то начинали.
>>965375
>>965376
ты забыл начало:
Машина должна и будет служить людям, она не шлюха, чтобы люди исполняли её прихоти. Отсюда ба йтобляди (а так же сочувствующие им императивные пидорасы, надрачивающие на показатели clock() - start) - пиздолисы, которые опускаются до полного говноедства, лишь бы ублажить её регистры и микросхемы.
Альфапрограммисты, как и положено альфам, если машина не выполняет положенных ей задач и требует пресмыкаться перед ней и ублажать её байтами, просто берут и за патчкорды, ебашат с вертушки по передней панели и списывают машину на мороз, купив взамен ту, которая не будет выёбываться и выполнит код в сроки и без выебонов, будь там хоть 1000% неоптимизированного оверхеда. И настоящего программиста не волнуют вопросы выдрачивания и быстродействия - он решает важную задачу из предметной области гораздо более сложной, чем низкоуровневое дрочево, и отвлекаться на всякую подзалупную хуету вроде осоьбеннойстей какой-то там архитектуры ему некомильфо.
Байтоёбство включает в себя:
некоторы шаги есть в любом направление. высер того анона напоминает кукарекание петухатиков где у них есть еба теории в которых все заебись но на практике абсолютно не реализуемы да и оторваны от реальности
Портируй на Vulkan и Wayland самую лучшую в мире читалку - mupdf
Есть
Очень нравится язык, наскачивал книг, одну уже осилил для нубов, одну даже планирую купить, очень охуенно там все разложено, плюс примеры интересные.
Но вопрос такой: есть ли с С работа? Например со знанием пхп/жс ее порядочно, даже выбирать можно. Что вообще пишут на С? Только драйвера и ядро линукса? Что еще параллельно подтягивать вместе с самим языком?
У нас в основном на С пишут что-то связанное с железом. Не сколько драйвера, сколько прошивки микроконтроллеров. Но в этой отрасли зп ниже, чем в веб.
А крутые чуваки, да, пишут всякие СУБД, Highload-бекенды и подобное. Но это в долине
Писать на нем можно то-же что и на плюсах пишут.
Если ты PHP-шник.
То знание C выводит тебя на новый уровень знания того-же PHP и сервера.
ТЫ можешь сам писать патчи и расширения к языку.
нет
Какую книгу собираешься купить?
Есть 2 файла: данные и результат.
хочу считать данные с одного тхт файла и чтобы результат был напечатан в другом.
На fprintf() посмотри.
Погугли немного.
Поставил Clang.
Пишу:
clang hello.c
А он мне:
hello.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^~~~~~~~~
1 error generated.
Как сделать, чтобы работало?
>Поставил Clang.
Юзай cmake, а там через env уже легко компилятор настроить, чтобы он генерил правила сборки без гемора.
>Что вообще пишут на С?
Практически все. Модули ядра для разных осей, реалтайм ос, гуишный софт, веб серверы, плагины для веб серверов, базы данных, интерпретаторы (хотя тут и на C++ благодаря темплейтам с генериками наркоманы любят обмазываться и грамматики разбирать), компиляторы, проще сказать что на С не пишут.
Для машины файл ничего лишнего содержать не должен, а отчеты отдельно генерируй.
Анон, подскажи.
Почему в топовых вакансиях (с/с++) требуется знания си?
Я понимаю, что си - фундаментальный язык, очень приближен к работе с железом. Но, разве все то, что используется в си, используется в с++. Если не брать в расчет базовые вещи вроде типов данных, циклов и т.д.?
По большей части кресты - это надмножество си. Соответственно, зная кресты, ты можешь кое-как писать на си. И тебе может понадобиться использовать или исправить сишную либу, например.
Со знанием си кресты учатся быстрее (ну или си со знанием крестов). Знания си мешают писать в "крестовом стиле" на первых порах - получается то, что называется "си с классами". С опытом проходит.
Варик просматривать дизасемблированные листинги и гадать - не оч
Тут есть отдельный тред >>960640 (OP)
> Можно ли как-то по бинарнику узнать для какой ОС и под какую архитектуру он был скомпилирован
Да, можно. readelf/objdump/dumpbin/различные PE-редакторы. В целом зависит от формата бинарника.
> можно ли узнать calling convention
Нет. Если явно не указать calling convention, современные компиляторы могут менять ее от функции к функции и от билда к билду, передавая аргументы в разных регистрах, выкидывая неиспользуемые аргументы нахуй и т. д. Если было явно указано при компиляции - можешь посмотреть дизасм, это не гадание, там все очевидно после двух-трех функций. Иногда из бинарника торчат декорированные экспорты (или есть отладочная инфа, например), тогда в там кодируется и конвенция.
https://developers.redhat.com/blog/2017/02/01/october-2016-iso-c-meeting-report/
Мне надо знать calling convention чтобы собственно и определять аргументы функции. Причем не заглядывать самому каждый раз в бинарь, а написать такой парсер, который будет говорить где лежат параметры(т.е. названия регистров или смещение в стеке) для каждой функции. Такое вообще можно реализовать?
Ну смотри, для x86 у тебя есть: регистры, стек, fpu/sse для floating point. Это на вход. На выход у тебя могут быть eax, edx:eax, fpu/sse, стек (для структур). Все это компилятор может смешивать в любых пропорциях. По-хорошему это "решается" написанием dataflow-анализатора, причем анализом одной функции не обойдешься (foo: add ecx, 20 ; jmp bar - какие аргументы у foo?), причем анализ все равно будет изредка лажать, как бы ты не изъебывался. Если тебе только thiscall/fastcall/cdecl/stdcall различать - тогда анализ проще, процент успеха выше (но не 100% - IDA постоянно лажает), можно использовать всякие эвристики (обращение к ecx без инициализации для thiscall/fastcall, retn N для stdcall, add esp после вызова для cdecl и т. д.). В общем и целом, проще всего взять IDA, пусть она проанализирует, потом сдампить тайпинфо скриптом, а при возникающих проблемах смотреть и руками править.
хеши тоже ведь проверять надо?
>>966962
Закинь сразу весь файл в оперативку.
Не перепроверяй то что уже проверил, а какой результат программы должен быть вообще?
>проще всего взять IDA, пусть она проанализирует
Так а как это сделать? Собственно я и хотел писать парсер, ибо в иде такой функции не нашел
Легкий гуглеж говорит, что это можно провернуть, если пользоваться другим декомпилятором от хексрейз. Но мне бы именно в иде
Иди в ваш загон, он тонет.
Ну начни с чего-то типа:
import idaapi
import idautils
for ea in Functions():
ti = idaapi.tinfo_t()
if not idaapi.get_tinfo2(ea, ti) and not idaapi.guess_tinfo2(ea, ti):
print('%.8x: <error>' % (ea))
else:
print('%.8x: %s' % (ea, ti.dstr()))
Посмотри на idaapi.guess_func_cc(), посмотри на idaapi.tinfo_t(). Документация говно, но на гитхабе встречаются чужие реализации, где можно подсмотреть, как с этим всем работать.
И вообще иди-ка ты в тред по реверсингу, тут у нас няшная сишечка.
Блядский питон, блядская макака! Пробелы сам расставишь.
Можно считать нормальным стилем ещё одно декларирование этого типа в виде:
typedef type type;
?
Никаких подводных камней нет?
Для наглядности хочу собрать все типы в одном месте и прокомментировать их.
Абсолютно нормально. На таком декларировании в заголовочниках в glib например описание объекта строится.
на поиск дубликатов наверное есть с десяток оптимизированных алгоритмов (по потреблению памяти, по быстродействию, в общем, на выбор)
так сложно это загуглить...
результат файл без повторов
потом еще утилитка uniq есть в coreutils..
те если это не учебная программка, а реальная потребность то проще ей воспользоватся
Возьмем список. Есть структура для узла и есть структура содержащая голову и хвост нашего списка, ну и количество элементов. В структуру с головой я решил засунуть указатели на функции для работы со списком.
Т.е. по итогу я хочу получить своего рода инкапсуляцию. Все что по итогу нужно для работы будет уже в структуре. Создали, вызвали функцию инициализации ну и работаем со списком в свое удовольствие, все методы сразу видны, на первый взгляд удобно, но нигде такого раньше не видел.
Указатели на функции в структуре . Для работы с этой же структурой
"Эмуляция" пространства имен, ну и для удобства.
Не видел в чистом си.
Более чем ок, если понимаешь, что делаешь.
Где брать задачи?
навыки уровня первокурсника есть в чистом си
на с# написал прогу, которая авторизовывалась в вк в отдельном окошке, причем сам нихуя не понял ничего
В цпп только виртуальные функции лежат в таблицах, и даже их современные компиляторы стараются девиртуализовывать.
>>968233
Есть случаи, когда хранение указателей на функции в списках вполне оправдано. Например, у тебя список разнородных сущностей, может быть хорошим решением хранить указатели на деструкторы в элементах, а не делать гигантский свитч при удалении.
https://pastebin.com/qjwbDm0p
И раз уж на то пошло, есть какие-то более лаконичные способы "броска" кубика у которого некоторые грани повторяются?
Няшный одноглазик научит тебя православной генерации случайных чисел. На крестах правда, но тебе то небось все равно.
Очевидно, что тебе нужно бросать кубик (вызывать dice()) внутри цикла (после do), а не снаружи. Алсо, random() - это что-то нестандартное. Наверное, ты имел в виду rand()?
> лаконичные способы "броска" кубика у которого некоторые грани повторяются?
Не делать if, сделать lookup. Типа:
#define countof(array) (sizeof(array) / sizeof((array)[0]))
const char ∗results[] = { "foo", "bar", "foo", "baz", "foo" };
int n = rand() % countof(results);
return results[n];
Но как правильно заметил >>968334 вот этот анон, rand() часто реализован очень некачественно, а rand() % n добавляет еще больше неслучайности из-за особенностей реализации LCG PRNG. Можешь так делать, так слегка медленнее и слегка лучше:
// Generates int in range [n1, n2] (inclusive on both sides). n2 must be > n1.
int random_range(int n1, int n2) {
return (int) ((rand() ∗ (1.0 / RAND_MAX)) ∗ (n2 - n1 + 1)) + n1;
}
Если это лаба - просто забей. Если игра, можно спиздить генератор получше.
Внутри цикла... Вот я рукожоп...
Спасибо большое! Видео смотрю уже. Досмотрю и постараюсь сделать всё кошерно.
Да, игра, для себя чисто делаю. Хобби типа.
Я тоже рукожоп. Там должно быть 1.0 / (RAND_MAX + 1), если что.
возьми линуксоидный кодстайл и не промахнешься
Вон на днях на хабре очередной высер выложили. Сходи почитай, если хочешь. Ну или на вики. Или у любого крупного опенсорсного проекта есть стайлгайд обычно. Общего стандарта нет, есть разные подходы для разных ситуаций, но в целом похуй, как писать, лишь бы одинаково во всем проекте.
Частично: можно сделать %3s%d и/или %[^0-9]%i, но там куча подводных камней. Лучше делай fgets и разбирай руками.
>>968608
Тащемта fgets'ом я разбираю файл, а потом построчно ковыряю sscanf'ом.
Просто проблема в том, что строка может иметь вид "[1-ый символьный параметр] [2-ой символьный параметр][числовой параметр]".
И если, к примеру, второй строковый параметр отсутствует, то конструкции типа
>%3s%d и/или %[^0-9]%i
обламываются, ибо проёбывают в том числе и числовой параметр. Хотя решение хорошее, да.
В итоге забил хуй, просто считываю как две строки, а вторую потом ковыряю strtol'ом, вытаскивая число, а остатки уже ковыряю на наличие/отсутствие нужных символов strchr'ом.
В любом случае, не для атомного реактора программу пишу, и так сойдёт.
Вот >>969091 такие. Но я еще не читал. Наверняка ведь это опция, ни один долбоеб не будет завязываться на мертворожденный графический апи.
>GTK4 will be rendered with Vulkan API.
ебать, они там рисовалку виджетов пилят джватцать лет. они и в 4 версии пытаются натянуть ооп?
> ни один долбоеб не будет завязываться на мертворожденный графический апи.
Так разрабы GTK и есть долбоебы. Новая версия - новые правила.
>пытаются натянуть
Не осилил glib? ООП там давно уже есть.
>рисовалку виджетов
Что это такое?>>969456
>мертворожденный графический апи
Ну да, сосачерам виднее.
До этого на С++ писал только в вузе проекты уровня Курсач1. Помню, access violation тогда постоянно сопутствовал на практике.
Как контроллер реагирует на access violation / кривой код? Возможно ли случайно сделать из контроллера кирпич неудачным кодом? Контроллер можно перешивать много раз
Discovery board с периферией (кнопочки, диод (должен быть), LCD дисплей). Воткнуто через USB к ПК, отладка. Как обычно, основа всего кода - бесконечный цикл. Вот там могут быть проблемы. Пока всё в порядке, но как-то тревожно
Ну диод ты врядли сожжешь, кнопочки тоже обычно не горят.
> ООП там давно уже есть.
надеюсь ты объяснишь почему они не взяли кресты, а сделали все через жопу? ооп на с, кек, долбоебища, структура с кучей ссылок на подпрограммы это типа у них класс, пиздос.
>надеюсь ты объяснишь почему они не взяли кресты
Хотя бы потому что в иксах Си - стандарт.
Хуяришь на Сишке, потом портируешь в свой любимый язычок.
>ооп на с, кек, долбоебища
> структура с кучей ссылок на подпрограммы это типа у них класс, пиздос.
Первые версии твоих крестов, транслировались в сишку.
> структура с кучей ссылок на подпрограммы это типа у них класс
так в крестах тоже самое почти, лол
>почему они не взяли кресты
кресты говно, да и биндить к другим языкам тяжело, а тут биндинг левой пяткой можно написать, я его для диплома к тиклю прикручивал
> Как контроллер реагирует на access violation
Как любой арм. Будет фолт, будет переход по соответствующему вектору из таблицы.
> Возможно ли случайно сделать из контроллера кирпич неудачным кодом
Нет, там критичный регион залочен, разлочить его случайно невозможно.
> Первые версии твоих крестов, транслировались в сишку.
А сейчас сишка и кресты транслируются в асм. Это повод писать на асме? Всецело двачую идею писать гуи на крестах или еще более высокоуровневых языках.
>Всецело двачую идею писать гуи на крестах или еще более высокоуровневых языках.
Ну, так и делают.
Только сначала пишут ядро на сишке, чтобы работало быстро и легко было портировать на другие яп. На си++ только ничего портировать не надо, все из коробки можно юзать.
Это не "дистрибутив". Это самостоятельная Unix-like ОС. К сожалению, так и не взлетевшая.
>Только сначала пишут ядро на сишке
пруф или пиздун, кьют изначально писался на плюсах. >>971157
>его для диплома
эгсперд ф треде, всем бояцо
>>971167
>Всецело двачую идею писать гуи на крестах или еще более высокоуровневых языках.
я про то, если мыслишь в рамках ооп то и выбор должен быть соответственным, а не как у гномопетухов.
> я про то, если мыслишь в рамках ооп то и выбор должен быть соответственным
Ты путаешь ООП и ээээ.... классы. stdio в сишечке - ООП, куча кода ядра Линукса на сях - ООП. Просто это не классы. Посмотри ссылку в шапке.
>куча кода ядра Линукса
это куча говна, а не ооп
>>971250
>ООП и ээээ.... классы.
кагбы не
>>971250
>stdio в сишечке - ООП
нет
гном, не рвись
> stdio в сишечке - ООП
> нет
Обосновать ты, как я понимаю, не можешь, только обзывать все говном.
>Обосновать ты, как я понимаю, не можешь, только обзывать все говном.
наркоман? или ты файловый хэндлер считаешь объектом класса?
эгсперд?
антон, не толсти
Он имел в виду FILE, но он не является хэндлом (дескриптором) - это объект, который хранит дескриптор и прочие данные, необходимые для осуществления ввода-вывода.
Да.
Методы посмотри в stdio, имена начинаются с f (и по историческим причинам несколько методов без f). Если для тебя методы - то, что пишется через точку после имени объекта, то я тебе сочувствую.
Понял.
у объекта есть указатель на себя, который неявно передается его методу, да, fd->read() а не процедурщина read(fd) и как минимум уничтожение объекта при выходе из области видимости. когда завезут приходи.
и чо? обыкновенное структуроебство.
> указатель на себя, который неявно передается его методу
Особенность реализации какого-то конкретного языка. Например, COM/DirectX - ООП, но на сишечке я вполне себе делаю obj->lpVtbl->Release(obj), и от этого оно магически не перестает быть ООП.
> как минимум уничтожение объекта при выходе из области видимости
Никаким местом не относится к ООП. Мало того, многие языки уничтожают объекты не при выходе из области видимости, а когда-нибудь. Мало того, для сишечки есть либа с подобным управлением памятью с автоматическим вызовом деструкторов.
>как минимум уничтожение объекта при выходе из области видимости
т.е. жаба — не ООП. Приехали.
ясно, и пронаследуешь от структуры FILE ты тоже и все это не перестанет быть ассемблером.
Ну наконец-то нормальный аргумент. Да, FILE нельзя наследовать, но он не перестает быть от этого объектом. Отличия FILE от структурного программирования - инкапсуляция. Содержимое структурок тебе доступно по определению, а содержимое FILE тебе стандартная библиотека показывать не обязана (хотя в большинстве реализаций ты его и видишь, оно все равно implementation defined, и ебать его напрямую - зашквар), с FILE работают только его собственные методы.
Спорщиком брюквы
>Да, FILE нельзя наследовать
>но это все равно ООП, просто там невидно
понятно, давай более весомые аргументы, а не эти маняфантазии
Из тебя прям аргументы фонтаном бьют.
>как минимум уничтожение объекта при выходе из области видимости
в objc этого нет, теперь он тоже не ООП?
Вот скажите, когда я переполняю, допустим, тип int, переход в отрицательное число отвечает стандарту? У меня при любом переполнении будет как бы начинать с конца данного диапазона. Или это зависит от реализаций там каких...
Алсо, гуглить пробовал, ну, такое себе.
объекты должны создаваться и уничтожаться не только по завершению программы и явном удалении, капишь?
>Всецело двачую идею писать
>GUI on C++
TOPKEK
Qt - buggy piece of shit.
GTK - masterpieces of code.
Qt app 2 times biger than GTK3 app, not to mention FLTK.
>Будущее это GTK4
шо, опять? с 98 года пердолят это поделие. оно же выглядит как говно, работает как говно и спроектировано как говно.
Гей-шлюхи со стажем тоже неплохо зарабатывают.
> 2017
> спорить об ооп
> в C треде
вы ебанутые что ли? это же моветон.
Что?
так что, приделы для безнаковых можешь скаставать 0xffffffff к соот. типу, перед этим проверев существование LONG_MAX, иначе - 0xffff. больше ничего придумать не могу.
Слишком сложно для человека, читающего вторую главу K&R. Ну ладно, не буду этим заниматься, просто выведу.
мудрый анон, что нетак с этим куиксортом? На 9 из 10 наборах дает верный результат, пытался осилить дебаггингом и в сухую, но все равно не могу понять в чем подлива.
не знаю как ты будешь переполнением выводить пределы. хотя знаю, создашь для каждого типа переменную, проинициализируешь нулями, а потом в рантайме вычтешь 1?
как хочешь.
Оно уже есть в glibc и работает там быстрее, более под железо заточено.
Чесно говоря не разбирал куиксорт, но читал, там больше кода было.
Написал подпрограммы для работы со стеком, не могу добавить с помощью нее элемент в стек. да, я даун
Где я обосрался? Хэлп плс
В этом и цель, тип написать библиотеку с подпрограммами для работы со стеком
Но сначала надо просто программу сделать, что бы протестировать их все, а я не могу добавить элемент
>>972036
>>972034
?
Странно, мы в универе изучаем Си и нам препод их давал, лул
Еще когда списки проходили
А что такое printf("%d сообщение\n") вам препод рассказать забыл? БЕГИ ОТТУДА И вообще, непонятно, чего ты хочешь. Элементы добавляются.
Разве я правильно все написал?
Ахахахаххахахахахаха, про /n рассказывал, ебать в голос чет
Просто у меня уже 4 утра, я по фасту написал то что в мэйне и сюда кинул, ибо хз
\n* ahahah
Нет, ты всё написал неправильно. Твой код не компилируется, половина кода не выполняется. В стек ты пихаешь неинициализированную переменную. Стеком называется вся структура данных, а не один ее элемент. Пишешь ты на смеси C и C++. printf ты не осилил.
Ахахах, на счет принтфа я тебе объяснил
Я не понимаю, о какой смеси Си и крестов вы говорите, что тут кроме new/delete с крестов?
В мэйне треш, я об этом и говорю
Тайпдеф просто по дефолту пишу перед страктом, хз
Энивей он не мешает
Вот скрин из нашей методичке по Си, delete/new тут есть
Либо вы меня троллите с этим, либо я совсем уже потерялся
Есть Ц и есть кресты. new/delete это штука из крестов, не из Ц. Может вас крестам учат, а ты не понимаешь этого?
> Энивей он не мешает
Он абсолютно ничего не делает, не добавляет никаких новых сущностей. Я даже не уверен, скомпилируется ли это в Си. Программа работает только потому, что в C++ теги (имена) структур сразу являются типами, и писать struct Имя, как в Си, не обязательно.
>>972063
В стандарте Си про каждую переменную говорят "объект". Это нормально.
Потому что удобнее.
Если люди так считают, они говорят #include <cstdio>.
А почему бы собственно и нет?
Строчка начинающаяся с int* a
Бляя, не знаю, что вы творите тут
Но теперь мне еще страшнее идти завтра на пару чем без этой программы
В общем так: идешь на пару, начинаешь возбухать, что вас учят крестоблядию вместо ламповой сишки. Говоришь, что из-за этого обмана не сделал программу
Бля, ну правда норм рофлите тут
Но я ночь не сплю, что бы написать эту хуйню до утра и в итоге вы меня так запутали что пиздос
Хз, просто я вчера показывал преподу эти подпрограммы, он немного подредачил одну и сказал все норм, просто сделай типо, что бы они запускались по очереди и все
> Не думаю, что препод может путать Си и кресты блять
Тут варианта два: либо всё напутал, либо ты.
Мы хотим спалить не твоего препода, а "Курсы ЦПП для дауничей из заборостроительного, 1 час в неделю", дурашка.
Как можно их попутать?
В крестах же iostream, using namespace, cin, cout etc
А у нас такого нет и никогда не было в курсе
> The maybe_unused attribute
ненужно. если есть варнинг на аюзед, возьми код в #ifndef NDEBUG.
> The fallthrough attribute
блевотина. для неосиляторов switch. серьёзно? если компилятор вам выдаёт такие варнинги, то это повод прописать ему в щи с вертушки и отключить этот клятый варнинг. вы ещё побольше скобочек вокруг & лепите, вместо того чтобы выучить приоритеты.
> возьми код в #ifndef NDEBUG.
У меня колбек, его вызывает либа. Что ты предлагаешь взять в NDEBUG? Как ты объяснишь компилятору и читателю, что ты не используешь аргумент намеренно?
> блевотина. для неосиляторов switch
Я пишу на сишечке уже полтора десятка лет (с лишним, если считать ньюфажество и фриланс). И все равно бывают случаи, когда я забываю break (обычно копипаст или мерж кода). И чаще всего fall-through хочется для case FOO: case BAR:. Хитровыебанная лапша с неявным goto c помощью switch не нужна и должна быть переписана.
> вместо того чтобы выучить приоритеты
Знаю приоритеты, очень долго писал foo << bar & baz без скобок. Когда с кодом стало работать большое количество людей, стало ясно, что мои знания и предпочтения не значат нихуя, читабельность гораздо важнее.
Рано или поздно все взрослеют, умнеют, перестают выпячивать знанания языка в своем коде и начинают писать читаемо.
> The nodiscard attribute
ещё одна борьба с варнингами. ебанутые.
> The deprecated attribute
комментарии писать не пробовали?
диагноз: отбитые.
> deprecated
> комментарии писать не пробовали?
У тебя есть код, использующий функцию сделать_хорошо() из какой-то либы. Код давно написан, работает и не требует изменений. Как разработчики библиотеки могут тебя предупредить, что они опять все сломали перепидорасили API, и скоро твой код перестанет работать? Ты читаешь документацию и хедеры каждой либы для каждого нового релиза?
> У меня колбек, его вызывает либа
не понял.
>И все равно бывают случаи, когда я забываю break
не знаю как это комментировать, не допускаю таких ошибок.
> читабельность гораздо важнее
> Рано или поздно все взрослеют, умнеют, перестают выпячивать знанания языка в своем коде и начинают писать читаемо.
ты просто оправдываешь своё превращение в макаку.
Давайте. Неплохо бы __attribute__((cleanup(...))) стандартизировать.
>Ты читаешь документацию и хедеры каждой либы для каждого нового релиза?
прикалываешься? что это поменяет? тебе всё равно придётся переписывать код. это вопрос в доступности информации - зачем это тащить в синтаксис?
> не понял.
Ты предлагаешь что-то ифдефать. Что именно?
void handler(int unused) {
terminating = true;
}
// Где-то в main.
signal(SIGINT, handler);
> ты просто оправдываешь своё превращение в макаку
Так для меня-то по прежнему нет проблем писать без скобок, делать for без тела или еще как-нибудь извращаться. Почему я вдруг макака?
>>972119
> тебе всё равно придётся переписывать код
Увидеть ворнинг, создать тикет и переписать в плановом режиме; переписывать с горящей жопой, когда разработчики либы все сломают или, хуже того, не трогать код полгода и узнать о проблеме от кастомеров, которым, как обычно, все нужно вчера?
> Ты предлагаешь что-то ифдефать. Что именно?
понятие не имел что такое вызывает варнинг. как у тебя это получается? -Wall -pedantic - ничего не выдаёт. и это странно выдавать на это, ведь есть множество функций с аргументами для совместимости, например.
>>972122
>Увидеть ворнинг, создать тикет и переписать в плановом режиме; переписывать с горящей жопой, когда разработчики либы все сломают или, хуже того, не трогать код полгода и узнать о проблеме от кастомеров, которым, как обычно, все нужно вчера?
теперь ты оправдываешь свою лень. это твои проблемы что ты не узнал что ЛОМАЮТ АПИ - нихуя себе история.
>>972122
>Почему я вдруг макака?
ну или нет. например, потому что поддерживаешь фишки которые всем усложнят жизнь и только тебе облегчат.
> Array Sections
вот это интересно смотрится, недавно думал об этом.
> как у тебя это получается?
Ну привет. -Wunused-parameter включается с -Wextra (ну или -Weverything в clang). И да, люди этим пользуются. И да, если у них что-то где-то для совместимости, они делают:
#define UNUSED_ARGUMENT(arg) ((void)(arg))
...
int handler(int sig) {
UNUSED_ARGUMENT(sig);
}
Классика жи. А теперь вот решили это стандартизировать, а новый синтаксис позволит не делать по хедеру на каждый атрибут, как было раньше (например, stdnoreturn.h /__Noreturn).
Вообще, когда я поднимал эту тему, я надеялся услышать мнения про синтаксис. GCC-шный вариант более вменяемо выглядит, поддерживается многими IDE и меньше ломает парсеры в тех редакторах, которые про него не знают. Или нет?
моё мнение: всё говно и всё равно придётся прятать за макросы.
Двачую этого. Развели тут
Хочу сделать консольную задачу, установил визуал студио, и вот такая херня выскочила.
Дело в том, что если нажать да - код все равно не будет работать, я и другие пробовал, 100% рабочие - не работает ничего.
Как исправить?
> код все равно не будет работать
Подробнее поясни. Покажи выхлоп компилятора из панельки Output. Скинь бинарник, если он не пашет. Проверь время и дату на компе.
Я так понимаю все дебыли перекатились из C++-треда сюда.
Сап, погромисты. Пик 1 - задания, пик 2 - прога. Я правильно понял задание и сделал или хуйня?
в моей такого нет
Ананас, прости за мою тупость, но я правда не знаю как сортировать. Вот написал новый простой массив. Почитал про всякие методы сортировки, но непонятно, в какой момент её нужно вставить, например, в пикрелейтед?
void main()
{
int k, c;
while ((c = getchar()) != EOF)
{
if (c == '\n')
{
++k;
printf("%d\n", k);
}
}
}
выводит не "1" как ожидается, а 32763 может и 32768 вывести.
Что-то не стыкуется с моими знаниями о том, что int k; инициализирует k в 0
я понял да. значение на момент объявления неопределено
Двачую майора
> компилируй через cc hello_world.c
сс - это симлинк к компилятору C по умолчанию. С тем же успехом это может быть clang.
>>972658
> скорость 7 кб/с
It's just you. Кабельный МТС - 150-200 КБ/с.
Попробуй кинуть код (hello.c) в директорию llvm/bin (где лежит clang) и снова выполнить clang hello.c
>It's just you. Кабельный МТС - 150-200 КБ/с.
У меня скорость 30-32 мбит/с (при скачке обычно 3.5-3.9 мб/с), так что нахуй, это сайт LLVM'а тормозит.
охуеть, а форкнуть репозиторий и самому собрать никак? Там же даже мейк есть, просто в консоли две команду прописать, ну
и для одной из кнопок мы можем задать параметр TEXT путём введения команды:
i=1;
this->button1->Text = Convert::ToString(i);
в итоге мы получим кнопку с числом 1 в text'e.
Но как сделать это через цикл,ведь для каждой кнопки не будем выделать ещё 1-у строку и делать индусский код.
;#####################
for(i=0;i<5;i++)
{
this->button->Text = Convert::ToString(i);
}
не сработает...(проблему выделил) . Как в cpp можно реализовать решение данной проблемы?
> форкнуть репозиторий и самому собрать никак?
Мне почему-то кажется, что даже скачать готовые бинарники по модему (олдскульному, через телефонную линию) будет быстрее, чем это собрать.
я ввожу любой символ и у меня начинается а принтует у меня "к" начинает с числа 3. это потому что не определено какое значение принтовать ? Если определить к=0 то будет с единицы печатать.
мимо начинающий неосилятор
Ну на урезанном i5-u(5 поколение) у меня собрались за ~40 минут
Правильно пишет. Надо все что можно писать на C, и даже если надо C++ большую часть кода можно написать на C и использовать.
На C++ даже компиляторы ничего не гарантируют, с горем пополам могут в последние стандарты.
Это вообще легально, описать static и non-static прототипы для одной и той же функции? Мне показалось, что нелегально, потому статический прототип закомментировал. Правильно сделал?
static Надо делать, убирай статик если будешь юзать функцию другим файлом.
Ты тупой, МБ? CLR - это что, по-твоему?
Но нахуя?
> Это вообще легально, описать static и non-static прототипы для одной и той же функции?
Я спрашивал в одном из тредов насчет static, restrict и const. Никто не знает. В стандарте все очень мутно. Но вроде бы делать прототип без static, а саму функцию определять со static - это нормально.
>>972984
Системный пакетный менеджер (pacman, apt, dnf) - это и есть пакетный менеджер для Си, он позволяет ставить компиляторы, либы и хедеры.
>>973093
CLR - это Common Language Runtime. C++/CLR - это извращение, позволяющее писать на крестах под дотнет. У >>972753 именно оно. Использующие это идут нахуй в C# тред. Заебали срать.
> функцию определять со static
Бля, наоборот. В общем, я имел в виду, что декларация задает тип и видимость.
Нахрен ты нам фак показываешь?
Нормально. Особенно, если это твой первый язык.
1) Если у тебя будет два пробела подряд, зачтется как пустое слово.
2) Выражение words[wordsCount++] = lettersCount лучше показало бы твои намерения.
3) Если в if / else у тебя хотя бы в одной ветке есть фигурные скобки, ставь их и в другой (да, синтаксис позволяет писать, как у тебя, но выглядит это неоче). Это правило обычно встречается в каждом первом стайлгайде. У некоторых принято писать фигурные скобки вообще всегда (в основном из-за убогих текстовых редакторов).
4) Второй while лучше заменить на for - лучше показывает намерения. В C99/C11 ты еще и переменную в заголовке for объявишь, и ее не нужно будет искать глазами.
5) Переменные лучше объявлять как можно ближе к их использованию, поэтому int i я бы положил внутрь второго while (даже C89 это позволяет) или в заголовок for (С99/С11).
У мейна прототип int main(int argc, char argv);
Каждое объявление переменной с новой строчки и лучше делать с инициализацией:
int c = 0;
int i = 0; и тд
К каждому ифу добавляй скобочки, даже если одну инструкцию выполняешь
Если просто инкрементишь переменную, то i++; выглядит лучше, чем ++i; (хотя в плюсах последний варик для объектов лучше из-за отсутствия лишнего копирования)
>>973268
Про прототип мейна - правильно. Я не заметил. Есть int main(void) и есть int main(int argc, char ∗argv[]) (он же int main(int argc, char ∗∗argv)). Других мейнов в стандарте нет.
> выглядит лучше
Это наоборот плохой совет. Постинкремент нужен для специальных случаев. Его все поголовно используют неправильно, но лучше не привыкать так делать. В свое время была шутка, которую упоминал даже сам Страуструп, что язык C++ даже назвать правильно не осилили - улучшенный C логично было бы назвать ++С.
> лучше делать с инициализацией
И потом статический анализатор или компилятор будут ругаться, что присвоенное значение забыли использовать.
> к каждому ифу добавляй скобочки
А вот и человек с ed вместо редактора подъехал.
>Других мейнов в стандарте нет.
Есть imlementation-defined.
Может ты мне ещё запретишь envp через main получать, гнида?
> В свое время была шутка, которую упоминал даже сам Страуструп, что язык C++ даже назвать правильно не осилили - улучшенный C логично было бы назвать ++С.
Нет, просто «I think maybe the guy who invented C++ doesn’t know the difference between increment and excrement.»
> И потом статический анализатор или компилятор будут ругаться, что присвоенное значение забыли использовать.
А так он будет ругаться на defined but not used.
> envp
Бля, вот все время забываю, что envp на самом деле в стандарте есть (в списке распространенных расширений). Но тем не менее, это все равно расширение, которое какбэ намекает на возможные проблемы с переносимостью. Да, оно везде реализовано, но все же.
> А так он будет ругаться на defined but not used.
Будет причина удалить нахуй неиспользуемую переменную. На самом деле я согласен, что инициализация при объявлении желательна. Но только если у нас C99 и выше, где мы объявляем переменные по месту, а не в начале блока, т.е., нам видно, что вот она наша переменная, и мы ее сразу инициализировали, и нам понятно, зачем мы это сделали.
>А вот и человек с ed вместо редактора подъехал.
Дебик, даже в гугл код стайле прописано, что так надо делать. Хотя да, мане из ебеней лучше знать.
> гугл код стайле прописано
Какого бреда там только не прописано. Самый бредовый — что пробелы лучше табов.
Насколько знаю если все инициализировать в начале то программа должна быстрее работать.
Абсолютно похуй, когда компилятор положит переменную в стек. Мало того, он все равно положит ее тогда, когда захочет.
Тем временем мы перекатываемся без шапки, потому что в шапке образовалось слово из спам-листа. Спасибо, Абу!
Ага, а если для названий переменных использовать только одну букву, то еще и памяти меньше отожрет
А вот и оптимизации уровня /pr подъехали
>>973297 (OP)
>>973297 (OP)
>>973297 (OP)
Перекатываемся, но макаке не нравятся наши книжки. Пора пилить гайд куда-нибудь на гитхаб.
Это копия, сохраненная 4 июня 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.