Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или звездочки.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
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)
анон хэлп. как посчитать максимальную связку из нулей. у меня получилось посчитать общее количество нулей. как мне сравнить одну последовательность нулей с другой?
>>960090 Как обычно ищут максимум: заведи max_length = 0, max_offset = -1, а когда очередная последовательность нулей закончится, сравни ее длину с max_length, и если она больше, запомни новую max_length и офсет последовательности (если нужно). Алсо, сейчас у тебя просто количество нулей считается, а тебе нужно детектить переход между ноль-неноль и обратно.
>>959643 (OP) Ананасы, как правильно сделать проприетарную bare metal либу? То бишь нужно скомпилять код и поставлять в виде какого-нить бинарного формата + хедер с прототипами функций, доступных пользователю и всё это добро должно нормально линковаться. Очевидная статическая либа из объектных файлов не подходит, т.к. таким способом будут светиться все внешние функции/переменные из объектных файлов, что довольно некрасиво.
Почему когда я смотрю обычные заголовочные файлы stdio.h, например то вижу тонны дефайнов, несколько объявлений функций, а самих функций не вижу? Где они?
>>960118 Посмотри на sqlite amalgamation - собирай (скриптами) гигантский сорс и компилируй его (ну или инклудь .c в .c). Не делай символы внешними, используй static где только можно.
>>960124 Неужели это всё нельзя сделать силами конпелятора или линковщика и нужно городить костыли? Ведь shared либы для больших операционок легко чистятся от излишних экспортируемых символов, даже можно всякими __attribuute__ в gcc явно задавать, что нужно всем видеть, а что – нет.
>>960127 Может лучше просто скомпилировать либу в готовый машинный бинарник, написать функции-обёртки (т.е. обертки тех функций, которые должны эскпортироваться), которые вызывают _настоящую_ функцию по конкретному адресу, а также написать скрипт для линковщика?
>>959906 >в плюсах тоже самое Только стандарт си++ никто толком даже из комитета не читал. Была же история, что какой-то чувак в стандарт по шаблонам написал стишок и его никто не заметил, т.к. никто не читал. В итоге так и приняли стандарт вместе с этой хуйней
>>960132 В общем-то всё получилось намного проще: нужно всего-то сделать ld -r куча_объектных_файлов -o yoba.o strip yoba.o --strip-all --discard-all (или какой-либо другой способ избавиться от неугодных символов)
Подход с запихиванием всех исходников в один файл хоть и полезный для оптимизаций, но нахуй не нужен в моем случае по крайней мере пока хватает места на флешке, лол
>>960200 Тупорылый петухевен, у тех двух ньюфагов тоже нет никаких неудобств с просмотром хедеров. До них не доходит, что реализации функций в хедере уже скомпилированны и не доступны для просмотра. этот дебил у вас тут - местный клоун?
Длинее: Хранить выборки в массиве ты не сможешь, если число будет слишком большим (число выборок - примерно 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 - размер набора.
>>959643 (OP) Аноны, у меня сортировка данных, вывел сам процесс в функцию, нужно посчитать кол-во обменов и перестановок. Можно задать цикл со счетом обменов/перестановок в самой функции, чтобы потом вывести это кол-во в консоль?
>>960119 >Где они? Можешь купить у майкрософт. >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 или нечто подобное.
Фолкс, где искать работу? Пытаюсь учить всякие джавы, пхп... такая залупа хз.. не нравится мне всё это. С/С++ ближе, но работы чёт мало (или я просто не там ищу). Если и есть вакансия, то требуется кулхацкер со стажем пицот лет, и чтоб пришёл и порядок навёл без помощи. А где взять работу совсем зелёненькому, как я? Я вот недавно откинулся с универа. Не нуб, но и не чел, который придёт и возьмёт всё под свой контроль. Как быть? Нахуй идти не хочется.
>>960764 Дрочи электронику и иди пилить прошивки или ищи более нормальные языки. С поиском работы на Си в России все крайне хуево, всем нужны веб-макаки.
>>960764 Ну щас тенденции такие. Байтоебство осталось в 90-нулевых, сейчас в рашке онли тырпрайз, делать сайты или писать приложения под ведроид. Но ты всегда можешь завести трактор и работать в нормальной ит компании, где еще пишут на плюсах/си - разные интол(интернет вещей), геймдев компании и тд
Спасибо, посоны, за эдвайсы. В вузе вроде были приколюхи в виде летних школ, курсов там каких-то, но я всё проебал, занимаясь полезными (нет) делами. Теперь вот чекнул вакансии, а там всякие модные слова и ваще всё то, что я не знаю и не умею. Прикольно вышку получил, хех. Не гоню на вуз, что типо зря учился, но кушать тоже хочется.. вот и думаю - что делать и куда идти.
>>960906 1) Закрывать-то файл зачем? Сделай rewind или fseek(file, 0, SEEK_SET) после ftell(). 2) Ты уже знаешь размер, но читаешь посимвольно. Делай сразу fread всего файла, пусть рантайм разбирается и читает так, как ему там удобнее читать. 3) Выделяешь n байт, читаешь n байт. В результате строка у тебя останется не завершенной нулем (если в файле нулевой байт не встретится). Выделяй n+1, явно делай str[m] = '\0' после чтения, где m = количество прочитанных байтов.
>>960935 Хуй знает, что это и зачем, но либо считай руками (для сравнений счетчик можно прямо в сравнении увеличивать: if (compare_counter++, foo < bar) { ...), для обменов тем более никаких проблем. Либо сделай отдельные фукнции compare и exchange, и увеличивай счетчик в них.
>>960955 Актуален, но лучше бери Unity и C#, быстрее вкатишься, а не погрязнешь в хелловорлдах и движкостроительстве. Алсо, тут тред не про кресты, вообще сходи к детям в /gd/ лучше.
>>960964 > лучше бери Unity и C# Попробовал сначала на жаве, но 90мб в озу на перемещение спрайта меня как то оттолкнуло. Юнити тоже выдает много мусора. Схожу в общем посмотрю что в /гд говорят.
>>960967 В юнити и вообще готовых движках ты нормального потребления не добьёшься, да и производительности нормальной тоже. Зато программить на этом сможет даже ребёнок, всё максимально просто. Если же хочешь, чтобы ресурсов мало выжирало и летало, то пердоль OpenGL/Vulkan на Си/Крестах, но на этом ты само-собой ультра йобу в два клика не сделаешь, тут думать нужно.
>>960967 > 90 мб Дай угадаю, а без спрайта хелловорлд ты не мерял? А чем всякие commit/reserve/heap отличаются не знаешь? Ничего плохого в 90 мб нет, если это не 90 мб на каждый спрайт. Тот же майнкрафт на моем старом 2 ядраодин целерон-2 гига середины 2000х упирается в проц, а не в память.
>>960972 Вооот, уже начинают советовать делать свой движок... да еще на вулкане. Ты сам свой движок закончил? Ты представляешь, сколько нужно итераций "сжечь и переписать", чтобы у человека без предыдущего опыта в движке появилась архитектура? Сколько человекочасов, чтобы добиться современного уровня графики? Сколько соломки нужно подстелить для legacy-дров с багами? Сколько времени можно было бы потратить на разработку самой игры? Сам пилю йобу на С в свободное время, но я старый и глупый, не повторяйте моих ошибок.
>>960978 Если у него есть желание, то не вижу проблемы. В любом случае я сказал как есть: Движки — быстрая разработка, тормоза, высокое потребление памяти. Велосипеды — долгая разработка, высокая производительность, маленькое потребление памяти.
Алсо, если он хочет пилить 2D игорю, то тут всё просто.
>>960978 >legacy Ненужно совершенно. >дров mesa-vulkan твои дрова, сам движок под wayland пили. >человекочасов Ты же не йобу собрался разрабатывать, сделай простую либу чтобы импортировались .blender файлы и все.
Про типы с точной шириной типа int16_t, uint32_t вики говорит, что не все системы их поддерживают. Кто-нибудь навскидку назовёт в пример подобную систему?
>>961217 А много таких систем-то? Из популярных я имею в виду. Не, ну я предполагал, что Сетунь-70 не поддерживает подобное, но из современных, есть какие-то значимые примеры? Avr могу предположить, но там только в силу размера же.
>>961696 Какие итераторы? Мне нужно на чистом Си. Генератор, который выдавал бы значения внутрь цикла for и while (например, числа от 1 до 10) без хранения их в памяти.
>>961698 В С так не делается, не переноси свои ебанутые привычки с первого языка на все остальные, учи C и как на нем пишется код, а не переводи в своей голове с питона.
>>961698 >Генератор, который выдавал бы значения внутрь цикла for и while (например, числа от 1 до 10) без хранения их в памяти. Освобождай вручную и передавай ссылки, но это все хуита.
>>961727 На С можно функционально писать. Но меру всегда надо знать ато бутет сосо в производительности или даже стековерфлоу. Лучшего кода за функциональный нет, писать удобно, никакого дублирования, маленькие исходники, но вызов функции сам по себе потребляет ресурсы.
>>961674 longjmp предназначен для переходов внутри функции, или для "выпрыгивания" по стеку вызовов наружу. Если функция, которая вызвала setjmp, завершилась, можешь считать, что jmp_buf содержит мусор.
printf("Введите a кок-пок и т.д. и т.п.\n"); 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) не помогает
>>961832 Дак лол, не могу же. Энивэй, если я попрошу вводить по одной цифре, то пользователь может ввести две по описанию задания. Алсо, он может ввести N переменных. Надо считать только первую, а потом заставить следующие scanf считывать с другой строки. putchar('\n') не помогает
>>961843 > Программа должна писатся для трезвого пользователя. Не у меня. Понимаешь, я мог бы всё аккуратно сделать через гетчары, перевод в числа и обстоятельные проверки всего и вся, но я так не сделаю, пока меня не обоссут, а пока просто сканфики скобачки. > Можешь все за один scanf считать. Не могу. Там дальше в программе надо будет считать разные данные в зависимости от хода программы, это и мешает, причём ужасно.
>>961828 >>961844 Решил так. Добавляю переменную char trash; while(trash!='\n') scanf("%c", &trash); Переменная сама никому не нужна, просто для прокрутки.
>>961889 > стандартных путей нет, кроме да, считывания. Это и есть стандартный путь после scanf failure. Вычитать остаток строки и запросить данные заново.
>>961828 >>961848 Сожрать остаток строки можно самим scanf-ом: scanf("%∗[^\r\n]"). Взять число и выкинуть остаток строки можно, чуть исправив формат: scanf("%d%∗[^\r\n]", &n) (звездочки только на нормальные поменяй). С чтением одного числа из одной строки (а также нескольих чисел из обязательно одной строки) сложнее: самый простой подход - использовать fgets+sscanf, самый правильный - fgets+strtok+strtoul и прочие strtoX.
>>961995 Дак да, но блин, я уже сталкивался с таким, что позиция, с которой будет считан следующий getchar() не совпадает с позицией, с которой будет считан следующий scanf(). Или у меня тогда проблемы были не с этим. Но приходилось писать scanf("%d\n") - только тогда всё работало В общем, я осторожничаю с этими вот читалками.
Ладно, поцоны, как вы парсер пишите? Например, заголовка ip пакета. Для мeня пока бeст таeр это сдeлать структурку с битовыми полями и обeрнуть ee в #pragma pack. Или как-то так. Ну и входной массив привeсти к типу. Минусы: eбиная дирeктива компилятора, что шатаeт кросплатформeннсть, и нeвозможно динамичeски описать поля структуры, eсли парсятся извeстной формы набор байт.
>>962538 Пик >>962540 Я разобрался, кароче когда пофиксил число и оно стало не ноль выяснилось что винда тратит половину свободного места в никуда, я в итоге выделил но меньше.
>>962542 Если у тебя size_t - unsigned int, значит у тебя 32-битная система, и выделить 8 гигов ты не можешь никак. И в закомментированной строчке на пике у тебя именно 8 гигов, а не 1. Память мы считаем в байтах, а не в битах.
>>962549 Я тебе уже пояснял за PAE (в винде это AWE). Выделяешь кусок адресного пространства, сколько не жалко - это "окно", и когда тебе нужно что-то положить в память или прочитать, просишь систему в это "окно" показать кусок оперативки. Выделить так можно более 4 Гб, но видно одновременно будет только столько, сколько размер твоего окна. Т.е., при желании ты можешь несжатую картинку 65536655364 байта (16 гигов) положить в память, но не можешь без дополнительных телодвижений обращаться к рандомному пикселу внутри нее. В 64-битной системе ты можешь делать банально bitmap[y * width + x]), а с PAE ты сосешь хуй: чтобы что-то прочитать или записать, тебе придется "отобразить" регион, содержащий пиксел в твое "окно", и потом внутри этого окна с пикселами работать, по необходимости сдвигая окно (т.е., отображая на него различные страницы физической памяти). Гугли AllocateUserPhysicalPages/MapUserPhysicalPages, только нахуя тебе это надо - непонятно.
>>962570 В компиляторах Си они нахуй не нужны. Это достаточно низкоуровневый язык, чтобы извращениями занимался не компилятор втихомолку, а ты сам и явно. У тебя задача-то какая? Почему ты не можешь воткнуть 64-битную систему, если есть потребность в огромном адресном пространстве?
>>962577 Смысла нет. Это был переходный механизм, когда 64-битные наборы инструкций еще не существовали (или были мало распространены), а возможность воткнуть более 4 Гб уже была. Да и юзкейсов, когда тебе нужно, много гигов на один процесс, не так уж много. Гораздо чаще хочется иметь много гигов для разных процессов - вот эту задачу PAE, в общем-то, и решает.
Господа, вопрос скорее даже не по С, а по линкусу и сетям. Пытаюсь сделать через raw-сокеты отправку пакетов с спуфом ип-адреса источника. Трабла в том, что софт запускается на роутере с включенным NAT и этот NAT заменяет в отправляемых пакетах любой адрес источника на внешний ип-адрес роутера, т.е. спуф идет по пизде. Если ли способ может через установку какой-либо опции для сокета или может твик ядра линукса через /proc/sys/net/ipv4/ или еще как-то заставить блядский NAT не подменять адрес источника в пакетах, которые были сгенерированы на самом роутере?
Аноны, тут такое дело, курсач нужно запилить, исходные условия: "шоб использовал С/с++ и шоб с базами данных, ну и не совсем простое. Таки вопрос: Что б такого написать? не совсем нуб, но и сверхъестественное не надо, сроки как-никак. Думаю что-то типа библиотеки замутить, но выглядить слишком просто.
>>959643 (OP) Как после каждого занесения элемента в массив увеличить a на один, а потом вывести эту a в консоль, ничего не работает, выводиться всегда ноль.
Ребятки,имеется массив 4х4, нужно найти минимальный элемент среди положительных ниже главной диагонали, подскажите как это сделать пожалуйста. Пока что вот что имею. Там дальше два счетчика для i и j должно быть как я понимаю,потом if(i<j),дальше без понятия как действовать.
Задался вопросом, а как обычно нормальные люди реализуют так сказать динамическое создание указателя. К примеру есть у меня список односвязный, указатель на голову я создаю в мейне или делаю глобальным. Ну и заполняю список и работаю с ним. А если понадобится еще один список? Получается нужна отдельная функция создающая указатель, потом этот указатель таскать за собой везде и нигде не потерять. Или нужно сразу создавать динамический массив указателей?
>>964631 Нет и не может быть. Препроцессор, встречая #include, просто заменяет эту директиву на указанный в ней файл, поэтому для компилятора "пределов .h файла" просто не существует, существует только единица компиляции, а уж из чего ее препроцессор собрал, компилятору насрать.
>>964633 static-функция не выползает за пределы юнита. Если ты пишешь header-only либу, то во-первых, сделай дефайн, чтобы различать включение для деклараций (многократно в проекте) и включение для реализации (однократно, с дефайном), а во-вторых, используй неймспейсы для бедных - добавь уникальный префикс или суффикс ко всем используемым символам. MyYobaLiba_ вполне подойдет. И похуй, что там будет торчать после этого.
>>964634 Да я наверно просто от .h-only откажусь, так логичнее будет. Это нужно будет создать .h файл с хедерами функций либы, скомпилять сошку "gcc -shared -o lib.so -fPIC lib.h", и для использования моей либы придётся просто инклюдить .h файл и компилять с -Llib.so, я правильно понимаю? Ни разу так не делал, всегда .h файлами обходился.Тайпдефов либы тоже видно не будет?
>>959643 (OP) Собрал на visual studio проект.Поменял разрешение в c..Запустил через конфигурацию решения release.Пишет.что не удаётся найти указанный файл
Проверь, что у тебя рантайм нужный стоит. Он ставится автоматически, но мало ли. Скачай dependency walker, посмотри какие .dll получившийся .exe хочет.
>>964897 > Ты ведь не набиваешь параметры компиляции в командной строке руками, ведь правда? Вчера осваивал Makefile, было больно.
Прошу немного пояснить мне за либы. В моей либе есть структуры, много структур. И, допустим, мне нужно, чтобы пользователь либы мог работать с одной из них, например со структурой "type". Если я просто слинкуюсь с либой и начну использовать эту стуктуру как тип, то компилятор ругнётся. В структуре много вложенных структур, например "type->str", но в .h файле либы, который я создал во избежания еггогов просто написано: typedef struct { void *str; // Хотя в либе это большая структура } type;
При таком варианте можно обратится к элементам структуры "type->str"? Сам проверить сейчас не могу, да и долго это, ответь же ты, тредик.
> Header-only место в аду. Вот ты так говоришь, а пока от необходимости делать отдельную библиотеку я испытываю одни неудобства. Как минимум всё переусложнено.
Может кто доставить, так скажем, туториал о оформлении своей библиотеки? Вчера искал, не нашёл.
>>959643 (OP) Какая же годнота С, по сравнению с жавоскриптом. Сейчас дочитываю первую книгу, с синтаксисом разобрался, подскажите что можно написать на С?
Все что угодно. Просто тратить время чтоб написать на Си какую то веб-перделку никто не будет, на нем пишутся сложные хуитки, быстрые хуитки (если не делать говнокод), много всего.
В первый раз я написал небольшую чит-программу которая использовала драйвер для скрытия от античит систем, банальные хуки в таблице SSDT ядра Windows.
Я уже не школьник, когда впервые этим занимался тогда был школьником, дико доставляло копаться в ядре. Всяким JS макакам вряд ли такой адреналин доставляет их макакинг, верно?
>хуки
в usermode довольно сложно реализовать правильные Inline хуки, т.к требуется дизассемблер длинны функций, иначе можно испортить все.
>>965312 В том то и дело, что это совсем другой мир. Тут уже залетный из жс отписался, но как по мне, веб быстро надоедает. Даже несмотря на "обилие" языков, по сути все одно и тоже. А фронт-енд это такая хня, что лучше туда не лезть вообще. И дело не в сложности, как раз сложного там мало, но все приедается быстро. Поэтому и пал выбор на С.
>>965340 манямирок тупых байтоебов, не знающих алгоритмов и J-нотации и считающих, что выучить набор инструкций процессора сложнее, чем набор классов и методов в веб-фреймворке
>>965340 манямирок тупых байтоебов, не знающих алгоритмов и O-нотации и считающих, что выучить набор инструкций процессора сложнее, чем набор классов и методов в веб-фреймворке
Байтоёбство включает в себя: 1. Императивный стиль программирования как начало байтоёбского пути. 2. Дрочка на машинно-ориентированные типы данных (собственно, основной симптом байтоёбства) и последующее за ней закономерное возмездие байтомудакам в виде big endian vs. little-endian, особенности обработки чисел с плавающей точкой и.т.д. 3. Предтерминальные стадии байтоёбства - интринсикоёбство и его более тяжёлая форма - инлайн-ассемблероёбство. Подсадка начинается с убеждённости поциента в необходимости ручками использовать SIMD -инструкции. 4. Терминальная стадия, как итог п.3, тру-ассемблероёбство и "хроническая низкоуровневая оптимизация головного мозга"
В нашем мире, к счастью, подобные симптомы с распространением java, C# и прочей "замещающей терапии" встречаются реже, однако остались две отрасли, входящие в зону риска: 1. Гейдев. Байтоёбство в гейдеве берёт своё начало в 70х-80х, поскольку именно тогда зародилась традиция байтоёбства в геймдеве. Обязаны этим, в основном, восьмибитным соснолям и домашним компьютерам, которые, обладая малым объёмом ОЗУ и имея скудные средства программирования, требовали делать на них ёба-игры. Эта традиция продолжилась и далее, всё благодаря тем же консолям, на которых консолерабы должны были выпускать игры 5 лет, задрачивая их убогие байтоёбские архитектуры по полной. К сожалению, подобная практика перешла и на ПК, где байтоёбство, в общем-то не так оправдано. К слову байтоёбам-игроделам дали шанс выбраться из этой трясины в 2002 году, когда майкрософт запилила дуднет и менеджед дайректикс к нему. Но байтоёбы остались верны своим указателям, плюсам и байтоёбской оптимизации. Зашоренность, верность привычкам, безыдейность, десу. 2. Эмбеддед. Причины почти всё те же, что и в гейдеве. Маломощное железо, пара сотен байт озу, деревянные игрушки, прибитые к полу и.т.д. К этому прибавляется огромное количество разных железок разномастных архитектур, для которых нет толковых тулчейнов. Из хорошего - в последние годы байтоёбство в этой сфере потихоньку излечивается, спасибо дядям из ARM co ltd, сделавшим свою архитектуру более менее распространённым стандартом среди всех архитектур и огромному количеству появившихся фреймворков и компиляторов языков для этой платформы.
Так же распространено ложное утверждение что байтоёбство крайне необходимо в системном программировании. На самом деле этого легко избежать. Рассмотрим среднестатистическую аппаратную платформу. Краеугольными камнями любой аппаратной платформы являются:
1. Процессорная архитектура 2. Memory map - адресное пространство, в которое отображаются RAM, ROM и внешние устройства 3. Протоколы управления этими самыми внешними устройствами.
Так вот, всё вышеперечисленное вполне можно вполне декларативно описать обычным конфигурационным файлом, не прибегая к программированию вовсе. Затем, скормить этот файл генератору платформ и на выходе получить готовый фреймворк-скелет нашей операционной системы, доступ к которому можно получить из любого языка программирования. Вот так вот просто, если бы байтоёбство гологного моска не мешало.
Машина должна и будет служить людям, она не шлюха, чтобы люди исполняли её прихоти. Отсюда ба йтобляди (а так же сочувствующие им императивные пидорасы, надрачивающие на показатели clock() - start) - пиздолисы, которые опускаются до полного говноедства, лишь бы ублажить её регистры и микросхемы. Альфапрограммисты, как и положено альфам, если машина не выполняет положенных ей задач и требует пресмыкаться перед ней и ублажать её байтами, просто берут и за патчкорды, ебашат с вертушки по передней панели и списывают машину на мороз, купив взамен ту, которая не будет выёбываться и выполнит код в сроки и без выебонов, будь там хоть 1000% неоптимизированного оверхеда. И настоящего программиста не волнуют вопросы выдрачивания и быстродействия - он решает важную задачу из предметной области гораздо более сложной, чем низкоуровневое дрочево, и отвлекаться на всякую подзалупную хуету вроде осоьбеннойстей какой-то там архитектуры ему некомильфо. Байтоёбство включает в себя:
>>965555 некоторы шаги есть в любом направление. высер того анона напоминает кукарекание петухатиков где у них есть еба теории в которых все заебись но на практике абсолютно не реализуемы да и оторваны от реальности
Аноны, я тот аноны который после веб макакинга начал изучать С. Очень нравится язык, наскачивал книг, одну уже осилил для нубов, одну даже планирую купить, очень охуенно там все разложено, плюс примеры интересные. Но вопрос такой: есть ли с С работа? Например со знанием пхп/жс ее порядочно, даже выбирать можно. Что вообще пишут на С? Только драйвера и ядро линукса? Что еще параллельно подтягивать вместе с самим языком?
>>965769 У нас в основном на С пишут что-то связанное с железом. Не сколько драйвера, сколько прошивки микроконтроллеров. Но в этой отрасли зп ниже, чем в веб.
А крутые чуваки, да, пишут всякие СУБД, Highload-бекенды и подобное. Но это в долине
Помогите разобраться с вводом-выводом. Есть 2 файла: данные и результат. хочу считать данные с одного тхт файла и чтобы результат был напечатан в другом.
>>965769 >Что вообще пишут на С? Практически все. Модули ядра для разных осей, реалтайм ос, гуишный софт, веб серверы, плагины для веб серверов, базы данных, интерпретаторы (хотя тут и на C++ благодаря темплейтам с генериками наркоманы любят обмазываться и грамматики разбирать), компиляторы, проще сказать что на С не пишут.
Всем привет. Вкатываюсь с таким вопросом. Вывожу в файл содержимое массива структур. При выводе в файл куча приписок, меток, форматирований непосредственно для более упрощенного восприятия человеком. Очень старался запарился, но прилетела задача - обратно такой файл грузить в программу и работать с данными. Другого варианта кроме как скурпулезного считывания нету?
>>966634 >>966677 yaml еще. И да, изобретать велосипед не стоит, хранение данных это хранение данных, а генерация отчета для человеков это генерация отчета.
>>959643 (OP) Анон, подскажи. Почему в топовых вакансиях (с/с++) требуется знания си? Я понимаю, что си - фундаментальный язык, очень приближен к работе с железом. Но, разве все то, что используется в си, используется в с++. Если не брать в расчет базовые вещи вроде типов данных, циклов и т.д.?
>>966830 По большей части кресты - это надмножество си. Соответственно, зная кресты, ты можешь кое-как писать на си. И тебе может понадобиться использовать или исправить сишную либу, например.
>>966859 Со знанием си кресты учатся быстрее (ну или си со знанием крестов). Знания си мешают писать в "крестовом стиле" на первых порах - получается то, что называется "си с классами". С опытом проходит.
Можно ли как-то по бинарнику узнать для какой ОС и под какую архитектуру он был скомпилирован? Точнее, можно ли узнать calling convention(используя иду, или другой дизасемблер)? т.е. хранится ли где-то какая-нибудь метаинформация и тд
Варик просматривать дизасемблированные листинги и гадать - не оч
> Можно ли как-то по бинарнику узнать для какой ОС и под какую архитектуру он был скомпилирован Да, можно. readelf/objdump/dumpbin/различные PE-редакторы. В целом зависит от формата бинарника.
> можно ли узнать calling convention Нет. Если явно не указать calling convention, современные компиляторы могут менять ее от функции к функции и от билда к билду, передавая аргументы в разных регистрах, выкидывая неиспользуемые аргументы нахуй и т. д. Если было явно указано при компиляции - можешь посмотреть дизасм, это не гадание, там все очевидно после двух-трех функций. Иногда из бинарника торчат декорированные экспорты (или есть отладочная инфа, например), тогда в там кодируется и конвенция.
>>966884 Мне надо знать calling convention чтобы собственно и определять аргументы функции. Причем не заглядывать самому каждый раз в бинарь, а написать такой парсер, который будет говорить где лежат параметры(т.е. названия регистров или смещение в стеке) для каждой функции. Такое вообще можно реализовать?
>>966921 Ну смотри, для 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, пусть она проанализирует, потом сдампить тайпинфо скриптом, а при возникающих проблемах смотреть и руками править.
повтор строк в файле -strcmp?Аноним04/04/17 Втр 22:44:30#262№966962
есть файл >100мб, в каждой строке 1 слово, как найти повторяющиеся строки=слова? Сделал через strcmp - каждое слово прогоняю через весь файл в поиске повтора.... в итоге 5Gb надо обработать, чет. как-то долго выходит )) Как ускорить?
>>966972 хеши тоже ведь проверять надо? >>966962 Закинь сразу весь файл в оперативку. Не перепроверяй то что уже проверил, а какой результат программы должен быть вообще?
>>966940 >проще всего взять IDA, пусть она проанализирует Так а как это сделать? Собственно я и хотел писать парсер, ибо в иде такой функции не нашел Легкий гуглеж говорит, что это можно провернуть, если пользоваться другим декомпилятором от хексрейз. Но мне бы именно в иде
>>967037 Ну начни с чего-то типа: 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 struct { ... } type; Можно считать нормальным стилем ещё одно декларирование этого типа в виде: typedef type type; ? Никаких подводных камней нет? Для наглядности хочу собрать все типы в одном месте и прокомментировать их.
>>966962 на поиск дубликатов наверное есть с десяток оптимизированных алгоритмов (по потреблению памяти, по быстродействию, в общем, на выбор) так сложно это загуглить...
Сап такой вопрос. А указатели на функции это нормально? За такое не бьют ногами? Я вообще новенький разбираюсь со структурами данных. Решил для себя написать, как раз и разберусь лучше. И в процессе возникла такая идея. Возьмем список. Есть структура для узла и есть структура содержащая голову и хвост нашего списка, ну и количество элементов. В структуру с головой я решил засунуть указатели на функции для работы со списком. Т.е. по итогу я хочу получить своего рода инкапсуляцию. Все что по итогу нужно для работы будет уже в структуре. Создали, вызвали функцию инициализации ну и работаем со списком в свое удовольствие, все методы сразу видны, на первый взгляд удобно, но нигде такого раньше не видел.
>>968070 В цпп только виртуальные функции лежат в таблицах, и даже их современные компиляторы стараются девиртуализовывать.
>>968233 Есть случаи, когда хранение указателей на функции в списках вполне оправдано. Например, у тебя список разнородных сущностей, может быть хорошим решением хранить указатели на деструкторы в элементах, а не делать гигантский свитч при удалении.
Подскажите гуманитарию в чём проблема. Есть одна функция которая генерирует рандомное число, и в зависимости от результата возвращает строку. Проблема в том что рандомное число генерируется один раз, и при повторных вызовах функции используется оно-же. Гугл не помог.
>>968313 https://pastebin.com/qjwbDm0p И раз уж на то пошло, есть какие-то более лаконичные способы "броска" кубика у которого некоторые грани повторяются?
>>968329 Очевидно, что тебе нужно бросать кубик (вызывать 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; }
Если это лаба - просто забей. Если игра, можно спиздить генератор получше.
>>968354 Внутри цикла... Вот я рукожоп... Спасибо большое! Видео смотрю уже. Досмотрю и постараюсь сделать всё кошерно. Да, игра, для себя чисто делаю. Хобби типа.
>>968511 Вон на днях на хабре очередной высер выложили. Сходи почитай, если хочешь. Ну или на вики. Или у любого крупного опенсорсного проекта есть стайлгайд обычно. Общего стандарта нет, есть разные подходы для разных ситуаций, но в целом похуй, как писать, лишь бы одинаково во всем проекте.
>>968551 >>968608 Тащемта fgets'ом я разбираю файл, а потом построчно ковыряю sscanf'ом. Просто проблема в том, что строка может иметь вид "[1-ый символьный параметр] [2-ой символьный параметр][числовой параметр]". И если, к примеру, второй строковый параметр отсутствует, то конструкции типа >%3s%d и/или %[^0-9]%i обламываются, ибо проёбывают в том числе и числовой параметр. Хотя решение хорошее, да. В итоге забил хуй, просто считываю как две строки, а вторую потом ковыряю strtol'ом, вытаскивая число, а остатки уже ковыряю на наличие/отсутствие нужных символов strchr'ом. В любом случае, не для атомного реактора программу пишу, и так сойдёт.
>>969517 >пытаются натянуть Не осилил glib? ООП там давно уже есть. >рисовалку виджетов Что это такое?>>969456 >мертворожденный графический апи Ну да, сосачерам виднее.
Пишу на С для STM32. До этого на С++ писал только в вузе проекты уровня Курсач1. Помню, access violation тогда постоянно сопутствовал на практике. Как контроллер реагирует на access violation / кривой код? Возможно ли случайно сделать из контроллера кирпич неудачным кодом? Контроллер можно перешивать много раз
>>970774 Discovery board с периферией (кнопочки, диод (должен быть), LCD дисплей). Воткнуто через USB к ПК, отладка. Как обычно, основа всего кода - бесконечный цикл. Вот там могут быть проблемы. Пока всё в порядке, но как-то тревожно
>>970721 > ООП там давно уже есть. надеюсь ты объяснишь почему они не взяли кресты, а сделали все через жопу? ооп на с, кек, долбоебища, структура с кучей ссылок на подпрограммы это типа у них класс, пиздос.
>>970991 >надеюсь ты объяснишь почему они не взяли кресты Хотя бы потому что в иксах Си - стандарт. Хуяришь на Сишке, потом портируешь в свой любимый язычок.
>ооп на с, кек, долбоебища > структура с кучей ссылок на подпрограммы это типа у них класс, пиздос. Первые версии твоих крестов, транслировались в сишку.
>>970991 > структура с кучей ссылок на подпрограммы это типа у них класс так в крестах тоже самое почти, лол >почему они не взяли кресты кресты говно, да и биндить к другим языкам тяжело, а тут биндинг левой пяткой можно написать, я его для диплома к тиклю прикручивал
>>971133 > Первые версии твоих крестов, транслировались в сишку. А сейчас сишка и кресты транслируются в асм. Это повод писать на асме? Всецело двачую идею писать гуи на крестах или еще более высокоуровневых языках.
>>971167 >Всецело двачую идею писать гуи на крестах или еще более высокоуровневых языках. Ну, так и делают. Только сначала пишут ядро на сишке, чтобы работало быстро и легко было портировать на другие яп. На си++ только ничего портировать не надо, все из коробки можно юзать.
>>971174 >Только сначала пишут ядро на сишке пруф или пиздун, кьют изначально писался на плюсах. >>971157 >его для диплома эгсперд ф треде, всем бояцо >>971167 >Всецело двачую идею писать гуи на крестах или еще более высокоуровневых языках. я про то, если мыслишь в рамках ооп то и выбор должен быть соответственным, а не как у гномопетухов.
>>971243 > я про то, если мыслишь в рамках ооп то и выбор должен быть соответственным Ты путаешь ООП и ээээ.... классы. stdio в сишечке - ООП, куча кода ядра Линукса на сях - ООП. Просто это не классы. Посмотри ссылку в шапке.
>>971351 Он имел в виду FILE, но он не является хэндлом (дескриптором) - это объект, который хранит дескриптор и прочие данные, необходимые для осуществления ввода-вывода.
>>971359 Методы посмотри в stdio, имена начинаются с f (и по историческим причинам несколько методов без f). Если для тебя методы - то, что пишется через точку после имени объекта, то я тебе сочувствую.
>>971364 у объекта есть указатель на себя, который неявно передается его методу, да, fd->read() а не процедурщина read(fd) и как минимум уничтожение объекта при выходе из области видимости. когда завезут приходи.
>>971378 > указатель на себя, который неявно передается его методу Особенность реализации какого-то конкретного языка. Например, COM/DirectX - ООП, но на сишечке я вполне себе делаю obj->lpVtbl->Release(obj), и от этого оно магически не перестает быть ООП.
> как минимум уничтожение объекта при выходе из области видимости Никаким местом не относится к ООП. Мало того, многие языки уничтожают объекты не при выходе из области видимости, а когда-нибудь. Мало того, для сишечки есть либа с подобным управлением памятью с автоматическим вызовом деструкторов.
>>971390 Ну наконец-то нормальный аргумент. Да, FILE нельзя наследовать, но он не перестает быть от этого объектом. Отличия FILE от структурного программирования - инкапсуляция. Содержимое структурок тебе доступно по определению, а содержимое FILE тебе стандартная библиотека показывать не обязана (хотя в большинстве реализаций ты его и видишь, оно все равно implementation defined, и ебать его напрямую - зашквар), с FILE работают только его собственные методы.
Сап, есть упражнение 2.1 из K&R. Так вот, там просят не только просто вывести пределы long, short, char, int, double, float, а ещё их вычислить. Но вот зацепку, как их вычислять, K&R не дал в начале второй главы. Вот скажите, когда я переполняю, допустим, тип int, переход в отрицательное число отвечает стандарту? У меня при любом переполнении будет как бы начинать с конца данного диапазона. Или это зависит от реализаций там каких...
>>971167 >Всецело двачую идею писать >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.
>>971820 Он не может в Wayland, нахуй не надо. >>971895 Qt так-то куда хуже выглядит, еще и виснет. Вот слева evince (GTK3), справа okular (QT5) Четко видно кто в 90х застрял сука. okular еще и виснет, охуеть просто.
>>971592 так что, приделы для безнаковых можешь скаставать 0xffffffff к соот. типу, перед этим проверев существование LONG_MAX, иначе - 0xffff. больше ничего придумать не могу.
я просто спрошу это здесь.Аноним11/04/17 Втр 19:03:27#382№971972
https://pastebin.com/6Fx9dEGR мудрый анон, что нетак с этим куиксортом? На 9 из 10 наборах дает верный результат, пытался осилить дебаггингом и в сухую, но все равно не могу понять в чем подлива.
>>971985 не знаю как ты будешь переполнением выводить пределы. хотя знаю, создашь для каждого типа переменную, проинициализируешь нулями, а потом в рантайме вычтешь 1?
https://pastebin.com/Ueix2sRG Написал подпрограммы для работы со стеком, не могу добавить с помощью нее элемент в стек. да, я даун Где я обосрался? Хэлп плс
>>972032 В этом и цель, тип написать библиотеку с подпрограммами для работы со стеком Но сначала надо просто программу сделать, что бы протестировать их все, а я не могу добавить элемент >>972036 >>972034 ? Странно, мы в универе изучаем Си и нам препод их давал, лул Еще когда списки проходили
>>972047 Разве я правильно все написал? Ахахахаххахахахахаха, про /n рассказывал, ебать в голос чет Просто у меня уже 4 утра, я по фасту написал то что в мэйне и сюда кинул, ибо хз
>>972050 Нет, ты всё написал неправильно. Твой код не компилируется, половина кода не выполняется. В стек ты пихаешь неинициализированную переменную. Стеком называется вся структура данных, а не один ее элемент. Пишешь ты на смеси C и C++. printf ты не осилил.
>>972062 > Энивей он не мешает Он абсолютно ничего не делает, не добавляет никаких новых сущностей. Я даже не уверен, скомпилируется ли это в Си. Программа работает только потому, что в C++ теги (имена) структур сразу являются типами, и писать struct Имя, как в Си, не обязательно.
>>972063 В стандарте Си про каждую переменную говорят "объект". Это нормально.
>>972065 Ахаххаха, да нет Я не такой даун, первый семестр неплохо закончил, и с от крестов отличить могу И да, чекни библиотеки >>972075 Ахахаххаха, найс рофлишь Бля, так и знал что вы суки троллите меня
>>972083 В общем так: идешь на пару, начинаешь возбухать, что вас учят крестоблядию вместо ламповой сишки. Говоришь, что из-за этого обмана не сделал программу
>>972085 Бля, ну правда норм рофлите тут Но я ночь не сплю, что бы написать эту хуйню до утра и в итоге вы меня так запутали что пиздос
Хз, просто я вчера показывал преподу эти подпрограммы, он немного подредачил одну и сказал все норм, просто сделай типо, что бы они запускались по очереди и все
>>972090 Я пофиксил принтфы, убрал тайпдеф Но это не значимые косяки, я хз что дальше с этим всем делать теперь >>972091 Смысл? Ну спалите вы моего препода и Бтв учусь не в такой уж и шараге, топ 30 вузов россии Не думаю, что препод может путать Си и кресты блять
>>972079 > The maybe_unused attribute ненужно. если есть варнинг на аюзед, возьми код в #ifndef NDEBUG.
> The fallthrough attribute блевотина. для неосиляторов switch. серьёзно? если компилятор вам выдаёт такие варнинги, то это повод прописать ему в щи с вертушки и отключить этот клятый варнинг. вы ещё побольше скобочек вокруг & лепите, вместо того чтобы выучить приоритеты.
>>972100 > возьми код в #ifndef NDEBUG. У меня колбек, его вызывает либа. Что ты предлагаешь взять в NDEBUG? Как ты объяснишь компилятору и читателю, что ты не используешь аргумент намеренно?
> блевотина. для неосиляторов switch Я пишу на сишечке уже полтора десятка лет (с лишним, если считать ньюфажество и фриланс). И все равно бывают случаи, когда я забываю break (обычно копипаст или мерж кода). И чаще всего fall-through хочется для case FOO: case BAR:. Хитровыебанная лапша с неявным goto c помощью switch не нужна и должна быть переписана.
> вместо того чтобы выучить приоритеты Знаю приоритеты, очень долго писал foo << bar & baz без скобок. Когда с кодом стало работать большое количество людей, стало ясно, что мои знания и предпочтения не значат нихуя, читабельность гораздо важнее.
Рано или поздно все взрослеют, умнеют, перестают выпячивать знанания языка в своем коде и начинают писать читаемо.
>>972109 > deprecated > комментарии писать не пробовали? У тебя есть код, использующий функцию сделать_хорошо() из какой-то либы. Код давно написан, работает и не требует изменений. Как разработчики библиотеки могут тебя предупредить, что они опять все сломали перепидорасили API, и скоро твой код перестанет работать? Ты читаешь документацию и хедеры каждой либы для каждого нового релиза?
>>972106 > У меня колбек, его вызывает либа не понял.
>И все равно бывают случаи, когда я забываю break не знаю как это комментировать, не допускаю таких ошибок.
> читабельность гораздо важнее > Рано или поздно все взрослеют, умнеют, перестают выпячивать знанания языка в своем коде и начинают писать читаемо. ты просто оправдываешь своё превращение в макаку.
>>972114 >Ты читаешь документацию и хедеры каждой либы для каждого нового релиза? прикалываешься? что это поменяет? тебе всё равно придётся переписывать код. это вопрос в доступности информации - зачем это тащить в синтаксис?
>>972116 > не понял. Ты предлагаешь что-то ифдефать. Что именно? void handler(int unused) { terminating = true; } // Где-то в main. signal(SIGINT, handler);
> ты просто оправдываешь своё превращение в макаку Так для меня-то по прежнему нет проблем писать без скобок, делать for без тела или еще как-нибудь извращаться. Почему я вдруг макака?
>>972119 > тебе всё равно придётся переписывать код Увидеть ворнинг, создать тикет и переписать в плановом режиме; переписывать с горящей жопой, когда разработчики либы все сломают или, хуже того, не трогать код полгода и узнать о проблеме от кастомеров, которым, как обычно, все нужно вчера?
>>972122 > Ты предлагаешь что-то ифдефать. Что именно? понятие не имел что такое вызывает варнинг. как у тебя это получается? -Wall -pedantic - ничего не выдаёт. и это странно выдавать на это, ведь есть множество функций с аргументами для совместимости, например.
>>972122 >Увидеть ворнинг, создать тикет и переписать в плановом режиме; переписывать с горящей жопой, когда разработчики либы все сломают или, хуже того, не трогать код полгода и узнать о проблеме от кастомеров, которым, как обычно, все нужно вчера? теперь ты оправдываешь свою лень. это твои проблемы что ты не узнал что ЛОМАЮТ АПИ - нихуя себе история.
>>972122 >Почему я вдруг макака? ну или нет. например, потому что поддерживаешь фишки которые всем усложнят жизнь и только тебе облегчат.
>>972131 > как у тебя это получается? Ну привет. -Wunused-parameter включается с -Wextra (ну или -Weverything в clang). И да, люди этим пользуются. И да, если у них что-то где-то для совместимости, они делают: #define UNUSED_ARGUMENT(arg) ((void)(arg)) ... int handler(int sig) { UNUSED_ARGUMENT(sig); } Классика жи. А теперь вот решили это стандартизировать, а новый синтаксис позволит не делать по хедеру на каждый атрибут, как было раньше (например, stdnoreturn.h /__Noreturn).
Вообще, когда я поднимал эту тему, я надеялся услышать мнения про синтаксис. GCC-шный вариант более вменяемо выглядит, поддерживается многими IDE и меньше ломает парсеры в тех редакторах, которые про него не знают. Или нет?
Умоляю, помогите пожалуйста. Хочу сделать консольную задачу, установил визуал студио, и вот такая херня выскочила. Дело в том, что если нажать да - код все равно не будет работать, я и другие пробовал, 100% рабочие - не работает ничего. Как исправить?
>>972241 > код все равно не будет работать Подробнее поясни. Покажи выхлоп компилятора из панельки Output. Скинь бинарник, если он не пашет. Проверь время и дату на компе.
>>972373 Ананас, прости за мою тупость, но я правда не знаю как сортировать. Вот написал новый простой массив. Почитал про всякие методы сортировки, но непонятно, в какой момент её нужно вставить, например, в пикрелейтед?
Почему сайт этого вашего LLVM такой тормозной, хотел скачать дистр, а скорость 7 кб/с о_О при этом пробовал с разных ВПН (думал м.б. рашкованские айпи зарезали).
>>972703 >It's just you. Кабельный МТС - 150-200 КБ/с. У меня скорость 30-32 мбит/с (при скачке обычно 3.5-3.9 мб/с), так что нахуй, это сайт LLVM'а тормозит.
Допустим есть в winform 5-ь кнопок (button1,button2...button5) и для одной из кнопок мы можем задать параметр 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 можно реализовать решение данной проблемы?
>>972751 > форкнуть репозиторий и самому собрать никак? Мне почему-то кажется, что даже скачать готовые бинарники по модему (олдскульному, через телефонную линию) будет быстрее, чем это собрать.
>>972652 я ввожу любой символ и у меня начинается а принтует у меня "к" начинает с числа 3. это потому что не определено какое значение принтовать ? Если определить к=0 то будет с единицы печатать. мимо начинающий неосилятор
>>972868 Правильно пишет. Надо все что можно писать на C, и даже если надо C++ большую часть кода можно написать на C и использовать. На C++ даже компиляторы ничего не гарантируют, с горем пополам могут в последние стандарты.
Это вообще легально, описать static и non-static прототипы для одной и той же функции? Мне показалось, что нелегально, потому статический прототип закомментировал. Правильно сделал?
>>972885 > Это вообще легально, описать static и non-static прототипы для одной и той же функции? Я спрашивал в одном из тредов насчет static, restrict и const. Никто не знает. В стандарте все очень мутно. Но вроде бы делать прототип без static, а саму функцию определять со static - это нормально.
>>972984 Системный пакетный менеджер (pacman, apt, dnf) - это и есть пакетный менеджер для Си, он позволяет ставить компиляторы, либы и хедеры.
>>973093 CLR - это Common Language Runtime. C++/CLR - это извращение, позволяющее писать на крестах под дотнет. У >>972753 именно оно. Использующие это идут нахуй в C# тред. Заебали срать.
Сап анон! На связи кун который вкатывается в C. Читаю классику от отцов. Дошел до задания где надо гистограмму длины слов из входного потока построить. Подскажи анон, все ли на месте? По длине массива сделал с расчетом на 1000 слов, так как не знаю еще как динамические массивы делать в сишечке
>>973248 Нормально. Особенно, если это твой первый язык. 1) Если у тебя будет два пробела подряд, зачтется как пустое слово. 2) Выражение words[wordsCount++] = lettersCount лучше показало бы твои намерения. 3) Если в if / else у тебя хотя бы в одной ветке есть фигурные скобки, ставь их и в другой (да, синтаксис позволяет писать, как у тебя, но выглядит это неоче). Это правило обычно встречается в каждом первом стайлгайде. У некоторых принято писать фигурные скобки вообще всегда (в основном из-за убогих текстовых редакторов). 4) Второй while лучше заменить на for - лучше показывает намерения. В C99/C11 ты еще и переменную в заголовке for объявишь, и ее не нужно будет искать глазами. 5) Переменные лучше объявлять как можно ближе к их использованию, поэтому int i я бы положил внутрь второго while (даже C89 это позволяет) или в заголовок for (С99/С11).
>>973248 У мейна прототип int main(int argc, char argv); Каждое объявление переменной с новой строчки и лучше делать с инициализацией: int c = 0; int i = 0; и тд К каждому ифу добавляй скобочки, даже если одну инструкцию выполняешь Если просто инкрементишь переменную, то i++; выглядит лучше, чем ++i; (хотя в плюсах последний варик для объектов лучше из-за отсутствия лишнего копирования)
>>973272 >>973268 Про прототип мейна - правильно. Я не заметил. Есть int main(void) и есть int main(int argc, char ∗argv[]) (он же int main(int argc, char ∗∗argv)). Других мейнов в стандарте нет.
> выглядит лучше Это наоборот плохой совет. Постинкремент нужен для специальных случаев. Его все поголовно используют неправильно, но лучше не привыкать так делать. В свое время была шутка, которую упоминал даже сам Страуструп, что язык C++ даже назвать правильно не осилили - улучшенный C логично было бы назвать ++С.
> лучше делать с инициализацией И потом статический анализатор или компилятор будут ругаться, что присвоенное значение забыли использовать.
> к каждому ифу добавляй скобочки А вот и человек с ed вместо редактора подъехал.
>>973279 > В свое время была шутка, которую упоминал даже сам Страуструп, что язык C++ даже назвать правильно не осилили - улучшенный C логично было бы назвать ++С. Нет, просто «I think maybe the guy who invented C++ doesn’t know the difference between increment and excrement.»
> И потом статический анализатор или компилятор будут ругаться, что присвоенное значение забыли использовать. А так он будет ругаться на defined but not used.
>>973281 > envp Бля, вот все время забываю, что envp на самом деле в стандарте есть (в списке распространенных расширений). Но тем не менее, это все равно расширение, которое какбэ намекает на возможные проблемы с переносимостью. Да, оно везде реализовано, но все же.
>>973284 > А так он будет ругаться на defined but not used. Будет причина удалить нахуй неиспользуемую переменную. На самом деле я согласен, что инициализация при объявлении желательна. Но только если у нас C99 и выше, где мы объявляем переменные по месту, а не в начале блока, т.е., нам видно, что вот она наша переменная, и мы ее сразу инициализировали, и нам понятно, зачем мы это сделали.
>>973279 >А вот и человек с ed вместо редактора подъехал. Дебик, даже в гугл код стайле прописано, что так надо делать. Хотя да, мане из ебеней лучше знать.
>>973294 Абсолютно похуй, когда компилятор положит переменную в стек. Мало того, он все равно положит ее тогда, когда захочет. Тем временем мы перекатываемся без шапки, потому что в шапке образовалось слово из спам-листа. Спасибо, Абу!
Пожалуйста, пользуйтесь 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/%7Eats/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