Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2015 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)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
>>870048 Кто так пишет исходный код? Не будь макакой, приучайся писать нормально. 1. Где форматирование? IDE не поддерживает автоформатирование - делай вручную. 2. Название файла кириллицей - из-за этого однажды утром ты можешь не проснуться. Подумой. 3. Нет проверки введённых значений. А вдруг ввели белиберду. Проверь, чтобы scanf возвращал единицу. 4. Если кодишь под Windows - __try, __finally, __except.
Короче, надо заполнить массив случайными элементами целочисленного типа из заданного диапазона, вводимого пользователем. Заполняю при помощи rand() без всяких примочек - если ввести одинаковые границы диапазона, вывод всегда будет одинаковым. Если использовать сранд srand() со временем - выводятся одинаковые числа, я так понял, потому что генерируются одновременно. Есть что простенькое, чтобы помочь мне выводить случайные целые числа, которые будут меняться каждый вывод и не будут совпадать (т.е. не будут закономерно совпадать)? Простенькое, так как только начал изучать массивы, я грю уж про рандомные числа.
>>870161 > Почему i <= 11? i < 12 должно быть. Ты серьёзно? Это важно? Это действительно важно?! И ты хотел написать srand(time(NULL)), верно? Ок, сейчас запилю,
>>870147 >мне бы узнать, с какой точностью он время берёт для рандомизации srand - это начальное значение для генератора псевдослучайный чисел. Без него у тебя всегда будут одинаковые значения. В некоторых случаях полезно, но не здесь.
>>870163 > Скачал, заинклюдил один файл, вызвал две функции - куда уж проще Мне нельзя так делать, давайте в рамках ANSI C и без примочек, мне это ещё сдавать.
>>870162 >Ты серьёзно? Это важно? Это действительно важно?! Это очень важно. У тебя 12 элементов, самому проще будет. >И ты хотел написать srand(time(NULL)), верно? Именно так и написал, как хотел. Только ';' в конце ты пропустил. Не сконпелируется.
Допустимо ли в 2016 году использовать глобальные переменные? Например, у меня есть функции, работающие с сокетами. Хэндл сокета я сделал глобальным, чтобы другие функции могли работать с ним. Или лучше передавать сокет как параметр функции?
>>870384 >лучше передавать сокет как параметр функции Так ты как минимум сократишь возможность написать лапшу, в которой закроешь сокет раньше чем последний раз будешь в него стучаться.
Есть вот такая лапша уровня LABA_XXX: http://ideone.com/u1q82P Меня устраивает почти всё, кроме одного. Нужно, что бы если числа повторяются, то они выводились со степенью. Пробовал завести перменные, типа предыдущий делитель и count и сравнивать новый делитель с предыдущим, и т.п. Но выходит какая-то хуита. Как это реализовать?
зигулю всем сисятым. давно мысль вынашиваю, ведь то что компилятор не знает что значение в свитч строго не может быть неправильным, типо ему не позволяет сделать тупо таблицу с указателями да. но можно ли как-нибудь пропихнуть эти знания до компилятора, например через assert(v >= 0 && v <= 10) к примеру, прокатит не? или нужно строга хуярить if'ы по харду? так то я могу и gcc'шным методом проредить но как-то в заёб городить макросы для совместимости (хотя видимо так и сделаю, не могу же я проверить выхлоп компилятора потому что жирный лентяй). я тут просто посчитал количество кейзов при удалении элемента из 2-3 дерева (4 на 1 элементного батю и 12 на 2х) и как-то дико прихуел пишу чисто в академический интерес.
>>870142 просто съебись с винды и используй /dev/random как царь. в общем-то, по сути не барское это дело, генерировать случайные числа. или как илатка любит поправятся, вынув изорта болт на время, псевдо.
Аноны, расскажите, сложно ли с вашего языка перекатываться на другие (java, python, ruby)? Хочу изучать Си, как первый язык, так как он довольно интересный и монументальный. Изучать хочу по расово правильной книги от отцов, правильно ли я поступаю, или стоит начать с чего то по проще?
>>870690 Компилятор нормально делает таблицу, если вариантов не полторы штуки, а разброс значений не очень велик. Проверка верхней границы диапазона стоит всего две инструкции, это не слишком дорого.
Сделал дамп одной криптованной программы, таблица импорта разрушена. С помощью какой-то программы восстановил соответствие адрес-экспортируемая функция: 00416C31: Directly-> 0C570000 : 77F06B7E : RtlEnterCriticalSection Как и IDA создать таблицу импорта вручную? Или заменить адрес 7DE922B0 на осмысленный RtlEnterCriticalSection? Самый простой способ, который вижу - создать комментарий с функцией с помощью скрипта. Но хотелось бы знать, вдруг можно по другому.
>>870811 Проще всего запилить новую таблицу импорта в бинарнике (автоматически ImpRec-ом или вручную) и заново загрузить файл в IDA. Если не получится или нельзя по каким-то причинам: 0) Берешь IDAPython, а то заебешься в IDC писать. 1) Ищешь, где была IAT. Или создаешь сегмент новый - похуй. 2) Делаешь в скрипте таблицу маппинга между адресом и именем функции. 3) Заполняешь сегмент импортами (не обязательно в формате PE, просто списка func1 dd ?, func2 dd ? будет достаточно), т.е., делаешь IAT. 4) Проходишь по всей программе, патчишь относительные адреса в call, чтобы указывали на нужную функцию в твоей новой IAT. Я бы как-то так делал. Алсо, существуют всякие idc.SetManualInsn/idaapi.set_manual_insn или даже просто idc.OpAlt/idaapi.set_forced_operand , но это решение уровня комментариев. Хотя может тебе подойдет. Можно и вручную по Alt+F1 на адресе имена прописывать, лол.
>>870782 >Изучать хочу по расово правильной книги от отцов, правильно ли я поступаю, или стоит начать с чего то по проще? Ты медицину начал бы изучать по книгам от отцов?
Как разрешать такие проблемы с разными типами данных (и как вообще правильно использовать типы - только встроенные или только типы WinAPI)? http://ideone.com/BuXRnd
У меня объявлены: TCHAR processName[BUFFER_SIZE]; TCHAR dllName[BUFFER_SIZE];
Но при компиляции такого кода strncpy(processName, buffer, BUFFER_SIZE); возникает ошибка из-за того, что функция не принимает тип TCHAR. Однако если заменить тип данных на char, тогда ошибка возникает в GetWindowText(hWnd, buffer, sizeof(buffer)); потому что эта функция требует аргумент типа LPWSTR. Что делать?
>>870844 Ну можешь использовать виндовые апи (типа lstrcpy, или StrCpyN), можешь поинклудить tchar.h (_tcsncpy), а лучше не еби мозг, скажи компилятору -DUNICODE и используй юникод всегда. Нахуй тебе ансишный билд в конце 2016 года?
>>870846 В смысле, у тебя и так уже юникодный билд, судя по ругани, поэтому просто всегда пиши WCHAR вместо TCHAR, LPWSTR/LPCWSTR вместо LPTSTR/LPCTSTR и т.д. Ну и #include <wchar.h>, там есть wcspy, вся хуйня.
>>870800 да и хуй с ним. как называется такая хрень, что я гарантирую, что после добавления, удаления того-же элемента (например, в том же 2-3 дереве), вся структура будет такой же как и в начале? ну то есть, та же память, те же указатели. вроде это важно. хотя и хуй пойми каким боком к ц, просто лень из вкладки выходить.
скажи лучше, а дохуя на call жрётся? например, когда по указателю. так то, с учётом конвертеров, кешей, всех этих ебучих заморочек в современных процах. в тех же деревья, вообще, адекватно использовать со внешней функцией cmp ?
>>870678 > Нужно, что бы если числа повторяются, то они выводились со степенью Дели в цикле, не переходи к следующему делителю, пока не получишь остаток. Количество итераций минус 1 будет как раз степенью. Алсо, в сишечке есть функция lldiv, которая позволяет вычислить сразу и частное, и остаток, с ней будет быстрее. Алсо, не совсем понятно, что ты там меряешь. Если уж мерять, то построение таблицы и факторизацию каждого числа отдельно.
Анон, вот этот вот код: http://ideone.com/wV9a26 не хочет компилироваться в гцц при вводе более чем 6 элементов, вылетает ошибка Error in `./b.out': realloc(): invalid next size: 0x000000000229f010 У другого человека в Dev C++ все нормально работает. ЧЯДНТ?
>>871103 >Что обсуждать будем? давайте философствовать. что выносить в подпрограмму? считаю, повторяющуюся часть кода не возвращающего значение можно задефайнить, если результат работы порождает новую сущность (аки возвращаемое значение) в подпрограмму. абасыте.
>>871111 Что-то такое было уже. Избегаю писать многострочный код в дефайнах до последнего. Как минимум потому что функции читаемее, а компиляторы неплохо их инлайнят сами. Но если контекста дохуя, а производительность важна, тогда дефайны, что поделать-то.
>>871088 Смотри, что ты выделяешь память под 1 инт, пишешь туда элемент. Всё ок. Потом i становится 1, ты делаешь реаллок, (пере)выделяешь массивчик под 1 инт, и... пишешь инт по индексу 1, то есть за пределы массива. Из этого следуют простые мысли: 1) Однобуквенные переменные зло. Написал бы length, не ошибся бы. 2) У гцц есть охуительная фича. Пишешь -fsanitize=address и он по хардкору разноцветным текстом поясняет, где и как ты портишь память. Другие -fsanitize тоже заслуживают внимания. 3) Реаллок, на каждом шаге, кстати, тоже зло. Выделяй с запасом (вдвое больше, чем раньше, например), запоминай, сколько выделил. Классический динамический массив - это array, length, capacity.
>>871122 >Что-то такое было уже. в прошлом треде, но был перекот. >Как минимум потому что функции читаемее всмысле код в теле? но ведь теперь функция будет маячить перед глазами как нечто важное, а на самом деле это просто сокращение для копипасты.
>>871124 но если ты код делаешь грамотна раскидывая по юнитам, то такие функции у тебя будут static inline. и например, нигде не будут видны за этим конкретным местом.
>>871140 Ну это явно зависит от конкретной реализации. Но логично предположить, что никто не будет делать реализацию, которая будет выделять всё время один в один запрашиваемый размер. Как минимум, он будет округлён до ближайшего оптимального размера, который подбирается с учётом данной архитектуры (размера страницы, кешлайна и хуй знает чего ещё), чтобы скорость доступа к памяти была наиболее высокая.
>>871151 >Лучше уж самому выделить, чем гадать, как оно будет работать. Преждевременная оптимизация — корень всех зол. Тем более для лабы1, где уж точно больших проблем из-за реаллоков не возникнет.
>>871173 > больших проблем из-за реаллоков не возникнет Я частично согласен с высказыванием про оптимизацию (бывает, что из-за запоздалой оптимизации нужно нихуево перепидорасить код), но в данном случае дело не в проблемах и не в тормозах, дело в том, чтобы научиться. В том числе и в динамические массивы без реаллока на каждую итерацию. А потом уже думать про профилировщик и особенности аллокации в glibc.
>>871174 и нахуя использовать сортировки/массивы, когда есть деревья? что бы как прадеды хуячить по харду, перелопачивая память в угар, во славу перуна?
>>871187 > и нахуя использовать сортировки/массивы Слышал что-нибудь про кэши, локальность данных, вот это вот всё? > то бы как прадеды Прадеды могли хоть деревья, хоть хуевья использовать — у них не было кэшей.
>>871174 Слушай, я не топлю за подход анона >>871088 вызывать реаллок на ввод каждого нового элемента. Очевидно, что это ебануто. Но выделять "вдвое больше, чем раньше" для лабы1 это лишнее переусложнение. И в твоём подходе тоже можно доебаться до того, что у тебя происходит перерасход памяти без особой на то причины. Т.е. возможна ситуация, что пользователь ввёл N+1 элеметнов, а выделилась область для 2xN, большая часть которой пользователю была не нужна, допустим. При особо больших N это будет крайне ощутимо.
Что касается меня, я бы просто статический массив бы юзал. Нахуя вообще для такой задачи malloc/realloc.
>>871240 тебе же говорят: для экономии памяти. или мы про в 2 раза от чего, от минимально необходимого для работы за всё время? или всего используемого?
>>871288 Есть еще такое объяснение: всем похуй на своп, поэтому 2x выделять норм. Зато вариант с 2x предельно простой, работает всегда, для него не нужно всяких проверок, условий и прочей хуйни (как, например, для 1.5x: length += length >> 1; выглядит красиво, но только пока length по каким-то причинам не окажется равной 1).
не понял, а в чём проблема посчитать издержки на переаллок и и предполагаемою необходимость памяти в будущем, понятно намазав на время? ну как-то так. забейте, сусяны, я чисто так, хуй знает о чём вы там, пис блять.
Анон, посоветуй, с чем бы реальным мне поработать (либа, фреймворк), чтобы немного въехать в Си? Пока придумал написать расширение для Питона на C API, повозиться с GTK. Что ещё можно сделать?
анон, а где можно почитать про создание собственного представления int-ов, не влезаю в 64 битный, числа большие, на них потом будет пара алгоритмов из теории чисел? ( не заметил новый тред, копирую из 13 )
>>872023 длинную арифметику то я представляю - на другом языке напишу (написал) но вот с собственными представлениями чисел на си я не сталкивался, собственно у меня числа длинной до сотни знаков ( на си потому что быстро )
одно дело писать алгоритм на каком-нибудь условном питоне, я же ищу оптимальный способ представления чисел, чтобы не производить тонну велосипедного говнокода
но вот к примеру: с упаковокой стуктур я сталкивался -> понадобиться сделаю но в другой язые этож не впихнешь
=> то есть спрашиваю за языковые тоности/особенности
я умею в факторизацию в открыве от того что нужно запилить свое представление чисел
более того сишный код для 64 битных быстрых целых я написал проблема в том что мне нужны числа куда больше то есть я просто ищу способ (чтоб как полагается) представлять очень большие целые на си + мне пару операций на таком представлении (сложение, цел. деление) тогда я перепишу алгоритмы на новое представление -> profit
очевидные способы типо представить это все символами или массивом 64 битных интов мне в голову приходят но вот как правильно я хз если ты анон знаешь рецепт поделись плиз
для кристальной чистоты числа в духе: 1851858457003052118736699169041398614849121954728255181191590943881041451112971339223193346124917 (87 символов например)
>>872097 Анон, ты тупой? Тебе уже сказали - гугли длинную арифметику (mpi) Посмотри как она реализована в криптографических библиотеках (лайк openssl, nss, tomcrypt) Там практически везде указатель на массив лимбов, где оптимальный размер лимба (32 или 64 обычно) высчитывается макроопределениями для каждой конкретной платформы на этапе компиляции
>>871105 >компилировать Ничего охуенного. А засунуть в оперативку весь проэкт можно и юзать GCC, make, собирать будет наверно даже быстрее, если не статически линковать.
>>872097 >64 битов не хватает Если чисел с минусом нет то делай uint_fast64_t читай man stdint.h если надо минус то запакуй в структуру число и bool значение которое будет вместо минуса.
>>872097 Ну я же тебе отвечал уже в предыдущем треде.
> представить ... массивом 64 битных интов Ну вот и представляй. Что не так-то?
> но вот как правильно Какие тут могут быть правила? Быстро это или медленно - подумай или потести.
Вот этого >>872162 не слушай, он бегает с доски на доску и несет всякий бред. Знак у него отдельно в bool, ну охуеть вообще.
>>872159 TCC даже не пытается ничего оптимизировать, поэтому GCC по скорости компиляции его никогда не догонит. TCC был бы охуенным компилятором для сборки тестовых билдов, если бы он полноценно умел в C11 и если бы при дебаге в очередной раз не оказывалось, что баг был в компиляторе.
Как и чем этот говнокод можно покрыть тестами? Есть ли тут те, кто покрывают Си код тестами? Чем пользуетесь, как тестируете, что почитать, что изучить? Короче любой фидбек будет только на пользу.
>>872205 А что именно тебе тестировать надо? Бери и проверяй что сомнительно, gprof gdb для мониторинга, собери с самыми дотошными настройками компилятора с конкретным стандартом языка. А говнокод можно почти весь стереть, ксорг устарел, перекатывай на Wayland.
>>872196 А в GCC если оптимизации вырубить? А Clang? у меня шланг медленнее гсс компилировал, а говорили мол некстген компилятор, а джисиси легаси параша. >если бы мог в 11 А он не швабодный разве? Можно из других компиляторов код реализации стандарта похитить.
Функция потока принимает LPVOID. Мне нужно передать потоку хэндл другого потока, но если использовать указатель на void как аргумент, то его нельзя разыменовать по правилам языка.
>>872425 Стыдно спрашивать, но почему это возможно? void * - 32- или 64-битное число HANDLE - это тоже число Получается, что я пишу как на ассемблере, забывая про типы и работая только с двордами?
>>872425 >>872558 Точнее, не к указателю на HANDLE. Вопрос в том, как ты хочешь передать. Скастовав HANDLE к void* или передав указатель на переменную, хранящую HANDLE. И первое, и второе легально обратимо.
>>872558 >>872567 HANDLE - на самом деле указатель. Что-то типа: typedef struct tag_HANDLE *HANDLE; И кастить такой указатель на несуществующую структуру к указателю на void и обратно абсолютно легально, и implementation-defined behavior там отсутствует.
>>872573 Ну да, плохо уже помню про винду, извиняюсь. Но остальные типы хэндлов при -DSTRICT как раз "типизируются" неполными структурами в качестве дополнительной защиты от дурака.
Господа, нужно вытащить все используемые функции из файла, подскажите, как это сделать. Думаю по встречающимся скобочкам их вытаскивать в символьный массив по одной, а оттуда постить в другой файл, я все правильно понимаю? Но вот часть с детектированием этиъ самых функций меня вводит в ступор.
Почему при выводе массива char выводится его содержимое до нулевого байта, а при выводе всех остальных типов массивов наоборот выводятся их адреса в памяти? В то же время при передаче массива в функцию они оба передают в функцию свои адреса.
а схож с objective C? на mac osx10.10 в какой IDE кодить можно? сильно требуется математическое образование, алгоритмы, уровнения, вот это вот все? сисадмину (*NIX) сложно перекатиться?
>>873097 А я однажды писал на работе на Ada (просто вспомогательное приложение, не было разницы на чем его писать), хотя я работаю не программистом. По-моему нормальный язык, очень даже. Примерно как C++ в своей изначально задуманной форме, но только сделанный нормально. Честно не понимаю, почему в зк практически никогда не обсуждается, годнота же. >>873118 Не знаю насчет мака, IDE по-умолчанию — Gnat Programming Studio, неплохая. С сишки (и думаю с obj-c тоже) перекатиться легко, там нет функциональщины или каких-то особых выебонов, просто нормально сделанное структурное, generic и object oriented программирование.
>>873159 Странный ты. Нужна проверка - вот тебе проверка. Не нужна, или ты уверен, что и так все збс - за пару секунд отключаешь и продолжаешь радоваться жизни. В чем проблема-то?
>>873162 Мне интересно. Вот эти все языки с проверками границ типа Ada или там Java. Ну, допустим, прилетело исключение о нарушении границ. Дальше что? Один хрен валить программу.
>>873163 Я сам не особый сторонник исключений и вообще люблю сишку больше всех языков, но почему же сразу валить. Теоретически, баг может быть несмертельный и проявляться только в определенных ситуациях, например при получении запросов или входных данных определенного вида / в определенное время / etc. Можно конечно упасть и перезапуститься (и это если повезет, и баг приведет просто к сегфолту, а не к уязвимости), а можно залоггировать это дело, откатиться и попытаться продолжить работу, надеясь, что ситуация единичная, ну или перезапуститься тоже. Ну и еще раз: какбы фича отключаемая, если не видишь в ней смысла — можно и не использовать.
>>873191 А чем-тебя Оракл не устраивает? Он написан, вероятно, как раз на сишке/крестах по большей части, да и api имеет сишное. Заменить его на 100% тяжело будет, в конце концов его пилят уже сто лет, причем за сотни денег пилят. С остальными двумя приложениями не работал, ничего не могу сказать. В целом crm на сишке — более чем реально, все равно основное это база данных там, а остальное по большому счету без разницы на чем делать (я как-то делал не слишком сложный бэкэнд на сишке и каких-то особых препятствий не заметил).
>>873970 Конпеляторы легко пишутся на функциональных языках, на си это боль и унижение.
Зацените кстати ответ майкрософта на раст — https://www.microsoft.com/en-us/research/project/checked-c/ Иии... Это си с проверкой границ! Авесоме! на деле просто скопировали реализованное в стандартной библиотеке плюсов в язык, зато пейпер больше стандарта си Пусть хуесосы из леночкатреда расскажут ещё что рисёрчиские отделения компаний — не просто удобная основа для распилов.
Анон, почему функция получения значения ключа реестра работает неправильно? http://ideone.com/GUrzUZ
Стоит Win7 x64, программа 32-битная, поэтому выполняется отображение в ветку Wow6432Node. Ключ там есть. При выполнении программы выводится пустая строка. http://ideone.com/u2oBEY
Написал макрос для удобной (как мне показалось) инициализации auto и static массивов с присоединением значения длины к указателю, чтобы можно было не передавать в вызываемую функцию длину массива в отдельной переменной. http://ideone.com/0SsuoH Считается ли такое уже абъюзом препроцессора, или еще норм и вполне можно использовать?
>>874301 Слегка абьюз, потому что arr() выглядит как вызов функции, а на самом деле создает переменную. Даже если документируешь, будет неочевидно. Я бы сделал что-то типа struct xy *points = DEFINE_ARRAY(struct xy, ...); Несмотря на то, что тип приходится писать дважды, из такого кода очевиднее, что он делает. В len каст к указателю на void лишний. Макроса LENGTH в таком виде общепринято называется countof (по аналогии с sizeof). В остальном норм.
>>874303 Нинужен. Можешь назвать платформу, где не поддерживается хотя бы синтаксис С99 (без библиотечной-то поддержки платформ дохуя).
>>874301 Алсо, желательно использование имени ARRAY в макросе len обернуть в скобочки, а то мало ли, все бывает, решишь выражение передать, и произойдет что-нибудь веселое.
>>874304 >Нинужен. Можешь назвать платформу, где не поддерживается хотя бы синтаксис С99 (без библиотечной-то поддержки платформ дохуя). какие мы дерзкие.
>>874302 Каст через воид используется, чтобы заткнуть clang, который иначе почему-то жалуется на несовпадение требований к алайменту, хотя вроде бы очевидно, что там все нормально. По поводу названия / синтаксиса макроса думаю, что ты прав, если сделать как ты написал, то это выглядит уже не так странно, но при этом все равно намного удобнее, чем объявлять эту структуру вручную. >>874304 >Алсо, желательно использование имени ARRAY в макросе len обернуть в скобочки Спасибо, учту.
чуваки вот скажите, а как вы тесты хуярите? есть какие-нибудь системы, схемы, хуй знает. просто как-то это странно, у меня просто валяется в специальной папки набор main.с'ов которые инклюдяд заголовки того что они тестят, а это ещё и собрать нужно. на каждый делать по мейку? а если всю кучу прогонять, как-то детектировать какие провалили, как вообще прогресс теста указывать, или хуй с ним, падает значит проебал? вообще не ебу как это делается всё.
При ближайшем рассмотрении этот >>874301 макрос работает только для статических массивов (т.е. указатель может быть на стеке, но сам массив остается статическим со всеми вытекающими). Можно ли как-нибудь сделать макрос, который бы мог создать такой же массив (с префиксом длины), но на стеке (пусть даже без инициализации)? Я сам что-то никак не додумаюсь.
>>874437 Все, что в круглых скобках в макросе arr является static. Чтобы было более понятно, оно раскрывается во что-то типа int ⁎a = ((struct {size_t n; int u[3];} []){3, {1, 2, 3}}).u Создается статическая структура, состоящая из двух полей: длины массива и самого массива int этой длины. Затем адрес этого массива в составе структуры копируется в указатель a, который может быть где угодно (в т.ч. на стеке), но сама структура с массивом, тем не менее, остается static. Такую структуру можно создать и на стеке, но я никак не могу придумать, как сделать это максимально удобно (чтобы не нужно было два раза вручную вводить размер массива, а потом еще и инициализировать это же количество элементов). Также не хотелось бы создавать лишнюю локальную переменную для самой структуры, т.е. чтобы переменная была только у указателя на массив в составе структуры, но сама структура (безымянная) при этом тоже лежала на стеке (но вот это вот скорее всего совсем уже невозможно).
>>874451 что? там и так будет всё на стеке, где оно по твоему ещё может быть? что ты несёшь? с чего ты взял, что не создаётся экземпляр структуры на стеке, а потом о не заполняется?
>>874437 >>874458 Ты прав, я просто немного запутался. Похоже, что эта хуйня действительно на стеке. Статиком там является только временный массив, длина которого считается макросом LENGTH. Просто с таким способом автовычисления длины возникла проблема: макрос отказывается работать, если среди инициализаторов того, к чему применяется LENGTH, есть не константы (потому что этот массив считается статиком). Если передавать длину массива в макрос вручную, то такой проблемы нет. Ты открыл мне глаза, спасибо.
>>874458 Алсо, ты вроде хорошо разбираешься во всем этом, может подскажешь какой-нибудь хитрый способ вычислить в макросе количество переданных в него элементов массива, чтобы все-таки не приходилось вручную длину передавать?
>>874462 хуй его знает. я на макросах дохуя писал, можно организовать цикл и в нём перебрать все аргументы из __VA_ARG__, например держа счётчик как несколько 16ричных разрядов-аргументов. но это всё полный дроч, ненужно этим заниматься. а так-то можно хоть математику хуярить, правда у компиляторов есть ограничения в раскрытию... и это одна из причин почему это нахуй не нужно.
Для чего здесь переменным типа DWORD присваивается результат вызова функции GetProcAddress, приведенный к LPDWORD? Из-за этого код не компилится. Защита от дурака или какая-то древняя магия? Судя по HMODULE LoadExecutable (IN LPSTR path, IN PVOID base = 0), это C++, в котором с типизацией и кастами все строго. Непонятно, для чего это сделано.
>>874509 В коде происходит какая-то хуйня. Динамическая память с PE-имиджем освобождается и затем она используется. Сейчас бы найти журнал ксакеп за октябрь 2012, там на диске должен был быть PE-лоадер.
>>874468 Сейчас все-таки еще немного посидел с этим макросом, теперь работает и так:
int ⁎a = ARRAY(int, 1, 2, 3, 4, 5);
и даже так:
unsigned short x = 99; struct xy ⁎b = ARRAY(struct xy, (1, 2), (3, 4), (5, x));
В макросе круглые скобки автоматически заменяются на кривые где нужно. Но ты был прав насчет лютого дрочева, у меня сейчас такое чувство, будто бы я на брейнфаке написал что-то. Оказывается сишный препроцессор – вполне себе эзотерический язык.
Что я делаю не так? pStub указывает на PE-имидж загрузчика в памяти. Я хочу дописать в конец секции кода данные. Но с конструкцией &pStub[text->PointerToRawData + text->Misc.VirtualSize] что-то не так.
>>874710 Скажи, а pStub + 1 - это какой адрес, если учитывать, что pStub - указатель на void? Скасти к PBYTE или какому-нибудь другому указателю на char.
>>874716 Я кончил. Алсо, вчера забыл тебе сказать, что ты зря с анонимными структурами возишься в len. Весь len можно сделать просто (((size_t *)(array))[-1]).
>>874723 Я конечно не эксперт, но сделал так из предосторожности: ведь если мы присоединяем размер к массиву через структуру, то значит, что теоретически между переменной размера и массивом могут быть padding-байты, в зависимости от требований к алайменту элемента массива (например на моей системе у size_t алаймент 8, а у max_align_t – 16). Потому в текущей версии даже задействовал alignas из C11, чтобы между началом массива и его размером всегда было одинаковое количество байтов. Или это я зря заморачиваюсь?
>>874732 Просто сишка на самом деле довольно задротский язык. Вот я все время думаю, что вот я ее освоил и уже знаю кучу тонкостей и нюсансов, а потом оказывается, что где-то снова проебал что-то неочевидное.
Прошу прощения если надоел, но я продолжаю додумывать улучшенные массивы для сишечки. Если я сделаю такой макрос len, который (как я надеюсь) будет автоматически определять размер или по методу sizeof(a)/sizeof(a[0]) (в случае массива) или доставанием значения из size_t переменной в префиксе массива (в случае указателя), ждут ли меня какие-либо подводные камни? И если да, то какие? #define len(ARRAY) (((void ⁎)&ARRAY == (void ⁎)&ARRAY[0]) ? LENGTH(ARRAY) : length(ARRAY))
Господа, сдаю я курсач преподу дальше можно не читать, вот код. http://pastebin.com/EEE3FJQ2 Так он сказал, что нужно конечными автоматами, помогите со структурной моделью, я в этом вообще не шарю, пожалуйста, пишите свои идеи. Алсо, суть - вытащить из текстового документа названия функций, просто названия, без типа и аргументов, как у меня.
В проекте VS2010 включена оптимизация по размеру. Если код, который выделяет четыре байта в куче, пишет туда дворд и освобождает эту память полмиллиона раз, находится в WinMain, компилятор его не выкидывает. Но если я выделяю этот код в функцию, компилятор ее оптимизирует, и она не попадает в бинарник. Как заставить компилятор сохранить ее?
Рубрика зодай вопрос анону. Ув. Анон! Вот есть fgetc(). Так ведь? Если у нас есть цикл, где этот фгетц читает по символму из файла, как он знает что нуно перескочить на следующий символ в файле, это внутри самой функции указатель некий? Или же это древние темные механики скрытые от простых смертных?
>>875859 Зависит от реализации. Обычно за внутри структуры, на которую указывает FILE, хранится системозависимый дескриптор или хэндл для "родного" для системы API доступа к файлам. Если это "обычный" файл, т.е. с произвольным доступом, с этим дескриптором в ядре ОС ассоциировано смещение в файле. По этому смещению и происходит чтение. И функции чтения автоматически увеличивают смещение на прочитанное число байт. Плюс ещё, на стороне программы, может быть буффер. Он тоже связан с FILE. Ну и читается какой-то заметный кусок из файла в буффер. И, соответственно, есть указатель на текущий символ в буффере, который fgetc() увеличивает.
Я тут упрощённо описал как это примерно выглядит на чём-нибудь вроде windows или *nix.
Аноны, начал изучать Си по наставлению нашего товарища и возник с рядом проблем. Изучаю по книге Кёрнигана и вижу для себя море незнакомых формулировок, слов и т.п. Из-за этого думаю, что Кёрнигана лучше оставить на потом, а пока что начать читать что-то более простое. Непосредственно вопрос: может подскажете что-нибудь попроще, или все-таки грызть тот самый материал, который я не понимаю? Не понимаю из-за того, что не могу можно сказать самые первые упражнения сделать сам. К слову, в /pr полный ноль, максимум, что могу сделать из этой среды - прописать shutdown -s -t 180 в командной строке, когда выхожу из дома памагити
>>875995 > спасибо огромное анон, еще вопрос: стоит после поверхностного изучения данного языка зубрить его то состояния белиссимо, или же параллельно знакомиться с чем-то новым?
>>876011 с целью начать изучать хоть что-то, ибо сестра к себе хочет взять на стажировку в iba спросил у анонов тут пару дней назад, что лучше изучать - сказали Си, я потихоньку пытаюсь
>>875528 самое забавное, что эти хуесосы и в продакшон такой код высирают (если это не исходники уровня chrome где уже кодерам нада от 150к в год платить, а в закрытых кодовых базах помельче именно такой пиздец за частую и есть)
>>876016 >а вы уебки и его не знаете Сколько (минимально) чтений по указателям a и b сгенерирует следующий код? Если знаешь язык, то тебе понадобится не больше пары секунд чтобы правильно ответить и объяснить почему.
int ololo(int a, int b) { int x = 0; int y = 10; x = a + b; x = 10; y += b; x += y; b += x; y = dosmth(a); return y + a + *b; }
>>876053 >>876045 Короче, рядом с a и b звезочки стоят везде, кроме dosmth(a). Алсо, если кому-то не лень, ответьте, потому что я и сам хочу проверить, правильно ли я думаю.
>>876071 Это да. Я правда сперва сам не совсем правильно посчитал, а так там 2+2, все правильно. Алсо, я когда-то не знал про это все, и тогда мне казалось, что не нужно кешировать значения по указателям в локальных переменных (тип лишние переменные будут занимать место, лол), а потом я почитал про restrict, а потом выяснилось, что если вызывать внутри функции другие функции, то и restrict'а будет мало… Но отчего-то мне кажется, что я еще дохуя всего не знаю.
>>876045 Правильный ответ "сколько угодно", вплоть до выбрасывания всей функции нахуй. Подобные разговоры мало того, что в принципе бессмысленны, так еще и могут идти только о полной, нормально компилирующейся программе.
>>876143 ну как тут без твоих выебонов. поняли все? вы дурачки, не берите в голову, открывайте и берите в рот, как господин у которого компилятор раскрывает функции.
>>876185 Например, с того, что она не вызывается. Или у нее явно нет сайд-эффектов (и у dosmth тоже), а возвращаемое значение не используется. Или она вызывается один раз, и аргументы известны, поэтому компилятор может решить весь вызов свернуть в одну константу.
>>876272 Так логичнее. Сначала Си был, потом его допилили до С++. Более логичная последовательность. Да и просто Си проще и примитивнее, а в С++ больше сложных вещей и абстракций.
>>876243 Си конечно. Печально что б-во вкатыльщиков не знает что С++ никогда не был популярней и востребованней Си и не будет. Просто вакансии на помойках всяких в основном ориентированы на всякий скам.
Из академического интереса хочу написать полиморфный код на си. Я слышал, что на фасме можно закриптовать код даже на этапе компиляции, но как сделать это на си, я не знаю.
В общем, критическая часть программы выглядит примерно так:
void CriticalFunc(void) {} void EndFunc(){}
В рантайме происходит расшифрование от начала функции до метки EndFunc().
Но как ее сначала зашифровать? Инбифо: ксором в HIEW Если собирать с оптимизацией по размеру, компилятор может выкинуть метку EndFunc. Проблема решается объявлением указателя на нее volatile? Может ли линкер разместить EndFunc не после критической функции?
>>876780 Самый простой способ - написать кастомный кодогенератор для tcc. Можно экспериментировать с LLVM. Можно просто сваять простейший парсер PE/ELF и криптовать секцию кода целиком. Алсо, можно сделать свой линкер - минимальный линкер под сишечку написать несложно, если есть опыт байтоебли.
> Если собирать с оптимизацией Если творить такую хуйню, фиксированные параметры компиляции и минимальная оптимизация - это мастхэв.
> Может ли линкер разместить Классический линкер не может менять порядок функций в объектнике, и выкинуть функции он тоже не может, но есть всякие фичи типа "separate functions for linker" (в терминах MS) и прочие LTO >>876268, поэтому опять же нужно подобрать такие параметры сборки, когда линкер не будет мешать твоим планам.
Вопрос нубский и вероятно платиновый пишу калькулятор матричных операций анон, подскажи пожалуйста как читать с stdin пока не закончаться знаки операций то есть
matrix + matrix * matrix
я понимаю что вроде пока op не EOF но что-то никак
>>877059 Читай fgets() в буфер, если во время чтения строки юзер тыкнет Ctrl+Z (Ctrl+D в Linux), fgets() вернет NULL, и ты закончишь. Дополнительно ты можешь проверять первый символ буфера. Если он \0 или \n - юзер ввел пустую строку, можешь по этому признаку тоже завершать ввод. А дальше ты можешь либо разбирать буфер вручную через strtok(), strtoSMTH() или делать sscanf().
>>869911 (OP) Онан, поясни за GUI на pure-C. Какие фреймворки используешь? Сколько весит hello-world на таких? Можно ли static-версию делать?
(цель Windows 2000-10, Ubuntu 14-...) Пишу для микроконтроллеров, но иногда надо делать управляющие программы. Пока что делал на delphi 7, лол. Пробовал на Qt, но по 70 мегабайт библиотек таскать, это пиздец.
Когда компилирую в Pelles C и запускаю, появляется два процесса, которые спавнят друг друга. Но если компилирую в MSVS 2015, второй процесс не запускается, и приложение закрывается после нажатия на крестик. Почему?
>>877723 Качай ребол/пюревасик или даже блитзмакс и делай на них. Кроссплатфоренно, просто, а в последнем с/крестокод можно прямо к нему линковать не переписывая.
Вечер в хату, мужики и стремящиеся. Хочу сделать полупрозрачный гуй, чтобы главное окно и контролы были полупрозрачные, но рамки были яркие. Примерно как на пикрелейтед. Как это можно сделать? Перекопал сегодня много сайтов, но нашел мало полезного. Вот, например:
Уже перечитал несколько про циклический алгоритм во многих источниках, но так и не могу ничего сделать, может кто нибудь дать совет по конкретному примеру? Хотя бы основу самого цикла, а то я возился около 4ех часов и ничего не получил, а лабу сдавать в понедельник
>>878164 Вроде про цикл в задании ничего. Рекурсивно оно проще для понимания. Погугли "recursive cosine taylor series in c". Ну или можешь циклом считать, да. Минусы и плюсы - это 1 в степени n, степени в числителе - 2n, числа в знаменателе - факториал 2n. Значения, требуемые для вычисления числителя и знаменателя можно запоминать с предыдущего шага. > не понимаю как заставить считать значение n-ого слагаемого В смысле, не умеешь возводить число в степень с помощью pow() и делить его потом?
>>878172 Ну тебе все равно всю сумму считать. У тебя будет цикл от 1 (или 0) по n, в цикле ты вычисляешь очередное слагаемое, заканчиваешь n-ным. В чем проблема вывести его после выхода из цикла?
>>878472 Пиши малварь. Поделай что-нибудь в реестр, напиши примитивный троян, который копируется в пользовательские папки, сканирует снапшот процессов и закрывает диспетчер задач. Посмотри, как мейлру параша прописывается в системе и самовосстанавливается. Сделай так же. Подъеби кого-нибудь этим трояном, главное, не попади в чью-нибудь статью о том, как лох пытался впарить троян, но соснул.
>>878524 Во-первых, до малвари нужно язык выучить, чтобы не быть, как тот анон из ньюфаг-треда, который функцию переменной присваивает, да и не только язык - по-хорошему, желательно прочитать хотя бы Рихтера, а потом заполировать Inside Windows. Во-вторых, я очень надеюсь, что тебя поймают и пояснят по хардкору, почему распространять малварь плохо.
отцы помогите тотал нюфагу вкатитсяможет что-нибудь получится в поставке clang++ из коробки я так понял нет стандартных библиотек, а в GCC:g++ есть. можно их как-нить с консолидировать чтоб и clang все появилось
>>878609 Я не знаю, почему у тебя таргет по умолчанию msvc. Возможно, стоит убрать переменные окружения INCLUDE и LIB. А насчет хедеров - я сейчас поэкспериментировал, та папка не нужна, оно (по крайней мере у меня) находит директорию с MinGW, если она есть в PATH и автоматически использует инклуды оттуда. Но у меня в винде только clang 3.7 и gcc 4.8. Может, с тех пор что-то сломали. Возможно -target mingw32 решит проблему.
>>878604 > доброе утро. > 00:45:55 > NTFS есть симлинки и хардлинки То-то я смотрю, в Cygwin до сих пор пользуются магическими файлами, а в Msys ln -s равнозначно cp. Наверное, они не знают об этих фичах файловой системы.
>>878624 > скорее всего, вместо решения проблемы предложат поставить линупс. Ну, это как спрашивать у мылачей, почему последняя студия под вайном не работает и как это исправить.
>>878627 Ты уж определись, либо компилятор кроссплатформенный, либо только под линупсы. В студии кроссплатформенность никто не обещал. Шланг и гцц нормально работают в винде, но могут возникать мелкие проблемы, в основном из-за LFSтрадиции хардкодить пути.
>>878629 То-то и оно, что тонкостей больше, чем приемлимо для ежедневного использования. Невозможность создавать эти самые симлинки от обычного юзера в дефолтных настройках безопасности, как пример. А потом говорят, что в линуксе пердолинг.
>>878643 Я junctions и хардлинки очень давно использую. Нестандартные права для них не нужны, проблем особых с середины 2000х не припомню кроме мелочей типа антивируса, впадавшего в бесконечный цикл при сканировании или инсталляторов, которые до сих пор! проверяют свободное место на томе, где расположена junction point, а не там, куда она указывает.
>>877971 ебашу интерпретатор джавы на сишке, при алокации структур заношу указатели в буффер, чтобы при любой ошибке сразу вычистить всю память и не было leakов. Проблема лишь в том, что по ходу работы интерпретатора я все равно освобождаю память и в результате при очистке памяти у меня может программа попытаться вычистить уже пустой указатель, поэтому надо как то проверять их. Не покидает ощущение того, что организовываю все это ебано, возможно есть лучший варик как это сделать
Изучаю использование юникода в винапи по книге Рихтера. Как вызвать ошибку компиляции в этом коде? http://ideone.com/jEG29d
Рихтер пишет, что компилятор по умолчанию рассмаривает строки как ANSI, поэтому код компилируется нормально. Но если определить _UNICODE, то возникнет ошибка. Однако ошибка не возникает ни при определении этого макроса с подчеркиванием, ни без подчеркивания. Почему так?
Окей, реализовать обычный стек для обычных числел, ноу проблемс. Допустим stack[n] или вообще (int )malloc(ij*sizeof(int)) Не могу придумать, как в стэк пихать 2D массивы? Гугл молчит, либо я слепошарый.
>>878860 Ты представляешь, как препроцессор работает? Ты определяешь UNICODE после включения windows.h, и в результате в windows.h (точнее, в одном из включенных из него хедеров) TCHAR дефайнится как CHAR. Очевидно, чтобы возникла ошибка, надо сделать -DUNICODE в командной строке или дефайн до инклуда.
>>878910 > UTF-8 в Windows И кодировать туда-сюда на каждый вызов API. Охуенный совет. Не говоря уже о проблемах самой UTF-8, удобной лишь для передачи текста, а не для обработки.
>>878907 Указатели пихай или поясни, зачем ты собрался пихать в стек массивы по значению.
>>879097 >И кодировать туда-сюда на каждый вызов API. Всю жизнь собрался сидеть в WinAPI и дальше локалхоста не вылазеть? > Не говоря уже о проблемах самой UTF-8, удобной лишь для передачи текста, а не для обработки. Ахахаххаахахахахаха! Вангую бред про "доступ к символу по индексу".
>>879113 sizeof(wchar_t) в NDK, очевидно же. Да, доступ по индексу. Да, необходимость бранчей или таблиц для вычисления длины строки. А еще инвалидный UTF-8, приводящий к уязвимостям. А еще невозможность порезать строку нормально.
>>879118 >sizeof(wchar_t) в NDK Пхе-хе-хе, при чём тут android, это libc, старающаяся быть совместимой с glic. > Да, доступ по индексу. ffl — вот 3 буквы. Получи по индексу доступ ко второй. > Да, необходимость бранчей или таблиц для вычисления длины строки. define "длина строки". Для меня и strlen "длина строки". > А еще инвалидный UTF-8, приводящий к уязвимостям. Проблема уязвимых библиотек. > А еще невозможность порезать строку нормально. Раскрой мысль.
>>879123 > вот 3 буквы Я про буквы не говорил. Про то, как юникод устроен, я знаю, и про combining characters тоже, и про лигатуры. Но я вполне могу юникод нормализовать, хранить его нормализованным в UTF-32 и потом что-то в таком виде с символами сделать (например, проверить класс по табличке). И делать это проще, когда у тебя codepoint - одна сущность, а не когда тебе ее нужно сначала из байтиков собрать, да еще не забыть на валидность проверить.
> Для меня и strlen "длина строки". > Проблема уязвимых библиотек. Нет, вопрос сложнее. Например, я закодировал \0 в виде двух байтов. У либц (strlen, в частности), твоего кода и библиотечного кода могут быть совершенно разные взгляды на этот символ (и это правильно, потому что подход зависит от цели обработки, а та же либц про твои цели нихуя не знает). Кто-то это выбросит, кто-то заменит, кто-то ошибку вернет, а кто-то пропустит.
> А еще невозможность порезать строку нормально. snprintf() и случай, когда строка не влезла в буфер. Возникают веселые спецэффекты.
>>879147 > проверить класс по табличке). И делать это проще, когда у тебя codepoint - одна сущность, а не когда тебе ее нужно сначала из байтиков собрать, да еще не забыть на валидность проверить. Нет, ну если у тебя единственная задача — проверять класс codepoint-а по табличке, то для тебя UTF-32 — лучший выбор.
> я закодировал \0 в виде двух байтов. Искусственный пример. Если ввод должен прилетать откуда-то извне, он должен проверяться на валидность. К кодировке это отношения не имеет.
> snprintf() и случай, когда строка не влезла в буфер. Возникают веселые спецэффекты. Чем же нам тут UTF-32 поможет?
>>879153 > Чем же нам тут UTF-32 поможет? > К кодировке это отношения не имеет. Тем, что строка останется валидной. А вот если ты порежешь UTF-8 посередине codepoint, у тебя из проверенного, валидного юникода возникнет невалидный, но ПРОВЕРЕННЫЙ, со всеми вытекающими.
>>879156 > fopen() Это вопрос про недостатки сишной либы, и к тому, какие имена файлов и в какой кодировке принимает ОС. Она может принимать исключительно 7-битный ASCII, если это ембеддед, может принимать исключительно CP866, а может вообще указатель на 16-байтовый бинарный GUID последнее - трустори, если что.
>>879163 >Тем, что строка останется валидной. Ой-ой-ой. Манявалидной, ты хотел сказать. Никому нафиг не нужна валидная последовательность байт, люди на буквы смотрят =)
Думаешь, обрезание только по четырёхбайтовым границам спасёт тебя от кривых строк? Ха-ха-ха. До первого клиента, которому ты отрежешь accent-ы от буквы. Желаю успехов в объяснении ему что это валидно.
>>879163 >Это вопрос про недостатки сишной либы Это про преимущество. Хоть куда-то этот блядский wchar_t не пролез. Его вообще не должно существовать! > какие имена файлов и в какой кодировке принимает ОС Ну, кхе-кхе, кхе-кхе, тут может быть проблема. Но если ты принимаешь имена через аргументы командной строки, то должно, в идеале, работать везде.
>>879169 > люди на буквы смотрят Так проблема-то в том, что компьютеры смотрят на байты. Например, если это логин или имя файла.
> отрежешь accent-ы от буквы Что лучше: оставить висеть акценты, пролететь мимо \0 в буфере или много позже вернуть из какой-то функции ошибку, когда ее никто не ожидает?
> Кстати, сколько букв в следующей строке "ch"? Букв две.
В общем, я тебя понял, ты меня понял, друг друга мы не переубедим. У тебя идеальный мир, ограничивающийся линупсами и, подозреваю, прочитанный когда-то манифест про утф8 эвривер, а у нас на работе только пару лет назад ANSI-шные билды дропнули. Алсо, в последнем проекте у меня у самого UTF-8 основной кодировкой, кроме встроенного редактора и абстракций над файловой системой. Время покажет, что из этого выйдет.
>>879180 > Что лучше: оставить висеть акценты, пролететь мимо \0 в буфере или много позже вернуть из какой-то функции ошибку, когда ее никто не ожидает? Ничего не лучше. И UTF32 никак не поможет.
>>879097 >зачем Мне на вход подается ебаная куча матриц, и операторов между ними. Я должен всё это подсчитать, естественно умножение приоритетная операция. Ну я и подумал собирать матрицы и операторы в стек и постфиксной ротацией всё это вычислять.
>>879669 Эта функция была недокументированной на момент написания кода, и чтобы не кусать локти, если Microsoft вдруг ее уберет не уберет, к ней не стали линковаться статически.
>>880521 Хуй знает, что у тебя там задумано, но у меня все выравнивается, мессаджбокс выдает адреса, по которым начинаются твои нопы. Зачем ты ксоришь код и потом вызываешь полученный мусор?
В рекомендациях книжка Кернигана и Ритчи, в первой же главе - while(getchar() != EOF) Как передать ЕОF , если я предаю значение из командной строки в винде? В одном месте советуют ctrl+z, но нифига. Не работает. CodeBlocks, Win7, TCC
>>869911 (OP) Перепощу из треда ньфагов, тут вроде уместней?
Подскажите, почему запоминается последняя цифра, если цикл до 15, а цифр в числе 16? Если я сделаю цикл до 16 значений, то а[16] запишется как 0. Можете объяснить?
#include<stdio.h>
int main(void) { long long h; do { printf("Card number:\n"); h = get_long_long(); } while(h<=0 || h>=9999999999999999 || h<1000000000000); if (h<1000000000000000) { while (h<999999999999999) h=h*10; } int a[16]; int b[16]; int i; for(i=1; i<=15;i++) { printf("%i\n",i); printf("%lli\n",h); a[ i ] = (int)(h%10); h = h/10; printf("%i\n\n",a[ i ]); } for(i=1; i<=16;i++) { b[ i ] = a[17-i]; printf("%i ", b[ i ]); } }
Ну и ещё, подскажите, если знаете, как проще задать это ограничение на получаемое с клавиатуры число: положительное, от 13 до 16 знаков.
Нужно создать функцию, которая может принимать в себя любую другую функцию это вроде callback называется. Немного погуглил и наткнулся лишь на примеры с заранее определённым типом и аргументами принимаемой, а мне надо чтобы функция могла принимать ваще любую функцию. Как запилить?
>>881436 > pointer_na_voobshe_chto_ugodno > voobshe_chto_ugodno Алсо, объясни, что ты будешь с этим колбэком делать, тогда тебе, может быть, и посоветуют.
>>881432 Попробовал на практике, когда я вызываю указатель на вообще что угодно мне говорят что "pointer_na_voobshe_chto_ugodno is not a function or function pointer".
>>881488 > 1488 Указатель, чтобы его вызвать, надо сначала скастовать к тому же самому типу, каким была объявлена функция (иначе undefined behavior). Вот тебе пример. Сначала объявляешь типы своих колбэков (решетку везде заменяй на звездочку): typedef int (#GovnoPtr)(int arg1); typedef void (#MochaPtr)(int arg1, char #arg2); Потом делаешь enum с перечислением своих типов: enum CallbackType {CALLBACK_GOVNO, CALLBACK_MOCHA}; В свою йоба-функцию-обработчик ты скармливаешь не только указатель на колбэк, но и его тип: void zaloopa(void #callback_ptr, enum CallbackType type) { if (type == CALLBACK_GOVNO) { int result = ((GovnoPtr) callback_ptr)(1488); } else { ((MochaPtr) callback_ptr)(359, "MYTISCHI UNITY HARDCORE"); } } Как-то так.
Я либу пишу, в либе есть функция, которая должна принимать функцию из внешней программы, которая пользуется этой либой. Так вот, мне нужно юзерфрендли! Чтобы просто всё было. А тут... Бляяя, пиздец. Бляяя, пиздец!
>>881785 > принимать функцию из внешней программы Нельзя вызвать функцию, не зная ее тип.
> мне надо чтобы функция могла принимать ваще любую функцию Поясни, зачем. Скорее всего, ты хочешь void (∗ callback)(void ∗user_data) - это нормальная практика, максимум юзер-френдли. Ну или в крайнем случае проебать типы и void (∗ callback)(int paramspec, ...), но для этого варианта нужны серьезные основания.
Ты уже принимаешь указатель на фунцию. Хочешь его куда-то записать - объяви другой указатель на функцию и используй = для присваивания. Или покажи код.
>>881800 Ну объявляешь указатели на оба массива. В цикле читаешь символы по указателю на B, если прочитал '\0' - выходишь из цикла, если прочитал что-то, для чего isdigit() вернул ненулевое значение - пишешь символ по указателю на буфер A. После выхода из цикла пишешь '\0' по указателю на буфер A. Про инкременты указателей не забудь. Алсо, можешь сделать то же с индексами, а не с указателями.
Что читать:
- Классика от Отцов: 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 2015 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)
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
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
- https://arhivach.org/thread/198868/
- https://arhivach.org/thread/206632/
- https://arhivach.org/thread/211714/
Шапка: http://piratepad.net/bJ1SdmkZyu