Вы видите копию треда, сохраненную 13 декабря 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 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
Ибо воистину, первый язык. Основа основ.
Все стандарты (OpenGL, OpenMP, OpenCL (API настройки девайсов, не сам язык для их программирования) ) написаны под него.
Нещитово
Анон, как мне сменить язык с С++ на просто С, я ультраньюфаня
Это невозможно, придется тебе учить плюсы. Извини.
Это была си шутка. Просто создайфайол с расширением .с
Сразу еще один вопрос, почему программа не выполняется? Я жму "скомпилировать и выполнить" и выходит эта ошибка? Что не так делаю
А, все, разобрался
Кто так пишет исходный код? Не будь макакой, приучайся писать нормально.
1. Где форматирование? IDE не поддерживает автоформатирование - делай вручную.
2. Название файла кириллицей - из-за этого однажды утром ты можешь не проснуться. Подумой.
3. Нет проверки введённых значений. А вдруг ввели белиберду. Проверь, чтобы scanf возвращал единицу.
4. Если кодишь под Windows - __try, __finally, __except.
Ой да ладно тебе, кто в твой код заглянет? Пиши как умеешь, расшумелся тут.
Заполняю при помощи rand() без всяких примочек - если ввести одинаковые границы диапазона, вывод всегда будет одинаковым.
Если использовать сранд srand() со временем - выводятся одинаковые числа, я так понял, потому что генерируются одновременно.
Есть что простенькое, чтобы помочь мне выводить случайные целые числа, которые будут меняться каждый вывод и не будут совпадать (т.е. не будут закономерно совпадать)?
Простенькое, так как только начал изучать массивы, я грю уж про рандомные числа.
Ты перед каждым вызовом rand делаешь srand? Код показывай, из описания не разберёшь, что у тебя там за проблемы.
Я не делаю srand(), тамушта везде в тырнетах пишут сранд этот сраный со временем, что мне не подходит
Да держи, только расскажи, что за pkg.
И мне способ простой нужен, если ты не читаешь по-русски с первого раза
> Почему i <= 11? i < 12 должно быть.
Ты серьёзно? Это важно? Это действительно важно?!
И ты хотел написать srand(time(NULL)), верно?
Ок, сейчас запилю,
Ну и где у тебя srand?
>способ простой нужен
http://www.pcg-random.org/
Скачал, заинклюдил один файл, вызвал две функции - куда уж проще.
>мне бы узнать, с какой точностью он время берёт для рандомизации
srand - это начальное значение для генератора псевдослучайный чисел. Без него у тебя всегда будут одинаковые значения. В некоторых случаях полезно, но не здесь.
> Скачал, заинклюдил один файл, вызвал две функции - куда уж проще
Мне нельзя так делать, давайте в рамках ANSI C и без примочек, мне это ещё сдавать.
>Ты серьёзно? Это важно? Это действительно важно?!
Это очень важно. У тебя 12 элементов, самому проще будет.
>И ты хотел написать srand(time(NULL)), верно?
Именно так и написал, как хотел. Только ';' в конце ты пропустил. Не сконпелируется.
Сделал с srand, внезапно, всё заработало, а в прошлый раз были схожие значения
Это не влияет на язык, только на метод создания имен экспортируемых символов.
>Допустимо ли в 2016 году использовать глобальные переменные?
В допустимых пределах всё допустимо.
>лучше передавать сокет как параметр функции
Так ты как минимум сократишь возможность написать лапшу, в которой закроешь сокет раньше чем последний раз будешь в него стучаться.
Как же ты прав, анончик…
>питончика
Питухон для пидоров, начинай с Перла, он наиболее близок синтаксически к Сифактически интерпретируемый Си с плюшками.
Абсолютно похуй, с какого языка начинать. Гуманитариям питон лучше идет. А вообще, питон и сишечка превосходно друг друга дополняют.
>питон и сишечка превосходно друг друга дополняют
Типа обмазанный ООП Путухон дополняет процедурный Си, ну хз.
У нас в проекте кодогенерация и всевозможная поддержка билда на питоне, например.
> всевозможная поддержка билда на питон
ну это модно и молодежно, не более.
а я прототипирую на перле, а затем практически перевожу один к одному на си.
Питон читаемый, и его знают все. Перл знают только олдфаги, а написать на нем неподдерживаемый код можно даже случайно.
http://ideone.com/u1q82P
Меня устраивает почти всё, кроме одного.
Нужно, что бы если числа повторяются, то они выводились со степенью. Пробовал завести перменные, типа предыдущий делитель и count и сравнивать новый делитель с предыдущим, и т.п.
Но выходит какая-то хуита.
Как это реализовать?
В примитивности и скорости.
Но узконаправленные языки для узконаправленных задач быстрее должны быть, и есть.
Поясните зачем это? Я ничего этой функции передавать не хочу, а если хочу то что передавать?
кстати заебатые слайды тут: http://web.eecs.umich.edu/~sugih/courses/eecs281/syllabus.html
например http://web.eecs.umich.edu/~sugih/courses/eecs281/f11/lectures/10-Mway.pdf
просто съебись с винды и используй /dev/random как царь. в общем-то, по сути не барское это дело, генерировать случайные числа. или как илатка любит поправятся, вынув изорта болт на время, псевдо.
например ключики передавать, и также путь до программы система передаст. ты совсем деревянный чтоль?
Хочу изучать Си, как первый язык, так как он довольно интересный и монументальный.
Изучать хочу по расово правильной книги от отцов, правильно ли я поступаю, или стоит начать с чего то по проще?
Правильно, дерзай.
Компилятор нормально делает таблицу, если вариантов не полторы штуки, а разброс значений не очень велик. Проверка верхней границы диапазона стоит всего две инструкции, это не слишком дорого.
00416C31: Directly-> 0C570000 : 77F06B7E : RtlEnterCriticalSection
Как и IDA создать таблицу импорта вручную? Или заменить адрес 7DE922B0 на осмысленный RtlEnterCriticalSection?
Самый простой способ, который вижу - создать комментарий с функцией с помощью скрипта. Но хотелось бы знать, вдруг можно по другому.
Проще всего запилить новую таблицу импорта в бинарнике (автоматически 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 на адресе имена прописывать, лол.
>Изучать хочу по расово правильной книги от отцов, правильно ли я поступаю, или стоит начать с чего то по проще?
Ты медицину начал бы изучать по книгам от отцов?
У меня объявлены:
TCHAR processName[BUFFER_SIZE];
TCHAR dllName[BUFFER_SIZE];
Но при компиляции такого кода strncpy(processName, buffer, BUFFER_SIZE); возникает ошибка из-за того, что функция не принимает тип TCHAR. Однако если заменить тип данных на char, тогда ошибка возникает в GetWindowText(hWnd, buffer, sizeof(buffer)); потому что эта функция требует аргумент типа LPWSTR. Что делать?
Ну можешь использовать виндовые апи (типа lstrcpy, или StrCpyN), можешь поинклудить tchar.h (_tcsncpy), а лучше не еби мозг, скажи компилятору -DUNICODE и используй юникод всегда. Нахуй тебе ансишный билд в конце 2016 года?
В смысле, у тебя и так уже юникодный билд, судя по ругани, поэтому просто всегда пиши WCHAR вместо TCHAR, LPWSTR/LPCWSTR вместо LPTSTR/LPCTSTR и т.д. Ну и #include <wchar.h>, там есть wcspy, вся хуйня.
да и хуй с ним. как называется такая хрень, что я гарантирую, что после добавления, удаления того-же элемента (например, в том же 2-3 дереве), вся структура будет такой же как и в начале? ну то есть, та же память, те же указатели. вроде это важно. хотя и хуй пойми каким боком к ц, просто лень из вкладки выходить.
скажи лучше, а дохуя на call жрётся? например, когда по указателю. так то, с учётом конвертеров, кешей, всех этих ебучих заморочек в современных процах. в тех же деревья, вообще, адекватно использовать со внешней функцией cmp ?
Но зачем? В основном файле должно быть полторы функции для управления всем остальным, зачем им прототипы? Кто будет их вызывать кроме main()?
> Нужно, что бы если числа повторяются, то они выводились со степенью
Дели в цикле, не переходи к следующему делителю, пока не получишь остаток. Количество итераций минус 1 будет как раз степенью. Алсо, в сишечке есть функция lldiv, которая позволяет вычислить сразу и частное, и остаток, с ней будет быстрее. Алсо, не совсем понятно, что ты там меряешь. Если уж мерять, то построение таблицы и факторизацию каждого числа отдельно.
Хорошее место для предварительного объявления или включения всех заголовочных файлов.
с инклюдом в main.c, модно придумано.
хуёвый какой-то у тебя компилятор, даже чаты не поддерживает.
Хедеры делают, чтобы не писать в каждом файле (единице трансляции) одни и те же объявления типа:
[CODE]extern char g_yoba;
int allo(void);
int ebal(struct tvoyu_mamku );[/CODE]
Если твой main.h будет подключать ещё какой-то файл, то это имеет смысл. Если только файл main.c - это бессмысленно.
Error in `./b.out': realloc(): invalid next size: 0x000000000229f010
У другого человека в Dev C++ все нормально работает. ЧЯДНТ?
>С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
ну ахуеть.
>Что обсуждать будем?
давайте философствовать. что выносить в подпрограмму? считаю, повторяющуюся часть кода не возвращающего значение можно задефайнить, если результат работы порождает новую сущность (аки возвращаемое значение) в подпрограмму.
абасыте.
Что-то такое было уже. Избегаю писать многострочный код в дефайнах до последнего. Как минимум потому что функции читаемее, а компиляторы неплохо их инлайнят сами. Но если контекста дохуя, а производительность важна, тогда дефайны, что поделать-то.
>>871088
Смотри, что ты выделяешь память под 1 инт, пишешь туда элемент. Всё ок. Потом i становится 1, ты делаешь реаллок, (пере)выделяешь массивчик под 1 инт, и... пишешь инт по индексу 1, то есть за пределы массива. Из этого следуют простые мысли:
1) Однобуквенные переменные зло. Написал бы length, не ошибся бы.
2) У гцц есть охуительная фича. Пишешь -fsanitize=address и он по хардкору разноцветным текстом поясняет, где и как ты портишь память. Другие -fsanitize тоже заслуживают внимания.
3) Реаллок, на каждом шаге, кстати, тоже зло. Выделяй с запасом (вдвое больше, чем раньше, например), запоминай, сколько выделил. Классический динамический массив - это array, length, capacity.
>У гцц есть охуительная фича. Пишешь -fsanitize=address
Это не она требует пересборки всех либ с этой опцией?
>Что-то такое было уже.
в прошлом треде, но был перекот.
>Как минимум потому что функции читаемее
всмысле код в теле? но ведь теперь функция будет маячить перед глазами как нечто важное, а на самом деле это просто сокращение для копипасты.
но если ты код делаешь грамотна раскидывая по юнитам, то такие функции у тебя будут static inline. и например, нигде не будут видны за этим конкретным местом.
Да вроде не требовалось ничего рекомпилить, если, конечно, в либах нет багов, на которые оно ругается. Оно маллок хукает.
А. Я с сатанайзером, который чтение из неинициазилированной памяти ловит, спутал.
> Реаллок, на каждом шаге, кстати, тоже зло. Выделяй с запасом
libc не должна сама это разруливать?
> libc не должна сама это разруливать?
Не должна, зависит от реализации. Лучше уж самому выделить, чем гадать, как оно будет работать.
Ну это явно зависит от конкретной реализации. Но логично предположить, что никто не будет делать реализацию, которая будет выделять всё время один в один запрашиваемый размер. Как минимум, он будет округлён до ближайшего оптимального размера, который подбирается с учётом данной архитектуры (размера страницы, кешлайна и хуй знает чего ещё), чтобы скорость доступа к памяти была наиболее высокая.
>Лучше уж самому выделить, чем гадать, как оно будет работать.
Преждевременная оптимизация — корень всех зол. Тем более для лабы1, где уж точно больших проблем из-за реаллоков не возникнет.
>Преждевременная оптимизация — корень всех зол.
Использование быстрой сортировки вместо пузырьковой для тебя тоже "преждевременная оптимизация"?
> больших проблем из-за реаллоков не возникнет
Я частично согласен с высказыванием про оптимизацию (бывает, что из-за запоздалой оптимизации нужно нихуево перепидорасить код), но в данном случае дело не в проблемах и не в тормозах, дело в том, чтобы научиться. В том числе и в динамические массивы без реаллока на каждую итерацию. А потом уже думать про профилировщик и особенности аллокации в glibc.
и нахуя использовать сортировки/массивы, когда есть деревья? что бы как прадеды хуячить по харду, перелопачивая память в угар, во славу перуна?
> и нахуя использовать сортировки/массивы
Слышал что-нибудь про кэши, локальность данных, вот это вот всё?
> то бы как прадеды
Прадеды могли хоть деревья, хоть хуевья использовать — у них не было кэшей.
>локальность данных
про м-вей деревья слышал что-нибудь, и вот это всё? или просто по приколу хуй сосать?
это способ использовать деревья поверх деревьев.
Слушай, я не топлю за подход анона >>871088 вызывать реаллок на ввод каждого нового элемента. Очевидно, что это ебануто. Но выделять "вдвое больше, чем раньше" для лабы1 это лишнее переусложнение. И в твоём подходе тоже можно доебаться до того, что у тебя происходит перерасход памяти без особой на то причины. Т.е. возможна ситуация, что пользователь ввёл N+1 элеметнов, а выделилась область для 2xN, большая часть которой пользователю была не нужна, допустим. При особо больших N это будет крайне ощутимо.
Что касается меня, я бы просто статический массив бы юзал. Нахуя вообще для такой задачи malloc/realloc.
Перевыделять в два раза — это стандартный подход. Никаких "преждевременных оптимизаций".
А вот делать множитель зависящим от количества уже выделенной памяти, чтобы не перерасходывать — это уже преждевременная оптимизация.
Я вообще предлагал использовать статический массив, какой в жопу множитель.
>Перевыделять в два раза — это стандартный подход.
Где это он стандартный? Можно какой-нибудь пруф?
Это оттого, что у вас много ума но мало совести
> пруф
Ну загугли сам-то. Можешь отсюда начать: https://habrahabr.ru/post/242279/ инбифо ализар
>Перевыделять в два раза — это стандартный подход
>Почему буфер должен расти экспоненциально
Экспоненциально - это не обязательно в 2 раза.
тебе же говорят: для экономии памяти. или мы про в 2 раза от чего, от минимально необходимого для работы за всё время? или всего используемого?
Норм.
Есть еще такое объяснение: всем похуй на своп, поэтому 2x выделять норм. Зато вариант с 2x предельно простой, работает всегда, для него не нужно всяких проверок, условий и прочей хуйни (как, например, для 1.5x: length += length >> 1; выглядит красиво, но только пока length по каким-то причинам не окажется равной 1).
Игру на SDL.
srand (time(NULL));
int rand_int(int min,int max){
double scaled=1.0/((double)RAND_MAX+1.0);
return (int)((max - min + 1)scaledrand()+min);
}
И рекомендую пару раз прогнать в холостую сначала
Всмысле чего меряю? Я сделал решето до мульта и просто беру из него простые числа, дабы не пытаться делить непростыми.
В смысле я про clock(). Результат будет зависеть не от быстродействия кода, а от того, как быстро ты вбиваешь числа во время scanf.
( не заметил новый тред, копирую из 13 )
конретно интересует факторизация целых чисел
длинную арифметику то я представляю - на другом языке напишу (написал)
но вот с собственными представлениями чисел на си я не сталкивался, собственно у меня числа длинной до сотни знаков
( на си потому что быстро )
да я понимаю как вопрос выглядит но
одно дело писать алгоритм на каком-нибудь условном питоне, я же ищу оптимальный способ представления чисел, чтобы не производить тонну велосипедного говнокода
но вот к примеру: с упаковокой стуктур я сталкивался -> понадобиться сделаю
но в другой язые этож не впихнешь
=> то есть спрашиваю за языковые тоности/особенности
Не занимайся преждевременной оптимизацией, анон. Напиши сначала как-нибудь и попрофилируй.
речь не об оптимизации
я умею в факторизацию в открыве от того что нужно запилить свое представление чисел
более того сишный код для
64 битных быстрых целых я написал
проблема в том что мне нужны числа куда больше
то есть я просто ищу способ (чтоб как полагается) представлять очень большие целые на си + мне пару операций на таком представлении (сложение, цел. деление)
тогда я перепишу алгоритмы на новое представление -> profit
очевидные способы типо представить это все символами или массивом 64 битных интов мне в голову приходят
но вот как правильно я хз
если ты анон знаешь рецепт поделись плиз
для кристальной чистоты числа в духе:
1851858457003052118736699169041398614849121954728255181191590943881041451112971339223193346124917
(87 символов например)
Анон, ты тупой?
Тебе уже сказали - гугли длинную арифметику (mpi)
Посмотри как она реализована в криптографических библиотеках (лайк openssl, nss, tomcrypt)
Там практически везде указатель на массив лимбов, где оптимальный размер лимба (32 или 64 обычно) высчитывается макроопределениями для каждой конкретной платформы на этапе компиляции
>компилировать
Ничего охуенного.
А засунуть в оперативку весь проэкт можно и юзать GCC, make, собирать будет наверно даже быстрее, если не статически линковать.
>на си потому что быстро
>математика
Не, для этого математический язык надо, он быстрее, Фортран быстрее, Ада может тоже.
>64 битов не хватает
Если чисел с минусом нет то делай uint_fast64_t
читай
man stdint.h
если надо минус то запакуй в структуру число и bool значение которое будет вместо минуса.
Нет
Ну я же тебе отвечал уже в предыдущем треде.
> представить ... массивом 64 битных интов
Ну вот и представляй. Что не так-то?
> но вот как правильно
Какие тут могут быть правила? Быстро это или медленно - подумай или потести.
Вот этого >>872162 не слушай, он бегает с доски на доску и несет всякий бред. Знак у него отдельно в bool, ну охуеть вообще.
>>872159
TCC даже не пытается ничего оптимизировать, поэтому GCC по скорости компиляции его никогда не догонит. TCC был бы охуенным компилятором для сборки тестовых билдов, если бы он полноценно умел в C11 и если бы при дебаге в очередной раз не оказывалось, что баг был в компиляторе.
>>872168
Постоянно. *p++ и a[j] тому примеры.
Как и чем этот говнокод можно покрыть тестами? Есть ли тут те, кто покрывают Си код тестами? Чем пользуетесь, как тестируете, что почитать, что изучить? Короче любой фидбек будет только на пользу.
А что именно тебе тестировать надо?
Бери и проверяй что сомнительно, gprof gdb для мониторинга, собери с самыми дотошными настройками компилятора с конкретным стандартом языка.
А говнокод можно почти весь стереть, ксорг устарел, перекатывай на Wayland.
А в GCC если оптимизации вырубить?
А Clang? у меня шланг медленнее гсс компилировал, а говорили мол некстген компилятор, а джисиси легаси параша.
>если бы мог в 11
А он не швабодный разве?
Можно из других компиляторов код реализации стандарта похитить.
аноны, я вообще не понимаю, как тут рассчитывать z, чему оно равно? Ответам всем трех уравнений?
Если честно, я ничего из написанного не понял, вот мой уровень в си на примере первой "программы", можешь подробней написать?
Ну да. Можешь это в строчку через ? : записать, но будет хуже читаться.
void TrackChildProcess(void hChild)
{
WaitForSingleObject((HANDLE)*hChild, INFINITE);
}
Функция потока принимает LPVOID. Мне нужно передать потоку хэндл другого потока, но если использовать указатель на void как аргумент, то его нельзя разыменовать по правилам языка.
Что не так? У меня небольшой вынос мозга от передачи параметров через LPVOID.
void TrackChildProcess(LPVOID hChild)
{
char szExePath[MAX_PATH];
WaitForSingleObject((HANDLE)hChild, INFINITE);
}
> если использовать указатель на void как аргумент, то его нельзя разыменовать по правилам языка.
Скастуй к указателю на HANDLE
ебанутый даун научись излагать мысли.
>>872159
ну ты и тормоз. сейчас ты мне расскажешь что ты не можешь быть тормозам, потому что ты человек?
>>872402
очередной вын апи дурачёк вкатился блин.
Стыдно спрашивать, но почему это возможно?
void * - 32- или 64-битное число
HANDLE - это тоже число
Получается, что я пишу как на ассемблере, забывая про типы и работая только с двордами?
>>872558
Точнее, не к указателю на HANDLE. Вопрос в том, как ты хочешь передать. Скастовав HANDLE к void* или передав указатель на переменную, хранящую HANDLE.
И первое, и второе легально обратимо.
Ок. Я думал это число.
Ну да, плохо уже помню про винду, извиняюсь. Но остальные типы хэндлов при -DSTRICT как раз "типизируются" неполными структурами в качестве дополнительной защиты от дурака.
Лучший ответ.
Подскажите как сложить два массива, пожалуйста.
Потому, что во всех остальных случаях это массивы указателей ну или так сложились звёзды, наверное
Жава-тред дальше по коридору.
своим хуем
Тред или два назад был кун с подобным заданием. Задание сложное, надо писать почти полноценный парсер или вводить какие-нибудь ограничения синтаксиса. https://arhivach.org/thread/206632/#846642
https://arhivach.org/thread/206632/#846663
Написать парсер для yacc. Так просто ты не сможешь по скобочкам вытащить название. Или попробовать какую-то часть от LLVM, где парсится файл.
Всегда упоминают ADA, но я ни разу не видел вживую никого, кто бы на ней писал на работе.
а схож с objective C? на mac osx10.10 в какой IDE кодить можно? сильно требуется математическое образование, алгоритмы, уровнения, вот это вот все? сисадмину (*NIX) сложно перекатиться?
А я однажды писал на работе на Ada (просто вспомогательное приложение, не было разницы на чем его писать), хотя я работаю не программистом. По-моему нормальный язык, очень даже. Примерно как C++ в своей изначально задуманной форме, но только сделанный нормально. Честно не понимаю, почему в зк практически никогда не обсуждается, годнота же.
>>873118
Не знаю насчет мака, IDE по-умолчанию — Gnat Programming Studio, неплохая. С сишки (и думаю с obj-c тоже) перекатиться легко, там нет функциональщины или каких-то особых выебонов, просто нормально сделанное структурное, generic и object oriented программирование.
http://pastie.org/10959217
Тебе надо воспользоваться этими требованиями:
http://www.hq.nasa.gov/office/codeq/doctree/871913.pdf
Странный ты. Нужна проверка - вот тебе проверка. Не нужна, или ты уверен, что и так все збс - за пару секунд отключаешь и продолжаешь радоваться жизни. В чем проблема-то?
Мне интересно. Вот эти все языки с проверками границ типа Ada или там Java. Ну, допустим, прилетело исключение о нарушении границ. Дальше что? Один хрен валить программу.
Главное чтобы ты учился хорошо и маму слушался.
Дальше heartbleed, когда проверок нету.
Я сам не особый сторонник исключений и вообще люблю сишку больше всех языков, но почему же сразу валить. Теоретически, баг может быть несмертельный и проявляться только в определенных ситуациях, например при получении запросов или входных данных определенного вида / в определенное время / etc. Можно конечно упасть и перезапуститься (и это если повезет, и баг приведет просто к сегфолту, а не к уязвимости), а можно залоггировать это дело, откатиться и попытаться продолжить работу, надеясь, что ситуация единичная, ну или перезапуститься тоже. Ну и еще раз: какбы фича отключаемая, если не видишь в ней смысла — можно и не использовать.
Всё можно написать (и на чём угодно), вопрос только во времени. Раскрой свою мысль, а то не совсем понятно, к чему ты это спросил.
На языке Тьюринга я ж не прошу написать, или перфокартами набить.
Есть framework(код, dll, binary) на c/c++ который заменит по функциональности weblogic + oracle rdbms + siebel crm( или что-то, хотябы одно)
На сишечке пишут, когда есть требования к быстродействию или иные ограничения. Написать CRM на сишечке можно, но экономически невыгодно.
В основном на сишечке либы и embedded.
> RTOS
И обычные. И у винды, и у линукса, и у OS X ядра на Си.
В вакансиях её маскируют и называют oracle pl/sql
А чем-тебя Оракл не устраивает? Он написан, вероятно, как раз на сишке/крестах по большей части, да и api имеет сишное. Заменить его на 100% тяжело будет, в конце концов его пилят уже сто лет, причем за сотни денег пилят. С остальными двумя приложениями не работал, ничего не могу сказать. В целом crm на сишке — более чем реально, все равно основное это база данных там, а остальное по большому счету без разницы на чем делать (я как-то делал не слишком сложный бэкэнд на сишке и каких-то особых препятствий не заметил).
прединкремент сперва увеличит на единичку, после чего использует слово в выражении, а постинкримент наоборот
разный приоритет, разная ориентация.
где ошибка?
ну, _getch же, нет?
аахаххахахахха
http://pastebin.com/uZAr1QQR - пофиксил
должна считать A[n][n]*b[n]
но как то странно работает
Зачем нужен C++, когда есть Haskell?
Вижу, кресты, да.
>Гайка жива
А чо воняет так по-трупному?
>>873624
>юзерспейс-то у них на крестах, а ядро?
http://cgit.haiku-os.org/haiku/tree/src/system/kernel
а теперь с указателем, с указателям я сказал.
Конпеляторы легко пишутся на функциональных языках, на си это боль и унижение.
Зацените кстати ответ майкрософта на раст — https://www.microsoft.com/en-us/research/project/checked-c/
Иии... Это си с проверкой границ! Авесоме! на деле просто скопировали реализованное в стандартной библиотеке плюсов в язык, зато пейпер больше стандарта си
Пусть хуесосы из леночкатреда расскажут ещё что рисёрчиские отделения компаний — не просто удобная основа для распилов.
парсер форта
Хуйня какая-то от индусов и китайцев. Знаем мы, кто у них там в исследовательском отделе сидит.
для этого целый гитхаб придумали, чтобы можно было легко и непринужденно копипастить код! получая зарплату и гранты
Стоит Win7 x64, программа 32-битная, поэтому выполняется отображение в ветку Wow6432Node. Ключ там есть. При выполнении программы выводится пустая строка. http://ideone.com/u2oBEY
>>874131
Вроде, заработало. Почему-то помогло добавление == ERROR_SUCCESS, пойду курить мануалы.
http://pastebin.com/B0JYpuKk
Потому что ERROR_SUCCESS = 0.
Считается ли такое уже абъюзом препроцессора, или еще норм и вполне можно использовать?
Слегка абьюз, потому что arr() выглядит как вызов функции, а на самом деле создает переменную. Даже если документируешь, будет неочевидно. Я бы сделал что-то типа struct xy *points = DEFINE_ARRAY(struct xy, ...); Несмотря на то, что тип приходится писать дважды, из такого кода очевиднее, что он делает. В len каст к указателю на void лишний. Макроса LENGTH в таком виде общепринято называется countof (по аналогии с sizeof). В остальном норм.
Нинужен. Можешь назвать платформу, где не поддерживается хотя бы синтаксис С99 (без библиотечной-то поддержки платформ дохуя).
>>874301
Алсо, желательно использование имени ARRAY в макросе len обернуть в скобочки, а то мало ли, все бывает, решишь выражение передать, и произойдет что-нибудь веселое.
>Нинужен. Можешь назвать платформу, где не поддерживается хотя бы синтаксис С99 (без библиотечной-то поддержки платформ дохуя).
какие мы дерзкие.
Каст через воид используется, чтобы заткнуть clang, который иначе почему-то жалуется на несовпадение требований к алайменту, хотя вроде бы очевидно, что там все нормально.
По поводу названия / синтаксиса макроса думаю, что ты прав, если сделать как ты написал, то это выглядит уже не так странно, но при этом все равно намного удобнее, чем объявлять эту структуру вручную.
>>874304
>Алсо, желательно использование имени ARRAY в макросе len обернуть в скобочки
Спасибо, учту.
Сделай переменную, присвой ей 1, пройдись циклом for по массиву, если очередной элемент больше нуля, умножь свою переменную на него.
твой кэп
Для меня это сложно, без кода непонятно
Спасибо, но я учусь в пту, для меня такие вещи как sizeof и size_t неизвестны
вот например, вообще не ебу, как тут с тобой кто-то ещё разговаривает, хуету какую-то пишешь непонятную. что у тебя там не на стеке?
Все, что в круглых скобках в макросе arr является static.
Чтобы было более понятно, оно раскрывается во что-то типа
int ⁎a = ((struct {size_t n; int u[3];} []){3, {1, 2, 3}}).u
Создается статическая структура, состоящая из двух полей: длины массива и самого массива int этой длины. Затем адрес этого массива в составе структуры копируется в указатель a, который может быть где угодно (в т.ч. на стеке), но сама структура с массивом, тем не менее, остается static.
Такую структуру можно создать и на стеке, но я никак не могу придумать, как сделать это максимально удобно (чтобы не нужно было два раза вручную вводить размер массива, а потом еще и инициализировать это же количество элементов). Также не хотелось бы создавать лишнюю локальную переменную для самой структуры, т.е. чтобы переменная была только у указателя на массив в составе структуры, но сама структура (безымянная) при этом тоже лежала на стеке (но вот это вот скорее всего совсем уже невозможно).
что? там и так будет всё на стеке, где оно по твоему ещё может быть? что ты несёшь? с чего ты взял, что не создаётся экземпляр структуры на стеке, а потом о не заполняется?
>>874458
Ты прав, я просто немного запутался. Похоже, что эта хуйня действительно на стеке. Статиком там является только временный массив, длина которого считается макросом LENGTH. Просто с таким способом автовычисления длины возникла проблема: макрос отказывается работать, если среди инициализаторов того, к чему применяется LENGTH, есть не константы (потому что этот массив считается статиком). Если передавать длину массива в макрос вручную, то такой проблемы нет. Ты открыл мне глаза, спасибо.
Алсо, ты вроде хорошо разбираешься во всем этом, может подскажешь какой-нибудь хитрый способ вычислить в макросе количество переданных в него элементов массива, чтобы все-таки не приходилось вручную длину передавать?
хуй его знает. я на макросах дохуя писал, можно организовать цикл и в нём перебрать все аргументы из __VA_ARG__, например держа счётчик как несколько 16ричных разрядов-аргументов. но это всё полный дроч, ненужно этим заниматься. а так-то можно хоть математику хуярить, правда у компиляторов есть ограничения в раскрытию... и это одна из причин почему это нахуй не нужно.
В коде происходит какая-то хуйня. Динамическая память с PE-имиджем освобождается и затем она используется. Сейчас бы найти журнал ксакеп за октябрь 2012, там на диске должен был быть PE-лоадер.
G_LIST_LEN посмотри в glib
Да и вообще погляди там макросы для коллекций. Там много чего интересного реализовано
Вот функция:
int main()
{
int a[N],i,count;
srand(time(NULL));
Init(a,N);
Print(a,N);
for(i=count=0;i<N;i++)
if(a>0&&Sum(a)>10)
count++;
printf("count=%d\n",count);
return 0;
}
Вот ошибка:
error: 'N' undeclared (first use in this function)
Что не так?
Научите массив задавать
Окей
http://pastebin.com/DRMG7R31
Алсо, для правильной работы ширусов в памяти надо патчить PEB. Будут ли проблемы из-за использования такого лоадера?
Двачую
Сейчас все-таки еще немного посидел с этим макросом, теперь работает и так:
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));
В макросе круглые скобки автоматически заменяются на кривые где нужно.
Но ты был прав насчет лютого дрочева, у меня сейчас такое чувство, будто бы я на брейнфаке написал что-то. Оказывается сишный препроцессор – вполне себе эзотерический язык.
В следующих строках ошибка:
//CopyMemory(&pStub[text->PointerToRawData + text->Misc.VirtualSize], pImage, dwImageSize);
memcpy(&pStub[text->PointerToRawData], pImage, dwImageSize);
>main.cpp(43): error C2036: 'LPVOID' : unknown size
Что я делаю не так? pStub указывает на PE-имидж загрузчика в памяти. Я хочу дописать в конец секции кода данные. Но с конструкцией &pStub[text->PointerToRawData + text->Misc.VirtualSize] что-то не так.
http://pastebin.com/jtdjX88M
Все права на спизженные идеи и куски макросов принадлежат их законным правообладателям.
Скажи, а pStub + 1 - это какой адрес, если учитывать, что pStub - указатель на void? Скасти к PBYTE или какому-нибудь другому указателю на char.
Понятно. Зря я, наверно, вообще начал использовать LPVOID. Хотя должно быть удобно ксорить сразу по 4 байта.
Я кончил. Алсо, вчера забыл тебе сказать, что ты зря с анонимными структурами возишься в len. Весь len можно сделать просто (((size_t *)(array))[-1]).
Я конечно не эксперт, но сделал так из предосторожности: ведь если мы присоединяем размер к массиву через структуру, то значит, что теоретически между переменной размера и массивом могут быть padding-байты, в зависимости от требований к алайменту элемента массива (например на моей системе у size_t алаймент 8, а у max_align_t – 16). Потому в текущей версии даже задействовал alignas из C11, чтобы между началом массива и его размером всегда было одинаковое количество байтов. Или это я зря заморачиваюсь?
Просто сишка на самом деле довольно задротский язык. Вот я все время думаю, что вот я ее освоил и уже знаю кучу тонкостей и нюсансов, а потом оказывается, что где-то снова проебал что-то неочевидное.
Везде только умножение.
В школе в столбик делил?
Если я сделаю такой макрос len, который (как я надеюсь) будет автоматически определять размер или по методу sizeof(a)/sizeof(a[0]) (в случае массива) или доставанием значения из size_t переменной в префиксе массива (в случае указателя), ждут ли меня какие-либо подводные камни? И если да, то какие?
#define len(ARRAY) (((void ⁎)&ARRAY == (void ⁎)&ARRAY[0]) ? LENGTH(ARRAY) : length(ARRAY))
типа: a(b(i), j);
Тебя пидорнёт, передавай в a() указатель на функцию b() внутри тела a() вызывай b().
Охуительные истории.
Так он сказал, что нужно конечными автоматами, помогите со структурной моделью, я в этом вообще не шарю, пожалуйста, пишите свои идеи. Алсо, суть - вытащить из текстового документа названия функций, просто названия, без типа и аргументов, как у меня.
Для main() есть специальное исключение: если поток выполнения доходит до закрывающей фигурной скобки, main() возвращает 0.
Начиная с C99 или C11
Какой пиздец.
Возможно, __declspec(noinline)? Возможно, стоит эту функцию поэкспортировать, чтобы на нее были ссылки?
volatile на указатель.
Ув. Анон! Вот есть fgetc(). Так ведь? Если у нас есть цикл, где этот фгетц читает по символму из файла, как он знает что нуно перескочить на следующий символ в файле, это внутри самой функции указатель некий? Или же это древние темные механики скрытые от простых смертных?
воспринимает файл как поток.
Зависит от реализации. Обычно за внутри структуры, на которую указывает FILE, хранится системозависимый дескриптор или хэндл для "родного" для системы API доступа к файлам.
Если это "обычный" файл, т.е. с произвольным доступом, с этим дескриптором в ядре ОС ассоциировано смещение в файле. По этому смещению и происходит чтение. И функции чтения автоматически увеличивают смещение на прочитанное число байт.
Плюс ещё, на стороне программы, может быть буффер. Он тоже связан с FILE. Ну и читается какой-то заметный кусок из файла в буффер. И, соответственно, есть указатель на текущий символ в буффере, который fgetc() увеличивает.
Я тут упрощённо описал как это примерно выглядит на чём-нибудь вроде windows или *nix.
памагити
>
спасибо огромное анон, еще вопрос:
стоит после поверхностного изучения данного языка зубрить его то состояния белиссимо, или же параллельно знакомиться с чем-то новым?
Дай бог здоровья, буду учиться :з
>начал изучать Си
с какой целью?
есть ресурсы чтобы прожить следующие десять лет до того как сможешь заработать кодом на си?
с целью начать изучать хоть что-то, ибо сестра к себе хочет взять на стажировку в iba
спросил у анонов тут пару дней назад, что лучше изучать - сказали Си, я потихоньку пытаюсь
самое забавное, что эти хуесосы и в продакшон такой код высирают (если это не исходники уровня chrome где уже кодерам нада от 150к в год платить, а в закрытых кодовых базах помельче именно такой пиздец за частую и есть)
чтобы написать крепкую рабочую прогу знание языка это только 10%
а вы уебки и его не знаете
пфф
в печь всех, как евреев в 42
>а вы уебки и его не знаете
Сколько (минимально) чтений по указателям 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;
}
Больше скажу. всем кто знает язык даже и твой код не нужен, они и так знают о чем ты.
>>876045
Короче, рядом с a и b звезочки стоят везде, кроме dosmth(a).
Алсо, если кому-то не лень, ответьте, потому что я и сам хочу проверить, правильно ли я думаю.
Взял расстроил.
Как насчитал? Алсо, вместо x = 10 должно было быть умножение. Но без него получилось бы 1 и 2 по-моему.
http://pastebin.com/XG4jtv4r
ну как-бы после вызова функции сложно знать, изменилось ли значение по указателю b, тоже.
Это да. Я правда сперва сам не совсем правильно посчитал, а так там 2+2, все правильно.
Алсо, я когда-то не знал про это все, и тогда мне казалось, что не нужно кешировать значения по указателям в локальных переменных (тип лишние переменные будут занимать место, лол), а потом я почитал про restrict, а потом выяснилось, что если вызывать внутри функции другие функции, то и restrict'а будет мало… Но отчего-то мне кажется, что я еще дохуя всего не знаю.
больше не буду
тонко стелишь, так сказать, без скобочек у &.
Правильный ответ "сколько угодно", вплоть до выбрасывания всей функции нахуй. Подобные разговоры мало того, что в принципе бессмысленны, так еще и могут идти только о полной, нормально компилирующейся программе.
ну как тут без твоих выебонов. поняли все? вы дурачки, не берите в голову, открывайте и берите в рот, как господин у которого компилятор раскрывает функции.
Например, с того, что она не вызывается. Или у нее явно нет сайд-эффектов (и у dosmth тоже), а возвращаемое значение не используется. Или она вызывается один раз, и аргументы известны, поэтому компилятор может решить весь вызов свернуть в одну константу.
Но откуда компилятору знать, к чему ты собрался прилинковать результирующий файл, и, соответственно, будет ли кто-то вызывать эту функцию?
Так логичнее.
Сначала Си был, потом его допилили до С++. Более логичная последовательность.
Да и просто Си проще и примитивнее, а в С++ больше сложных вещей и абстракций.
а я и не спорил. ты какой-то странный.
Си конечно.
Печально что б-во вкатыльщиков не знает что С++ никогда не был популярней и востребованней Си и не будет.
Просто вакансии на помойках всяких в основном ориентированы на всякий скам.
Какой тип данных имеет результат логических выражений в С?
int (0 или 1).
Изучил основы Си, изучаю алгоритмы, решаю олимпиадные задачки. Куда копать дальше, какие перспективы?
На гитхаб, решать реальные задачи. Олимпиадники не нужны.
дальше только отсос для натуралов.
В общем, критическая часть программы выглядит примерно так:
void CriticalFunc(void)
{}
void EndFunc(){}
В рантайме происходит расшифрование от начала функции до метки EndFunc().
Но как ее сначала зашифровать? Инбифо: ксором в HIEW
Если собирать с оптимизацией по размеру, компилятор может выкинуть метку EndFunc. Проблема решается объявлением указателя на нее volatile? Может ли линкер разместить EndFunc не после критической функции?
Самый простой способ - написать кастомный кодогенератор для tcc. Можно экспериментировать с LLVM. Можно просто сваять простейший парсер PE/ELF и криптовать секцию кода целиком. Алсо, можно сделать свой линкер - минимальный линкер под сишечку написать несложно, если есть опыт байтоебли.
> Если собирать с оптимизацией
Если творить такую хуйню, фиксированные параметры компиляции и минимальная оптимизация - это мастхэв.
> Может ли линкер разместить
Классический линкер не может менять порядок функций в объектнике, и выкинуть функции он тоже не может, но есть всякие фичи типа "separate functions for linker" (в терминах MS) и прочие LTO >>876268, поэтому опять же нужно подобрать такие параметры сборки, когда линкер не будет мешать твоим планам.
Даже сишного fopen() вполне хватит для начала.
пишу калькулятор матричных операций
анон, подскажи пожалуйста как читать с stdin пока не закончаться знаки операций
то есть
matrix
+
matrix
*
matrix
я понимаю что вроде пока op не EOF
но что-то никак
Читай fgets() в буфер, если во время чтения строки юзер тыкнет Ctrl+Z (Ctrl+D в Linux), fgets() вернет NULL, и ты закончишь. Дополнительно ты можешь проверять первый символ буфера. Если он \0 или \n - юзер ввел пустую строку, можешь по этому признаку тоже завершать ввод. А дальше ты можешь либо разбирать буфер вручную через strtok(), strtoSMTH() или делать sscanf().
>>877575
Разобрался, надо было включить автоскролл.
Как можно изменить цвет рамки эдита при получении фокуса?
Почему ты пригорел?
Как ты умудрился его уронить? Он и несколько лет назад был вполне стабилен. Ну кроме дебаггера. Антивирусы/малварь в системе есть?
Онан, поясни за GUI на pure-C. Какие фреймворки используешь? Сколько весит hello-world на таких? Можно ли static-версию делать?
(цель Windows 2000-10, Ubuntu 14-...)
Пишу для микроконтроллеров, но иногда надо делать управляющие программы. Пока что делал на delphi 7, лол. Пробовал на Qt, но по 70 мегабайт библиотек таскать, это пиздец.
> Какие фреймворки используешь?
А выбор и небольшой, лол. Либо используешь кресты + wxWidgets либо прикручиваешь Gtk3 и не выёбуешься.
Когда компилирую в Pelles C и запускаю, появляется два процесса, которые спавнят друг друга. Но если компилирую в MSVS 2015, второй процесс не запускается, и приложение закрывается после нажатия на крестик. Почему?
Качай ребол/пюревасик или даже блитзмакс и делай на них. Кроссплатфоренно, просто, а в последнем с/крестокод можно прямо к нему линковать не переписывая.
Разные методы запуска. Студия через жопу запускает - отобрази командную строку студии, и увидишь.
Запущенный не в среде студии экзешник (из папки) тоже не работает как надо.
Ух спасибо, почти весь день убил на поиск проблемы. Надо мне читать Рихтера про юникод и переходить на него.
большое спасибо
Добавлю, что необходимость в таких функциях чаще всего следствие того, что ты делаешь что-то не так либо что-то близкое к системному софту.
https://www.experts-exchange.com/articles/1783/Win32-Semi-Transparent-Window.html
Я понимаю, как задать сам цикл, но не понимаю как заставить считать значение n-ого слагаемого
Вроде про цикл в задании ничего. Рекурсивно оно проще для понимания. Погугли "recursive cosine taylor series in c". Ну или можешь циклом считать, да. Минусы и плюсы - это 1 в степени n, степени в числителе - 2n, числа в знаменателе - факториал 2n. Значения, требуемые для вычисления числителя и знаменателя можно запоминать с предыдущего шага.
> не понимаю как заставить считать значение n-ого слагаемого
В смысле, не умеешь возводить число в степень с помощью pow() и делить его потом?
Как посчитать то я знаю, я от том, что мы вводим любое n и программа должна посчитать этот n-ый элемент выражения, как это записывать?
Ну тебе все равно всю сумму считать. У тебя будет цикл от 1 (или 0) по n, в цикле ты вычисляешь очередное слагаемое, заканчиваешь n-ным. В чем проблема вывести его после выхода из цикла?
Точно, спасибо анон, погуглил про рекурсию вроде наглядно понял
Никаких. Читай, делай упражнения, приходи с вопросами, если возникнут. Успехов.
Пиши малварь. Поделай что-нибудь в реестр, напиши примитивный троян, который копируется в пользовательские папки, сканирует снапшот процессов и закрывает диспетчер задач. Посмотри, как мейлру параша прописывается в системе и самовосстанавливается. Сделай так же. Подъеби кого-нибудь этим трояном, главное, не попади в чью-нибудь статью о том, как лох пытался впарить троян, но соснул.
Во-первых, до малвари нужно язык выучить, чтобы не быть, как тот анон из ньюфаг-треда, который функцию переменной присваивает, да и не только язык - по-хорошему, желательно прочитать хотя бы Рихтера, а потом заполировать Inside Windows. Во-вторых, я очень надеюсь, что тебя поймают и пояснят по хардкору, почему распространять малварь плохо.
http://ideone.com/wm2fM6
в поставке clang++ из коробки я так понял нет стандартных библиотек, а в GCC:g++ есть.
можно их как-нить с консолидировать чтоб и clang все появилось
В папке со шлангом создай i686-w64-mingw32, туда скопируй include, lib, libexec из гцц. А еще лучше создай симлинки.
Я не знаю, почему у тебя таргет по умолчанию msvc. Возможно, стоит убрать переменные окружения INCLUDE и LIB. А насчет хедеров - я сейчас поэкспериментировал, та папка не нужна, оно (по крайней мере у меня) находит директорию с MinGW, если она есть в PATH и автоматически использует инклуды оттуда. Но у меня в винде только clang 3.7 и gcc 4.8. Может, с тех пор что-то сломали. Возможно -target mingw32 решит проблему.
clang -v -target i686-w64-mingw32 foo.c
Ну пользуйся гцц, пока кто-нибудь умный не придет и не подскажет скорее всего, вместо решения проблемы предложат поставить линупс.
> доброе утро.
> 00:45:55
> NTFS есть симлинки и хардлинки
То-то я смотрю, в Cygwin до сих пор пользуются магическими файлами, а в Msys ln -s равнозначно cp. Наверное, они не знают об этих фичах файловой системы.
> скорее всего, вместо решения проблемы предложат поставить линупс.
Ну, это как спрашивать у мылачей, почему последняя студия под вайном не работает и как это исправить.
> в Cygwin до сих пор пользуются магическими файлами, а в Msys ln -s равнозначно cp
Компатибилити же. Настоящие симлинки (которые поддерживаются для файлов тоже) появились в Висте. Junction points не помню, но вроде в XP. И это не работает на FAT32. И там есть тонкости. Вот и не делают.
https://en.wikipedia.org/wiki/NTFS_symbolic_link
https://en.wikipedia.org/wiki/NTFS_junction_point
>>878627
Ты уж определись, либо компилятор кроссплатформенный, либо только под линупсы. В студии кроссплатформенность никто не обещал. Шланг и гцц нормально работают в винде, но могут возникать мелкие проблемы, в основном из-за LFSтрадиции хардкодить пути.
Да, все правильно. Больше идей нет. Сделай батник clang-mingw с содержимым типа @clang -target x86_64-w64-mingw32 %*
То-то и оно, что тонкостей больше, чем приемлимо для ежедневного использования. Невозможность создавать эти самые симлинки от обычного юзера в дефолтных настройках безопасности, как пример.
А потом говорят, что в линуксе пердолинг.
Я junctions и хардлинки очень давно использую. Нестандартные права для них не нужны, проблем особых с середины 2000х не припомню кроме мелочей типа антивируса, впадавшего в бесконечный цикл при сканировании или инсталляторов, которые до сих пор! проверяют свободное место на томе, где расположена junction point, а не там, куда она указывает.
return (pointer);
К чему тут скобки?
Не влияют ни на что. Кому-то нравится визуально, и они втыкают скобки всегда. Некоторые ставят, когда возвращается выражение.
ебашу интерпретатор джавы на сишке, при алокации структур заношу указатели в буффер, чтобы при любой ошибке сразу вычистить всю память и не было leakов. Проблема лишь в том, что по ходу работы интерпретатора я все равно освобождаю память и в результате при очистке памяти у меня может программа попытаться вычистить уже пустой указатель, поэтому надо как то проверять их. Не покидает ощущение того, что организовываю все это ебано, возможно есть лучший варик как это сделать
Рихтер пишет, что компилятор по умолчанию рассмаривает строки как ANSI, поэтому код компилируется нормально. Но если определить _UNICODE, то возникнет ошибка. Однако ошибка не возникает ни при определении этого макроса с подчеркиванием, ни без подчеркивания. Почему так?
Компилирую из командно строки (пикрелейтед).
Хендлы.
> Не покидает ощущение того, что организовываю все это ебано, возможно есть лучший варик как это сделать
Да. GC.
Допустим stack[n] или вообще (int )malloc(ij*sizeof(int))
Не могу придумать, как в стэк пихать 2D массивы?
Гугл молчит, либо я слепошарый.
ascii
Ты представляешь, как препроцессор работает? Ты определяешь UNICODE после включения windows.h, и в результате в windows.h (точнее, в одном из включенных из него хедеров) TCHAR дефайнится как CHAR. Очевидно, чтобы возникла ошибка, надо сделать -DUNICODE в командной строке или дефайн до инклуда.
>>878910
> UTF-8 в Windows
И кодировать туда-сюда на каждый вызов API. Охуенный совет. Не говоря уже о проблемах самой UTF-8, удобной лишь для передачи текста, а не для обработки.
>>878907
Указатели пихай или поясни, зачем ты собрался пихать в стек массивы по значению.
>И кодировать туда-сюда на каждый вызов API.
Всю жизнь собрался сидеть в WinAPI и дальше локалхоста не вылазеть?
> Не говоря уже о проблемах самой UTF-8, удобной лишь для передачи текста, а не для обработки.
Ахахаххаахахахахаха! Вангую бред про "доступ к символу по индексу".
utf8 прекрасна для всего!
sizeof(wchar_t) в NDK, очевидно же. Да, доступ по индексу. Да, необходимость бранчей или таблиц для вычисления длины строки. А еще инвалидный UTF-8, приводящий к уязвимостям. А еще невозможность порезать строку нормально.
>sizeof(wchar_t) в NDK
Пхе-хе-хе, при чём тут android, это libc, старающаяся быть совместимой с glic.
> Да, доступ по индексу.
ffl — вот 3 буквы. Получи по индексу доступ ко второй.
> Да, необходимость бранчей или таблиц для вычисления длины строки.
define "длина строки". Для меня и strlen "длина строки".
> А еще инвалидный UTF-8, приводящий к уязвимостям.
Проблема уязвимых библиотек.
> А еще невозможность порезать строку нормально.
Раскрой мысль.
> вот 3 буквы
Я про буквы не говорил. Про то, как юникод устроен, я знаю, и про combining characters тоже, и про лигатуры. Но я вполне могу юникод нормализовать, хранить его нормализованным в UTF-32 и потом что-то в таком виде с символами сделать (например, проверить класс по табличке). И делать это проще, когда у тебя codepoint - одна сущность, а не когда тебе ее нужно сначала из байтиков собрать, да еще не забыть на валидность проверить.
> Для меня и strlen "длина строки".
> Проблема уязвимых библиотек.
Нет, вопрос сложнее. Например, я закодировал \0 в виде двух байтов. У либц (strlen, в частности), твоего кода и библиотечного кода могут быть совершенно разные взгляды на этот символ (и это правильно, потому что подход зависит от цели обработки, а та же либц про твои цели нихуя не знает). Кто-то это выбросит, кто-то заменит, кто-то ошибку вернет, а кто-то пропустит.
> А еще невозможность порезать строку нормально.
snprintf() и случай, когда строка не влезла в буфер. Возникают веселые спецэффекты.
> проверить класс по табличке). И делать это проще, когда у тебя codepoint - одна сущность, а не когда тебе ее нужно сначала из байтиков собрать, да еще не забыть на валидность проверить.
Нет, ну если у тебя единственная задача — проверять класс codepoint-а по табличке, то для тебя UTF-32 — лучший выбор.
> я закодировал \0 в виде двух байтов.
Искусственный пример. Если ввод должен прилетать откуда-то извне, он должен проверяться на валидность. К кодировке это отношения не имеет.
> snprintf() и случай, когда строка не влезла в буфер. Возникают веселые спецэффекты.
Чем же нам тут UTF-32 поможет?
> Чем же нам тут UTF-32 поможет?
> К кодировке это отношения не имеет.
Тем, что строка останется валидной. А вот если ты порежешь UTF-8 посередине codepoint, у тебя из проверенного, валидного юникода возникнет невалидный, но ПРОВЕРЕННЫЙ, со всеми вытекающими.
>>879156
> fopen()
Это вопрос про недостатки сишной либы, и к тому, какие имена файлов и в какой кодировке принимает ОС. Она может принимать исключительно 7-битный ASCII, если это ембеддед, может принимать исключительно CP866, а может вообще указатель на 16-байтовый бинарный GUID последнее - трустори, если что.
>Тем, что строка останется валидной.
Ой-ой-ой. Манявалидной, ты хотел сказать.
Никому нафиг не нужна валидная последовательность байт, люди на буквы смотрят =)
Думаешь, обрезание только по четырёхбайтовым границам спасёт тебя от кривых строк? Ха-ха-ха. До первого клиента, которому ты отрежешь accent-ы от буквы. Желаю успехов в объяснении ему что это валидно.
Кстати, сколько букв в следующей строке "ch"?
>Это вопрос про недостатки сишной либы
Это про преимущество. Хоть куда-то этот блядский wchar_t не пролез. Его вообще не должно существовать!
> какие имена файлов и в какой кодировке принимает ОС
Ну, кхе-кхе, кхе-кхе, тут может быть проблема. Но если ты принимаешь имена через аргументы командной строки, то должно, в идеале, работать везде.
> люди на буквы смотрят
Так проблема-то в том, что компьютеры смотрят на байты. Например, если это логин или имя файла.
> отрежешь accent-ы от буквы
Что лучше: оставить висеть акценты, пролететь мимо \0 в буфере или много позже вернуть из какой-то функции ошибку, когда ее никто не ожидает?
> Кстати, сколько букв в следующей строке "ch"?
Букв две.
В общем, я тебя понял, ты меня понял, друг друга мы не переубедим. У тебя идеальный мир, ограничивающийся линупсами и, подозреваю, прочитанный когда-то манифест про утф8 эвривер, а у нас на работе только пару лет назад ANSI-шные билды дропнули. Алсо, в последнем проекте у меня у самого UTF-8 основной кодировкой, кроме встроенного редактора и абстракций над файловой системой. Время покажет, что из этого выйдет.
> Что лучше: оставить висеть акценты, пролететь мимо \0 в буфере или много позже вернуть из какой-то функции ошибку, когда ее никто не ожидает?
Ничего не лучше. И UTF32 никак не поможет.
>Букв две.
Не всегда =)
Реальные задачи попробуй решать.
>зачем
Мне на вход подается ебаная куча матриц, и операторов между ними. Я должен всё это подсчитать, естественно умножение приоритетная операция. Ну я и подумал собирать матрицы и операторы в стек и постфиксной ротацией всё это вычислять.
Ну и сделай структурки (либо, если у тебя скаляры тоже есть - union сверху еще), и стек этих структурок.
typedef LONG (WINAPI * NtUnmapViewOfSection)(HANDLE ProcessHandle, PVOID BaseAddress);
Ниже по коду такая строчка:
NtUnmapViewOfSection xNtUnmapViewOfSection;
А если неизвестно какую?
для шимминга, для реализации ООП (методы структуры), для реализации функторов, или для передачи функции в функцию
Эта функция была недокументированной на момент написания кода, и чтобы не кусать локти, если Microsoft вдруг ее уберет не уберет, к ней не стали линковаться статически.
ОС какая? И подробнее расскажи, чего тебе надо. Может, ты трояна пишешь, хз.
Из-за того, что мои нопы не выровнены, поиск этой метки при помощи указателя на дворд пропускает их.
Не понял. Покажи на примере. Такой код работает не так, как задумано.
http://ideone.com/PGOhV4
https://www.linux.org.ru/forum/development/13019524
>2016
>быдло бугуртит от WinAPI
О времена! А раньше каждый школьник с компьютером был исследователем реестра винды.
Хуй знает, что у тебя там задумано, но у меня все выравнивается, мессаджбокс выдает адреса, по которым начинаются твои нопы. Зачем ты ксоришь код и потом вызываешь полученный мусор?
Делаю протектор. В шеллкоде код между этими метками будет заксорен. Потом он расшифровывается, выполняется и снова зашифровывается.
struct one {
char a;
char b;
};
struct two {
struct one c;
struct one d;
};
void firstfunction(void source, void dest, int size)
{
memcpy(dest,source,size)
}
void secondfunction(struct two onedata)
{
struct two twodata;
firstfunction((void )onedata->c,(void )&twodata.c,2);
}
void main()
{
struct two onedata;
secondfunction(&onedata);
}
gcc -g -O2 struct.c -o struct
struct.c: In function ‘secondfunction’:
struct.c:19:2: error: cannot convert to a pointer type
firstfunction((void )onedata->c,(void )&twodata.c,2);
^~~~~~~~~~~~~
<builtin>: recipe for target 'struct' failed
make: [struct] Error 1
struct one {
char a;
char b;
};
struct two {
struct one c;
struct one d;
};
void firstfunction(void source, void dest, int size)
{
memcpy(dest,source,size)
}
void secondfunction(struct two onedata)
{
struct two twodata;
firstfunction((void )onedata->c,(void )&twodata.c,2);
}
void main()
{
struct two onedata;
secondfunction(&onedata);
}
gcc -g -O2 struct.c -o struct
struct.c: In function ‘secondfunction’:
struct.c:19:2: error: cannot convert to a pointer type
firstfunction((void )onedata->c,(void )&twodata.c,2);
^~~~~~~~~~~~~
<builtin>: recipe for target 'struct' failed
make: [struct] Error 1
нихуя не верно. надо так
firstfunction(&onedata->c, &twodata.c,2);
и без приведений в данном случае если функция сразу укзатели на войды принимает
while(getchar() != EOF)
Как передать ЕОF , если я предаю значение из командной строки в винде? В одном месте советуют ctrl+z, но нифига. Не работает.
CodeBlocks, Win7, TCC
ctrl+z работает если ничего не было введено после нажатия на enter
Перепощу из треда ньфагов, тут вроде уместней?
Подскажите, почему запоминается последняя цифра, если цикл до 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 знаков.
Перепощу из треда ньфагов, тут вроде уместней?
Подскажите, почему запоминается последняя цифра, если цикл до 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 знаков.
Потому что индексы массивов считают от нуля.
void set_voobshe_lyuboy_callback(void *pointer_na_voobshe_chto_ugodno);
> pointer_na_voobshe_chto_ugodno
> voobshe_chto_ugodno
Алсо, объясни, что ты будешь с этим колбэком делать, тогда тебе, может быть, и посоветуют.
Пока у меня только теория. По идеи просто выполнять функцию при определённых условиях. Что с ним ещё можно сделать?
Попробовал на практике, когда я вызываю указатель на вообще что угодно мне говорят что "pointer_na_voobshe_chto_ugodno is not a function or function pointer".
> 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");
}
}
Как-то так.
FREE 5 FREE 5 ХОРОНИ ПАМЯТЬ, ХОРОНИ ГОВОРЮ
Предложи свой вариант.
Бляяяя, пиздец.
Я либу пишу, в либе есть функция, которая должна принимать функцию из внешней программы, которая пользуется этой либой. Так вот, мне нужно юзерфрендли! Чтобы просто всё было. А тут... Бляяя, пиздец. Бляяя, пиздец!
> принимать функцию из внешней программы
Нельзя вызвать функцию, не зная ее тип.
> мне надо чтобы функция могла принимать ваще любую функцию
Поясни, зачем. Скорее всего, ты хочешь void (∗ callback)(void ∗user_data) - это нормальная практика, максимум юзер-френдли. Ну или в крайнем случае проебать типы и void (∗ callback)(int paramspec, ...), но для этого варианта нужны серьезные основания.
Да, уже дошло, сделал так void (*callback)(void).
Анон, ещё один небольшой вопрос. Вот передал я функцию callback в функцию, а как мне в этой функции записать принятый callback в указатель?
Один вопрос по си
Окей, например
...
char A[5];
char B[] = "hello3"
Из строки B переписать в А только цифры.
Да, вопрос глупый, но я хз
В интернете ничего не нашел
Помогите пожалуйстаа
Ну объявляешь указатели на оба массива. В цикле читаешь символы по указателю на B, если прочитал '\0' - выходишь из цикла, если прочитал что-то, для чего isdigit() вернул ненулевое значение - пишешь символ по указателю на буфер A. После выхода из цикла пишешь '\0' по указателю на буфер A. Про инкременты указателей не забудь. Алсо, можешь сделать то же с индексами, а не с указателями.
Ты не можешь присвоить массив, прочитай в правой части от = нужный тебе символ.
Только не А катое
Так правильнее?
Ахахахах, пиздец
Да мне кажется мой препод тут ничего кроме while не поймет
Бтв, все равно ругается
Да, спасибо
Доделал, все работает правда пришлось новые слова учить, но это даже хорошо
Спасибо большое, анон
Вы видите копию треда, сохраненную 13 декабря 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.