Это копия, сохраненная 23 ноября 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/
Шапка: http://piratepad.net/bJ1SdmkZyu
>транслятор для C-подобных языков, созданный специально для работы на базе LLVM
Получается, как java или c# работает? В чем плюсы и минусы по сравнению с любым другим конпелятором?
> как java или c# работает
Не совсем. Java и C# компилируются в набор инструкций виртуальной машины, а затем, при выполнении программы, В используется JIT (just-in-time compiler), чтобы преобразовать этот код в нативные инструкции. И хотя LLVM тоже можно использовать в качестве JIT, у clang по умолчанию на выходе нативный код.
Плюсы/минусы - ну, например, нормальная архитектура, один жирный бинарник, который умеет кросскомпилировать, а лицензия позволяет не давиться мозолями. И либы. А ещё -Weverything. Оптимизация иногда лучше GCC, иногда хуже. Часто ворнинги более понятные.
http://ideone.com/zXxyH5
> Очевидно, что проблема в освобождении динамической памяти
Очевидно, что если a - указатель на int, то со звездочкой ты кормишь в free() просто int, а free() хочет указатель на int. Убери звездочку.
>Получается, как java или c# работает?
Как любой компилятор. Просто используется отдельное и документированное промежуточное представление.
> Java и C# компилируются в набор инструкций виртуальной машины
Нередко и прямо в машкод компилят.
gcj для Java и Xamarin под iOS
>Нередко
Сильно сказал. Очень. это самая маргинальная хуйня что только можно найти.
>>856817
>затем, при выполнении программы
Тут вообще нужна ремарок чтобы не путать нюфагов: ява занимается этим при каждом запуске, дотянет — только при первом и переводит дело в машинный код, а не интерпретирует как жява.
>>392651
while (scanf != EOF) туда вбиваются цифры, дальше в этом лупе я проверяю кажде число на четность/нечетность, положительное\отрицательное и т.д-
Далее всё это дело я естественно printf.
Но, нужно ещё вывести все цифры, которые я там вводил, через запятую. Окей, не проблема. Но как убрать запятую у последней цифры?
Ах да, массивы не использую.
Чтобы этого не было, ты заводишь переменную, которую меняешь после первого числа, и проверяешь ее значение при выводе.
Что-то я туплю совсем.
Код:
http://pastebin.ru/C9zXlvg7
Может я вообще плохо написал и то, что мне нужно, вообще никак не выйдет?
Ты забываешь, что символы в консольке у тебя не квадратные, а вытянутые.
Как сделать защиту ввода в си, чтобы при введении любой хуйни, кроме цифр, минуса и точки програ не заедала?
Я пытался найти в интернете, но там только по с++ есть.
из большого набора данных строится связанный список. при изменении данных список перестраивается, что очень плохо. есть идея запилить кэш, при изменении данных проверять на наличие в кэше, если попадает, перестраивать список, иначе ничего не делать. кэш реализовать как хэш) но как то это все громоздко. есть идеи/примеры получше?
Если в двух словах, то чтобы выводить числа, их надо сначала где-то хранить - в массиве или динамически выделенной памяти. Однако в твоем конкретном случае можно воспользоваться грязным костылем тем фактом, что у stdin есть свой буфер, в котором хранится строка, пока ты ее печатаешь, и в scanf она попадает только после того, как ты нажимаешь энтер (или ввел оче много символов), так что вывод ты можешь написать прямо в цикле scanf'а.
Вот спасибо. Я то как раз и пытался понять, как и куда вообще эти числа без массива сохраняются.
Например задача:
разноцветные склянки в a[10] хранится цвет.
А в b[10] их вес.
Как мне их так отсортировать, по весу, чтобы цвета тоже поменялись?
У нас тут как бы сишечка, а не кресты. В сишечке ты можешь объединить вес и цвет каждой склянки в единую структуру, хранить массив таких структур, и уже его сортировать (например, с помощью qsort()). Если тебе религияпрепод запрещает складывать свойства одного объекта в единую структуру, ты можешь объявить третий массив, int sorted[10], заполнить его индексами объектов (от 0 до 10), и заставить qsort отсортировать его, чтобы упорядочить индексы в sorted по возрастанию веса соответствующих им склянок. Так как оригинальные массивы останутся неотсортированными, ты сможешь иметь несколько таких "вьюшек", отсортированных по разным параметрам, не дублируя при этом сами данные. http://ideone.com/Uu7Ia3
>У нас тут как бы сишечка, а не кресты.
Привыкай, пока плюсовой тред не перекаты все нюфаги будут спать здеся.
Один по горизонтали стоит двух по вертикали. Это для дефолтного шрифта.
'e' и 'm' у меня известно, e^-1 равносильно 1 / e, но что делать дальше?
СМЕХ
* найти такое d
Ответ всегда будет 0, ведь 1/e будет 0. ......
Значит неправильно :(
>>857828
ага, понял. Но ведь 1 mod m всегда будет равно 1, я правильно понимаю? m всегда будет целым числом. Как и с e / 1, я просто беру об. калькулятор и считаю там.
буду умножать на его любое число и добавлять единицу. Из результата буду смотреть 2 множителя, которые и будут ключами.
8 1 + 1 = 9 >>> 3 3 // не подходит (одинаковые)
8 2 + 1 = 17 >>> // правильное число
8 3 + 1 = 25 >>> 5 5 // не недходит
8 4 + 1 = 33 >>> 3 * 11 // подходит. e = 3, d = 11.
Правильно ли я поступаю?
Спасибо анону >>857828 за наводку
>Правильно ли я поступаю?
https://en.wikipedia.org/wiki/Modular_multiplicative_inverse
Есть стандартный алгоритм для этого
Ну вот чего ему не хватает? Функция под 380 ординалом есть и в 32, и в 64 битной версии.
Может быть, ты расскажешь немного больше, чтобы мы тут не занимались гаданиями по скриншотам?
Нет. Вы тупые, если не понимаете, что там. Пойду отсюда лучше.
Дело не в отлаживаемой проге. Скрин от 64 битного калькулятора из стандартной поставки. Библиотеку Ida(или bochs) загружает нормально, а функцию не находит. В первом случае нормальная инструкция jmp addr вдруг превращается в stosb. 32 битные приложения так же нормально не отладить. Не так всё просто с bochs, как мне казалось. Сейчас посмотрел на выполнение функции GetStartupInfoA.
mov eax, offset kernel32_GetStartupInfoA
call bochsys_BxUndefinedApiCall
Это нужно каждую функцию в настройках описывать, как выполнять?
Bochs предназначен не для отладки обычных программ, а для эмуляции относительно небольших кусков кода. Например, декрипторов у малвари - встал на декриптор, получил расшифрованный код / ключ / расшифрованный урл, откуда оно качает payload, анализируешь. И да, конечно же, для этого тебе придется описывать вызываемые API.
Если ты не знаешь, почему тебе нужен именно Bochs - например, тебе хочется отладить калькулятор, отлаживай обычным отладчиком (Local Windows Debugger). Алсо, чаще всего, если ты опасаешься плохого поведения программы, проще (возможно, удаленно) отладить ее внутри VM, чем ебаться с Bochs.
Хотел раздебажить программу, защищённую протектором. Протектор завершает программу, если обнаруживает hardware breakpoint, точки останова на системных функциях и прочие вещи. Не знаю, как он это делает, нет опыта работы с протекторами. Думал, что bochs может подойти для этого. Теперь понятно, что у него более узкие цели использования.
Но я хочу писать на сишечке всегда, так как писать на ней очень приятно. А ещё я хочу писать хорошо, освобождать память когда надо, выделять память когда надо, что читнуть?
жабку читни
int main (argc, argv )
int argc; char argv;
{
return EXIT_SUCCESS;
}
char argv;
А что не так?
char argv[][];
Потому что твой компилятор поддерживает древний синтаксис. Так писали до принятия стандарта ANSI C'89.
Вся ирония в том, что я две недели назад только туда устроился. Когда устраивался, собеседовался в отделе N, там инет был, я видел. А устроили меня в итоге в отдел M, и вот тут началось самое веселое.
Ох этот пда.
Си пляс пляс читни.
У тебя нет инета на работе? А что если нужно что-то загуглить по работе? Сосать хуй?
Поставь дома, скопируй профиль Sublime целиком (в portable-режиме это папка Data). Можешь вручную пакеты выкачать и скинуть в Data/Installed Packages, алсо в пакетах есть .json-ы, в них могут быть описаны зависимости.
>>858186
> Как не обсираться с памятью в сишечке?
Всегда помнить, что ты пишешь на сишечке. Писать на сишечке. Это навык, как ковырять в носу. Если не будешь ковырять - не научишься.
Есть отдельный комп в отделе, с него можно гуглить.
>>858568
>в portable-режиме
Я не знал, что его портабельным можно поставить. Как это сделать? Не помню, чтобы я видел такую опцию при установке.
Я думал, может, пути разные - пакеты лежат ведь в AppData пользователя, а у меня разные имена пользователей на компах.
А как вручную пакеты скачать? Не нашел у многих такой возможности.
> как это сделать
https://www.sublimetext.com/3dev - есть ссылки на zip-архивы, которые установки не требуют.
> пакеты лежат ведь в AppData пользователя, а у меня разные имена пользователей на компах
Похуй должно быть, там обычно не используются абсолютные пути.
> А как вручную пакеты скачать?
Сходи на https://packagecontrol.io/, найди пакет, на странице описания есть ссылка на гитхаб, на гитхабе просто .zip сохраняешь (Clone or download) и меняешь расширение на .sublime-package. Или
https://packagecontrol.io/channel_v3.json распарси чем-нибудь. Но лучше не занимайся хуйней, а сделай что-нибудь с интернетами на работе. Модем под пряжкой ремня протащи, хуй знает.
О, вижу, спасибо.
>Похуй должно быть, там обычно не используются абсолютные пути.
Тогда очень странно. Видимо, в реестре что-то прописывается или в других каких-то местах, потому что у меня анаконда с ошибкой стартует, но работает, а из >>857683 списка ни один не заработал. Дома, естественно, всё работает нормально.
>на гитхабе просто .zip сохраняешь (Clone or download)
Просто у некоторых есть именно zip, но я не понял, как его скормить саблайму, а где-то просто сборище сорцов, я думал, он такое не схавает.
Инет на работе не замутить - пизды дадут скорее всего. Я думаю, там из-за секретности разработок его нет.
Я щас скомпильнул либу без него, и все нормально работает.
Или либа будет работать только на моем компе?
На x86 спорно, компилятору приходится делать немного больше телодвижений и по сути лишиться одного из регистров для достижения этого самого PIC, но зато системе не приходится ничего патчить при старте, и дублировать из-за этих патчей страницы кодовой секции между разными пользователями либы.
Разобрался. Вся проблема в Clion. В code::blocks и VS все отлично работает. CLion почему-то не любит gets, и напрочь отказывается работать с fgets. Просто скипает её.
>Используя gets() CLion просто перечеркивает функцию, и говорит что использовать её неправославно.
И он прав. В C11 функцию вообще выпилили. А вот fgets() остиалась, ее и используют.
Как мне сделать массив int со значением этой строки в аскии-коде? То есть {a, b, c} = {97, 98, 99} ?
Поясни. Строка "abc" или "{a, b, c}"? Если первое, то это массив char, просто скопируй в цикле ints[n] = string[n]. Если второе, то тебе нужен синтаксический разбор. Используй strtok, чтобы найти запятые.
Давай разберем по частям мною написаное
Есть массив char*, который заполняется пользователем:
char text [100];
fgets (text, 100, stdin);
Допустим пользователь вводит abc
Мне нужно добавить к каждому значению его ввода 10. То есть a, b и с представить в Аскии-коде (97, 98, 99), и сделать (107, 108, 109). Результат записать обратно в другой массив char. В нем должно быть (k, l, m) по аскии.
Я сначала подумал просто сделать массив интов со значениями, но потом понял что надо именно второй массив делать чаровский. Проблема как раз стоит в переводе числа. Если например вывести text[1] в "%i", то получу не аски-код, а мусор типо 1274863
Так текст и так всегда представлен числами, тебе не нужны дополнительные телодвижения.
for (size_t j = 0, n = strlen(text); j < n; j++) {
printf("before: %c (%i); ", text[j], text[j]);
text[j] += 10;
printf("after: %c (%i)\n", text[j], text[j]);
}
Спасибо, так получилось. Только вылез другой трабл. Добавить 10 это я просто сделал такой пример. По задаче мне надо каждую бувку поднести в n степень и поделить на число m. Остаток от деления и будет результат. При маленьких числах всё работало, но с такими уже ествественно не хочет.
При
for (int i = 0, n = strlen(text); i < n; i++) {
secretText = pow(text, e) % m;
printf ("%c", secretText);
}
получаю error: invalid operands of types ‘__gnu_cxx::__promote_2<char, long unsigned int, double, double>::__type {aka double}’ and ‘long unsigned int’ to binary ‘operator%’|
Забыл добавить, что у меня 'e' это 3, а 'm' это 8.
А, ты RSA пилишь? Ты делаешь это неправильно. pow предназначен для вычислений с плавающей точкой и не гарантирует тебе точный результат для таких маленьких чисел, на самом деле, гарантирует, но лучше напиши свой целочисленный modpow(n, e, m): умножай n саму на себя, сколько нужно раз, и при каждом умножении, чтобы не переполнить переменную, сразу делай % m (потом допилишь это до полноценной длинной арифметики). Алсо, твой m должен быть произведением двух простых чисел, а у тебя сколько в нем множителей и какие?
man 3 getenv
Потому что создается новый, свой собственный объект name, а уже существующий path, созданный кем-то раньше, получают извне. Конкретно в случае с getenv(), память для значения переменной окружения выделяется во время запуска программы. В какой-то другой реализации getenv() могла бы так же внутри себя вызывать malloc().
>>859350
Он-то умеет. Ты - нет. Числа с плавающей точкой по определению не могут хранить любые значения, поэтому они хранят приближенные значения, достаточно точные относительно порядка числа. И с такими огромными числами, как у тебя (а они больше, чем максимальное целочисленное значение, которое влезает в double без потерь), тыщей меньше или больше - особой разницы нет. Если тебе зачем-то нужна большая точность, попробуй long double.
Почему-то scanf, вместо того, чтобы считать новый символ с потока, пишет в переменную предыдущий введеный, и программа впадает в бесконечный цикл.
http://pastebin.com/6jqmBT05
Может и long double не хвтать. А %lf указываешь? Если тебе нужно фиксированное число знаков после запятой и большие числа, посмотри в сторону fixed-point.
>>859372
После того, как scanf() сфэйлилась, пользовательский ввод еще в буфере ввода. И поэтому вот там, где ты просишь пользователя выбрать correct menu item, прочитай весь остаток текущей строки (просто вызывай getchar() в цикле, пока не встретишь \n).
Более правильный метод - нигде, кроме laba1.c, не пользоваться этим говном. Вместо этого лучше читать предварительно целую строку ввода с помощью fgets() или еще как-нибудь, а потом уже парсить - хочешь, тем же sscanf(), а хочешь - strtod()/strtol() и прочими. Тогда, при ошибке, ты просто выбросишь строку и сделаешь fgets() снова.
Большое тебе спасибо!
Там заглавная L. Всегда путаюсь, извини.
rez на пике указывает на нужный тебе кусок строки. Все, что тебе нужно сделать, это создать буфер достаточного размера и скопировать туда этот кусок:
char str3[16];
strcpy(str3, rez);
Да, это RSA. Спасибо что подкинул идею, сегодня на парах попробую реализовать.
>вой m должен быть произведением двух простых чисел
У меня m = (p-1) + (q - 1), где p и q целые простые числа, и p != q.
Поиск скрытого и открытого ключа я реализовал как тут >>857840. Допустим при вводе 3 и 5, m = 8, потом через функцию поиска ключей получаю e = 3, d = 11.
http://pastebin.com/pFBUuEEi
> у меня m = (p-1) + (q - 1)
Это стандартная путаница. В математике про вычисления по модулю говорят как о (mod m), а в терминах RSA у тебя должно быть mod n, где n - произведение p и q.
Есть инжектор функции в память процесса, и четыре функции, которые я пытаюсь заинжектить. Проблема в том, что инжект каждой из них происходит успешно, но приводит к крашу приложения.
В чем тут проблема, почему даже пустая функция крашит все?
min и max надо делать макросами препроцессора, потому что иначе придется заводить такую функцию под каждый тип, причем с разным названием. Рандом есть, смотри rand, srand и т. п.
азаза, в скобочки не обернул
Тогда в чём вопрос?
Зачем 2 условия?
Нужно больше кода.
1) Так не инжектят. Вставляют джамп, чтобы не затереть остальные фунции (и даже с джампом бывают проблемы). А ты пишешь 250 байт. Мало того, что ты наверняка затираешь дохуя всего, так ты еще тупо копируешь кусок своего кода в чужое адресное пространство.
2) Ты уверен, что твоя целевая функция - cdecl, а не stdcall?
>>859940
Используй школьную арифметику, Люк. Например: ((double) rand() / RAND_MAX) даст тебе случайное значение из промежутка 0..1, назовем его rnd. Ты можешь сделать start + (int) ((end - start + 1) * rnd). Или можешь сделать start + (rand() % (end - start + 1)), но распределение будет гораздо хуже, и работать это будет только если диапазон меньше RAND_MAX.
https://www.youtube.com/watch?v=yG1OZ69H_-o
Неплохой доклад, да. Меня, как и докладчика, заебали эти идиотские заявления "при UB может произойти что угодно, например, отформатироваться твой диск" и т.п.
> Меня, как и докладчика, заебали эти идиотские заявления "при UB может произойти что угодно"
Ну, например, обычный use after free может привести к очень интересным последствиям, особенно если программа работатает с файлами. Хотя сознательно компилятор ничего тереть не будет, конечно же.
http://pastebin.com/xynv2ZaM
Я выделяю 511 в самом начале. Потом туда все записываю каждый раз и вызываю тред (так делает автор, я бы сделал по-другому, факт в том, что крашится пустая функция.
2. Не уверен.
да, там msvc, если что
Как бы ты заинъектил функцию, которая ничего не делает? Я думаю, что все-же в коде асм проблема, ибо делфипацаны так (почти так) инъектят уже много лет.
> PAGE_READWRITE
Где VirtualProtectEx(PAGE_EXECUTE_READ) после записи? Или или хотя бы PAGE_EXECUTE_READ_WRITE при аллокации.
Алсо, нет смысла выделять 511 байт (почему такая константа?). Минимальный размер страницы 4К, меньше 4К VirtualAlloc тебе не выделит в любом случае.
Алсо, ты бы ошибки обрабатывал, что ли. Может, у тебя вообще процесс не открывается, или что-то не пишется.
> CreateRemoteThread(..., m_injFunction, ...)
Функция должна быть stdcall. Ей передается один параметр, поэтому либо ты либо помечаешь ее как __stdcall (WINAPI, CALLBACK, PASCAL), либо не забываешь retn 4.
Алсо, отключаешь ли ты проверки стека (/GS, /RTC и т. п.) при компиляции? Потому что та же 2015 студия в отладочный билд втыкает call stack_check, даже в пустую функцию. А функцию stack_check ты не копируешь, и получается call вникуда. Посмотри дизасм, удостоверься, что все ок.
> Как бы ты заинъектил
> которая ничего не делает
Ничего не делающую функцию инжектить незачем. А что-то делающую - целой DLL-кой. По крайней мере, не нужно будет задумываться о других функциях и переменных и пытаться заставить компилятор собрать position-independent код без лишнего говна. Если есть античит, то все, конечно, не так просто.
Как сделать, что бы при делении на 0 в консоли выводилось не
inf, а "Деление на 0" например?
Cкорее всего, можно изи сделать через if, но я не понимаю как
Пытаюсь проверять через insinite но нихуя не получается
мимо месяц в программировании попалась самая сложная задачка в группе сдавать завтра утром
>>860964
Поясните, как без мозгоебства на винде на связке C+SDL писать/
Ну оно же собирается без ошибок. А баги в проверке орфографиисинтаксиса у них часто, особенно когда с clang/c2 собираешь - компилируется ок, а ошибки подчеркивает. Там рядом с кнопочкой сворачивания окна можно тыкнуть и описать проблему. Сделай мир лучше.
Если очень раздражает, раздели декларацию структуры player и декларацию переменной player - оно перестанет ругаться. Судя по всему, во время определения переменной оно почему-то считает, что текущая структура struct player - анонимная, как бы странно это не звучало.
http://ideone.com/CCzhlI (первая попытка),
http://ideone.com/isdbLH (вторая попытка).
На самом деле, попыток было гораздо больше, чем две.
Мне кажется, что эти нолики в результате пытаются рисунком передать какое-то послание.
У тебя запятые в пользовательском вводе, а scanf() не ожидает их увидеть. Оставь только пробелы, и все заработает.
Проблема: обмен пакетами между клиентом и сервером.
Нужно разобраться в вопросе как все устроено, и какие инструменты доступны в Си.
Попробуй википедию, потом, когда поймешь основы нагугли статейки или хабр. Там уже будешь иметь конкретные вопросы и список литературы.
Для обмена пакетами в Си, как и в других языках, используют сокеты. Если у тебя Windows, возьми что-то типа пикрелейтед. Если Linux - есть Cтивенс с его Unix Network Programming (его же TCP/IP Illustrated и для винды стоит почитать, чтобы понимать, как вообще сеть работает). Простые хелловорлды с блокирующими сокетами заработают с минимальными правками в любой ОС, а когда дело дойдет до неблокирующих сокетов - читай книжки, статьи, ну и маны, конечно.
Хз, то или нет о, вчера анон ссылкой кидался, а я схоронил
http://beej.us/guide/bgnet/
Читаю Hacking: The Art of Exploitation
Естественно, дизассемблированные листинги оче разные, у автора одни мнемоники идут, у меня другие. Как думаете, это компилятор оптимизирует, или оттого что компиляторы разных версий?
Показал бы хоть. Попробуй с -O0 компилировать, тогда компилятор точно не будет ничего оптимизировать.
Да, спасибо. Я думаю, это изза того что книга 2003 года, и в ней GCC version 3.3.6 используется. Я лучше погуглю как поставить две разные версии компилятора
Ставь сразу на виртуалку и остальной линукс тех лет. А то несколько тредов назад кто-то тут на ASLR напарывался с этой книгой.
Да, ты прав. Погуглил - только это и работает, приложенный iso надо использовать
Довольно потно идет книжка, должен сказать, от адресов в глазах рядит лол
Да? Чот не заметил, хотя я мышой не сильно елозил. Вся проблема была в том, что я диск скачал с нашего русского издательства, по фтп. Он не хотел ставится в виртуалбокс, ну я и полез хуй пойми куда старые компиляторы, оптимизации. А нужно то всего было скачать диск с нормального места
Было PAGE_WRITE, заменил на PAGE_EXECUTE_READWRITE
Какой смысл в VirtualProtectEx, мы аллоцировали память, про которую клиент не знает, получили все права и делаем что хотим.
Ошибки я обрабатываю, для теста я считываю значение ХП из клиента. А инъектирование возвращает успех. Мне нужно заинжектить не один раз, а делать это постоянно. Память аллоцируется при старте под все возможные функции и соотетствующим образом используется.
Тем не менее исправив твои замечание, свершилось чудо, которое я не мог узреть три года, пустая функция заинжекшена успешно без краша.
Разреши еще немного заебать парой вопросов:
1. Я попробовал инжектить более продвинутую функцию simpleF(). В дампе передо мной находится то, как msvc перепихнул simpleF() ? По какой причине в асм коде появилась строчка, которая вызывает краш? Какого черта код сам забирает параметры, хотя это же должна делать по идее функция, которую мы вызовем?
2. Если предположить, что функция
MOV ESI, 0x007F4C80
CALL ESI
Должна попать два аргумента со стека, семантика верна, и краша не должно быть? всмысле ошбика уже в предугадывании характера функции, а не в коде ассемблера
3. ВНЕЗАПНО на вирустотале данный код уже помечен 5 антивирусами, на какое апи они триггерятся?
4. Автор статьи также предлагал более универсальный метод по инжекту - прямое записывание функции. Он бинарно копирует асм код из олли, и инжектит уже фиксированное количество байт для каждой функции
void Skill(DWORD id)
{
char fdata[39]="\x60\x6A\xFF\x6A\x00\x6A\x00\x68\x00\x00\x00\x00\x8B\x0D\x00\x00\x00\x00\x8B\x89\x00\x00\x00\x00\x8B\x89\x00\x00\x00\x00\xB8\x00\x00\x00\x00\xFF\xD0\x61\xC3";
DWORD func=F_SKILL;
DWORD ba=BA;
DWORD dga=D_GA;
DWORD ps=PERS_STRUCT;
memcpy(fdata+8,&id,4);
memcpy(fdata+14,&ba,4);
memcpy(fdata+20,&dga,4);
memcpy(fdata+26,&ps,4);
memcpy(fdata+31,&func,4);
InjectFunction(fdata,39);
}
InjectFunction копирует тупо весь код по заданной длинне. Так вот, такая поебота тоже вызывает целую цепочку функций, генерируемых компилятором, или же она прямо копирует все, как записано в чаре.
http://pastebin.com/ZWXYGJF0
Было PAGE_WRITE, заменил на PAGE_EXECUTE_READWRITE
Какой смысл в VirtualProtectEx, мы аллоцировали память, про которую клиент не знает, получили все права и делаем что хотим.
Ошибки я обрабатываю, для теста я считываю значение ХП из клиента. А инъектирование возвращает успех. Мне нужно заинжектить не один раз, а делать это постоянно. Память аллоцируется при старте под все возможные функции и соотетствующим образом используется.
Тем не менее исправив твои замечание, свершилось чудо, которое я не мог узреть три года, пустая функция заинжекшена успешно без краша.
Разреши еще немного заебать парой вопросов:
1. Я попробовал инжектить более продвинутую функцию simpleF(). В дампе передо мной находится то, как msvc перепихнул simpleF() ? По какой причине в асм коде появилась строчка, которая вызывает краш? Какого черта код сам забирает параметры, хотя это же должна делать по идее функция, которую мы вызовем?
2. Если предположить, что функция
MOV ESI, 0x007F4C80
CALL ESI
Должна попать два аргумента со стека, семантика верна, и краша не должно быть? всмысле ошбика уже в предугадывании характера функции, а не в коде ассемблера
3. ВНЕЗАПНО на вирустотале данный код уже помечен 5 антивирусами, на какое апи они триггерятся?
4. Автор статьи также предлагал более универсальный метод по инжекту - прямое записывание функции. Он бинарно копирует асм код из олли, и инжектит уже фиксированное количество байт для каждой функции
void Skill(DWORD id)
{
char fdata[39]="\x60\x6A\xFF\x6A\x00\x6A\x00\x68\x00\x00\x00\x00\x8B\x0D\x00\x00\x00\x00\x8B\x89\x00\x00\x00\x00\x8B\x89\x00\x00\x00\x00\xB8\x00\x00\x00\x00\xFF\xD0\x61\xC3";
DWORD func=F_SKILL;
DWORD ba=BA;
DWORD dga=D_GA;
DWORD ps=PERS_STRUCT;
memcpy(fdata+8,&id,4);
memcpy(fdata+14,&ba,4);
memcpy(fdata+20,&dga,4);
memcpy(fdata+26,&ps,4);
memcpy(fdata+31,&func,4);
InjectFunction(fdata,39);
}
InjectFunction копирует тупо весь код по заданной длинне. Так вот, такая поебота тоже вызывает целую цепочку функций, генерируемых компилятором, или же она прямо копирует все, как записано в чаре.
http://pastebin.com/ZWXYGJF0
#define DWORD unsigned long
DWORD func(DWORD arg);
Но когда я подключаю этот хедер к проекту, он не компилится: Undeclared identifier 'DWORD' (did you mean 'argv'?)
Undeclared function 'func
Что делать? Объявлять функции как extern? А с двордом что?
Мануал:
_BigCreate (dword)InitValue
[LIBcore.asm]
creates a bignum and initializes it with the value InitValue
returns a pointer to the bignum
_BigDestroy (big )Big
[LIBcore.asm]
destroys the bignum Big
_BigCopy (big )BigSrc, (big )BigDest
[LIBcore.asm]
copies BigSrc to BigDest
_BigCompare (big )BigA, (big )BigB
[LIBcore.asm]
compares BigA and BigB
returns 1 if BigA > BigB
0 if BigA = BigB
-1 if BigA < BigB
_BigCompare32 (big )BigA, (dword)Value
[LIBcore.asm]
compares BigA and Value
returns 1 if BigA > Value
0 if BigA = Value
-1 if BigA < Value
Мануал:
_BigCreate (dword)InitValue
[LIBcore.asm]
creates a bignum and initializes it with the value InitValue
returns a pointer to the bignum
_BigDestroy (big )Big
[LIBcore.asm]
destroys the bignum Big
_BigCopy (big )BigSrc, (big )BigDest
[LIBcore.asm]
copies BigSrc to BigDest
_BigCompare (big )BigA, (big )BigB
[LIBcore.asm]
compares BigA and BigB
returns 1 if BigA > BigB
0 if BigA = BigB
-1 if BigA < BigB
_BigCompare32 (big )BigA, (dword)Value
[LIBcore.asm]
compares BigA and Value
returns 1 if BigA > Value
0 if BigA = Value
-1 if BigA < Value
#include<stdlib.h>
#include<time.h>
//=========функциязаполнениямассива=========
int RandVector(int size, int massiv, int max_rand)
{
srand(time(0));
//рандомизация – установка начального псевдослучайного числа
for (int i = 0; i< size; i++)
{
massiv = 1 + (rand() % max_rand);
//случайное число в диапазоне от 1 до 10
}
return 0;
}
//=========функция вывода массива на консоль=========
int PrintVector(int size, int massiv)
{
for (int i = 0; i< size; i++)
{
printf("%i ", massiv);
}
printf("\n");
return 0;
}
В чем ошибка?
#include<stdlib.h>
#include<time.h>
//=========функциязаполнениямассива=========
int RandVector(int size, int massiv, int max_rand)
{
srand(time(0));
//рандомизация – установка начального псевдослучайного числа
for (int i = 0; i< size; i++)
{
massiv = 1 + (rand() % max_rand);
//случайное число в диапазоне от 1 до 10
}
return 0;
}
//=========функция вывода массива на консоль=========
int PrintVector(int size, int massiv)
{
for (int i = 0; i< size; i++)
{
printf("%i ", massiv);
}
printf("\n");
return 0;
}
В чем ошибка?
> какой смысл в VirtualProtectEx
Как альтернатива выделению с PAGE_EXECUTE_READWRITE. Выделилить read-write, записать, сделать execute-read. Дело вкуса, но это
> ВНЕЗАПНО на вирустотале данный код уже помечен 5 антивирусами
может снизить градус подозрительности у некоторых антивирусов. А возбуждаться могут даже на OpenProcess+WriteProcessMemory, там все сложно. Иногда и на хелловорлды ругаются. Даже не знаю, что предложить почитать. Васм закрылся, к сожалению.
> В дампе передо мной находится то, как msvc перепихнул simpleF() ?
В дампе код метода класса. Ты можешь легко вычислить методы по обращению к ECX без его предварительной инициализации. В ECX передается this.
> Какого черта код сам забирает параметры, хотя это же должна делать по идее функция, которую мы вызовем?
Не понял вопроса.
> 0x007F4C80
> Должна попать два аргумента со стека
И указатель на объект в ECX.
> Так вот, такая поебота тоже вызывает целую цепочку функций, генерируемых компилятором, или же она прямо копирует все, как записано в чаре.
Тоже не совсем понял вопрос. Скопирует, как есть. Были внутри вызовы функций - никуда не денутся. Не было - не появятся.
>>861366
Ну у тебя все правильно, только не стоит объявлять псевдонимы дефайном, для этого есть typedef: typedef unsigned long myDWORD; И не стоит вообще делать тип DWORD, когда можно #include <stdint.h> и использовать uint32_t (если тебе нужен точный размер и 64-битной версии либы не предвидится).
>>861398
В пасте все должно компилироваться. Почему у тебя функции с подчеркиванием в начале? Алсо, extern писать не обязательно, функции по умолчанию и так extern.
>>861449
Если у тебя там massiv[i] в обеих функциях, то не вижу ошибок. Или ты в PrintVector всегда печатаешь численное значение указателя? https://ideone.com/ позволяет, во-первых, запостить код, не распидорасив его [i] и звездочками, а во-вторых, показать нам, что идет не так, раз уж тебе лень объяснить самому.
> какой смысл в VirtualProtectEx
Как альтернатива выделению с PAGE_EXECUTE_READWRITE. Выделилить read-write, записать, сделать execute-read. Дело вкуса, но это
> ВНЕЗАПНО на вирустотале данный код уже помечен 5 антивирусами
может снизить градус подозрительности у некоторых антивирусов. А возбуждаться могут даже на OpenProcess+WriteProcessMemory, там все сложно. Иногда и на хелловорлды ругаются. Даже не знаю, что предложить почитать. Васм закрылся, к сожалению.
> В дампе передо мной находится то, как msvc перепихнул simpleF() ?
В дампе код метода класса. Ты можешь легко вычислить методы по обращению к ECX без его предварительной инициализации. В ECX передается this.
> Какого черта код сам забирает параметры, хотя это же должна делать по идее функция, которую мы вызовем?
Не понял вопроса.
> 0x007F4C80
> Должна попать два аргумента со стека
И указатель на объект в ECX.
> Так вот, такая поебота тоже вызывает целую цепочку функций, генерируемых компилятором, или же она прямо копирует все, как записано в чаре.
Тоже не совсем понял вопрос. Скопирует, как есть. Были внутри вызовы функций - никуда не денутся. Не было - не появятся.
>>861366
Ну у тебя все правильно, только не стоит объявлять псевдонимы дефайном, для этого есть typedef: typedef unsigned long myDWORD; И не стоит вообще делать тип DWORD, когда можно #include <stdint.h> и использовать uint32_t (если тебе нужен точный размер и 64-битной версии либы не предвидится).
>>861398
В пасте все должно компилироваться. Почему у тебя функции с подчеркиванием в начале? Алсо, extern писать не обязательно, функции по умолчанию и так extern.
>>861449
Если у тебя там massiv[i] в обеих функциях, то не вижу ошибок. Или ты в PrintVector всегда печатаешь численное значение указателя? https://ideone.com/ позволяет, во-первых, запостить код, не распидорасив его [i] и звездочками, а во-вторых, показать нам, что идет не так, раз уж тебе лень объяснить самому.
Хуй знает. Существуют .chm со статьями и примерами, но я имел в виду форум и живых людей.
> Васм закрылся, к сожалению.
Это да, к большому сожалению. Теперь толпы школохацкеров-дегенератов разбежались повсюду и засирают всё своими хуками и прочим говном.
Не припомню на васме прямо таких уж толп школьников с читами и хуками. Вот срач и политоту в хипе - помню, это да. И еще помню профи, которые могли ответить на любой вопрос.
http://rutrackermirror.org/torrent-62156.html (2006)
http://rgho.st/6Z7bNy4PC 2ch (2007)
Еще на вебархиве есть многое.
О, спасибо, совсем забыл про вебархив. А были же дампы года 2012-14го, или мне кажется?
Хуй знает. Наверняка где-то и полный дамп продается с прошлого взлома.
Чем тебя не устроили готовые билды?
Я вообще не понимаю, нахуя эту поебень добавили в стандарт. Кто вообще в здравом уме будет добровольно размещать массивы произвольного размера на стеке?
код - http://pastebin.ru/eSs1eT0W
задание 27 - https://pp.vk.me/c637825/v637825283/1af5c/Km9rz5QQ4Cw.jpg
Школохацкер-дегенерат, надо полагать?
Проверил, крашнулось с ошибкой 0xc0000005
Щас буду делать "первую программу". Знаний по с ноль, аноны я долго будут с этим ебаться, если всю инфу буду черпать с учебника?
Расскажи, чем код: int length = 100; int array[length]; принципиально отличается от int array[100000]; int length = 100; (ну кроме считающегося в рантайме sizeof и проблем оптимизации)?
>>862050
Если ты формулу понимаешь, и на си не писал вообще, то провозишься пару часов, наверное.
> программа не проходит так, как хотелось бы, в чем дело?
В строках 28-43 после совпадения одного из условий ты проваливаешься в проверку следующего, и получается, что ты считываешь с середины символа, а потом на следующей итерации опять с середины и т. д. Свяжи if-ы через else или воткни continue после каждого printf, выводящего символ.
> принципиально отличается
Тем, что с первым у тебя будет просто переполнение стека и сегфолт, а со вторым еще в придачу и выполнение произвольного кода через подмену адреса возврата.
> подмену адреса возврата
Ну во-первых, это уже малоактуально - компиляторы давно умеют детектить порчу стека. Во-вторых, это аргумент за VLA, но какой-то хуевый, потому что проверка запрошенного размера массива нужна в обоих случаях, и в обоих случаях она одинаковая.
>>862202
> со вторым еще в придачу и выполнение произвольного кода через подмену адреса возврата
Ну вот тебе подмена адреса возврата с VLA: http://ideone.com/M8agh6 Алсо, сможешь без отладчика пояснить, как работает magic()? Алсо, по техническим причинам это не сработает в Windows, вне зависимости от использованного компилятора.
Ваш компилятор слишком тупой и неправильно выделяет память под массив. Если запросить у него пару мегабайт места на стеке, то на винде всё просто упадёт.
>как работает magic()
Никак не работает.
> Ваш компилятор слишком тупой и неправильно выделяет
Ваш - это чей? А как правильно выделять? На самом деле там ни единой страницы не выделяется - все уже выделено.
> Никак не работает.
Если она не работает, как тогда сообщение печатается? Закомментируй вызов magic() - не будет сообщения.
Она нужна всего лишь, чтобы адрес evil затолкался на стек. Возможно, это можно сделать с локальными переменными (или даже просто в массив записать) - мне лень сейчас в голове проворачивать, как оно там выделяется и работает. Сама функция ничего не делает.
>А как правильно выделять?
Явно не sub esp, xxx. Это, в общем, ещё один специализированный инструмент по отстрелу ног. Накой нужна фича с такой-то реализацией?
> Накой нужна фича с такой-то реализацией?
Но ты ведь понимаешь, что VLA ценны только потому, что они "бесплатные"? Если аллокация массива будет сложнее, чем sub esp,nnn - такая фича будет никому не нужна, потому что тогда проще выделить массив фиксированного размера или сделать malloc(). Собственно я и начал весь этот ээ... разговор, пытаясь доказать, что массивы фиксированного размера ничем не хуже.
ZeroMemory(rsa_block, RSA_BLOCK_SIZE);
ReadFile(hEncryptedFile, rsa_block, RSA_BLOCK_SIZE, &dwBytesRead, NULL);
RSASetup(&rsa);
RSADecrypt(&rsa, rsa_block, RSA_BLOCK_SIZE, key);
RSAClear(&rsa);
эплоблядь, ты заебал со своими реквестами, тебе на топики похуй? или привык через жопу все. пиздуй к плюсанам.
Извиняюсь. Я просто тред плюсов и си перепутал.
Возможно, RSA_BLOCK_SIZE у тебя в байтах, а блок текстом? И вообще, где возвращаемое значение ReadFile, где GetLastError?
>RSA_BLOCK_SIZE у тебя в байтах, а блок текстом
RSA_BLOCK_SIZE равен логарифму по основанию 16 от модуля RSA, т.е. максимальную длину 16-ричного числа по этому модулю.
Я хочу сохранять в заголовке файла 16-ричные числа как текст, читать их оттуда как текст и расшифровывать, потому что моя либа это позволяет делать.
Хм, помогло увеличение RSA_BLOCK_SIZE на единицу. Я немного проебался с логарифмом. Тестовая программа нормально работает.
настолько, насколько тебе важна стабильная работы программы
Бумажка с ручкой тебе поможет. Зарисовывай. Ну и отладчиком тоже смотри.
PathFindExtension, а на соответствие - это ты как-нибудь сам. С маленьким списком и цикл ок, с большим изобрети хэшик какой-нибудь. Но судя по
> Как на WinAPI
ты тот самый пидор, который пишет криптолокер.
Ну, учитывая многобразие поддерживаемых форматов путей в Windows, а также то, что расширения у файла может не оказаться, решения типа strrchr(..., '.') - это не самый правильнный выход, лучше обращаться к уже отлаженной функции ОС.
https://www.crcpress.com/X86-Assembly-Language-and-C-Fundamentals/Cavanagh/p/book/9781466568242
Содержание выглядит как пересказ интеловского мануала.
ты же понимаешь, что асм под винду и асм под никс и асм под железо на одной платформе схожи только синтаксисом и то невсегда. асм под арм и асм под 86 отличны в синтаксисе. учи хаскел.
Все ассемблеры одинаковы. Если знаешь один-два, следующий учится за вечер.
http://rgho.st/69DgdmLqt
а ты хитрюша, ссу тебе в ротешник.
Блядь, ну ты нормальный вообще? Ты выводишь сообщение, потом очищаешь экран. А потом выходишь из функции, а потом из программы. Убери нахуй все свои cls.
Алсо, ты в game() break в switch забыл запомни правило, чтобы не ошибаться с break, у тебя в каждом case должен быть break;, кроме случаев, когда каждый case состоит из простого выражения и return. В menu() тоже воткни везде break, иначе поправишь код и опять напорешься. Алсо, сделай что-нибудь со своей рекурсией - погугли game loop.
1) accuracy не должен превышать sizeof(k) - 1;
2) В строке 39 завершающий ноль нужно писать по k[i], а не по k[i+1] - после записи очередной цифры ты уже делаешь i++, и получается, что после выхода из цикла k[i] - это первый незанятый элемент строки.
3) И главное, ты не инициализируешь переменную i, и она может быть равна чему угодно. Если у тебя нет компилятора, которому можно сказать -Wall, то хотя бы выбери на ideone язык не C, а C99 Strict, и будешь видеть предупреждения.
Спасибо, изменил accuracy, все заработало, а i у меня была объявлена перед циклом while.
У тебя i объявлена, но не инициализирована (ей не присвоено значение до ее использования). Если по счастливой случайности сейчас она у тебя оказывается равна 0, это не значит, что так будет в дальнейшем.
Действительно, забыл. Мой косяк. Спасибо еще раз.
Кресты - это шаблоны, дурачок.
Начиная с определенного момента без них становится очень хуево. Структуры вместо классов, например, и прочая няшнота - why not, а без шаблонов - совсем никак.
>Начиная с определенного момента без Иисуса становится очень хуево, дурачок
Из-за шаблонов приходится держать код в хедерах, или уже что-то придумали? Потом, ебанутое именование символов в модулях. Из-за этого у старинной сишки РЕФЛЕКТИВНОСТЬ лучше, чем у крестов.
Зато из-за отсутствия шаблонов в сишечке ты вынужден либо изобретать qsort каждый раз, либо сосать по сравнению с крестами из-за колбека на каждый элемент.
>Из-за шаблонов
И правда дурачок - или ребенок просто.
Задача: реализовать класс/структуру для инт/флоат/дабл/хуйпизда.
Ты можешь, конечно, набойлерплейтить все комбинации - если совсем дебил наиболее вероятный вариант
Или можно пропердолиться дефайнами по взрослому, без носков. На самом деле вариант - только проблема в том, что они глобальны. То есть придется велосипедить свой неймспейс.
Детский сад, вобщем.
Так ты предлагаешь реализовывать свой забагованный qsort в каждом проекте, я правильно понял?
>Задача: реализовать класс/структуру для инт/флоат/дабл/хуйпизда.
Это сделано во всех интерпах с динамическими типами и почти во всех почему-то не на крестах. Дурачки делали, вероятно.
>>863644
Почему, берешь какую-нибудь либу с qsort, указатели на функции все решают. Потом, в сишечке можно определить адрес (сорян, матерное слово для крестоносцев) структуры по ее элементу, эта хуйня даже в ядре линупса используется, и сам пользовался сколько раз.
> указатели на функции все решают
А в крестах у метода, сравнивающего элементы есть все шансы заинлайниться. О том и речь.
>с динамическими типами
Тебе в JS - это твое.
>динамическими типами
>Дурачки делали
Что очевидно.
>в крестах у метода, сравнивающего элементы есть все шансы заинлайниться
Во-первых, не у метода, а у класса. В парадигме ООП сравнение, как и все остальное что угодно - это класс/объект. Во-вторых, в сях то же самое. Это вопрос к компилеру. Современные компилеры оптимизируют рекурсию.
>>863663
>Тебе в JS
Кресты и есть нечто гомеоморфное JS. Их прототипы не лучше ваших паттернов.
>реализовывать свой забагованный qsort
Ты нить потерял, дебиленок.
Крестопараша, конечно, говно омерзительное - но иногда няшная хуже. Когда шаблоны нужны, например.
Старенькая она уже.
> Во-первых, не у метода, а у класса
Мне похуй, что там в парадигме. Инлайнится конкретный метод.
> Современные компилеры оптимизируют рекурсию.
А это-то тут каким местом?
>есть нечто гомеоморфное JS
Высеры с *воид твоих собратьев по, хаха, "разуму" - это точно жс, по уровню дегенерации.
Проебать контроль типов, огрести оверхед на своих же костылях - и обосраться по быстродействию даже по сравнению с крестопарашей.
Няшная не для дебилов вроде тебя, вобщем.
>Инлайнится конкретный метод.
Функции еще лучше инлайнятся.
>> Современные компилеры оптимизируют рекурсию.
>А это-то тут каким местом?
Тем же самым. Вместо call получается jmp или инлайн.
> Функции еще лучше инлайнятся.
Когда дело доходит до инлайна, отличий между методом и функцией нет вообще.
> Вместо call получается jmp или инлайн.
Не получается. qsort() в либе, в середину скомпиленной функции тебе никто jmp втыкать не будет. И вообще компиляторы вызов функций по указателям оптимизируют крайне неохотно.
> >указатели на функции
>Вместо call получается jmp или инлайн.
https://www.youtube.com/watch?v=uB4zwhvaKLE
>компиляторы вызов функций по указателям оптимизируют крайне неохотно.
>вызов функций по указателям оптимизируют
То есть все-таки могут заинлайнится, правда?
Да уж, ну и дебилы. А я-то думал тупее чем на хабре не бывает, наивный.
>в середину скомпиленной функции
Можно взять нескомпиленную. Как в крестах прямо.
>>863677
Это ты там выше подорвался? Ничего, Чудское Озеро охладит твой зад.
Фиксирую отсутствие возражений.
То есть указатели на функции и у этого дегенерата инлайнятся.
Все же большой минус няшной - в комьюнити у крестопараши таких дебилов уровня /бэ все же меньше.
Да, господин дегенерат. Они правда инлайнятся, если компилеру известен исходный кот qsort и исходный кот функции сравнения.
>gcc это оптимизирует
Пример, пожалуйста.
Указатель на функцию - это, в общем случае, переменная - иначе смысла во всем этом нет.
И знать на какую именно функцию там ссылка компилятор - в хотя бы немного осмысленных случаях - не может.
хелло_лаба1.с не учитываю, конечно.
>в крестах что, инлайнится код
Шаблонных классов, например.
То есть можно более-менее генерики с контролем типов и оптимизацией - в том числе инлайнами где надо.
Без позорища с *воид и прочей школопарашей уровня /бэ.
То есть ты из исходника собирался определять, объединяет ли gcc код двух функций, исходники которых ему известны, когда одна передается указателем в другую?
>ты из исходника собирался определять
Не вижу проблем прогнать гцц и немного подебажить.
Это не так страшно как ты думаешь, не бойся за меня :3
А в сишечке инлайнится код функций нормально. Это практически та же ситуация, только проще - без таблицы виртуальных функций.
Маневр номер очередной+1 засчитан.
То есть исходника у тебя нет - да и быть не может, что ты вроде бы уже понял.
Хотя может и нет - неисповедимы пути дебилов уровня /бэ.
> >генерики
>в сишечке
>Это практически та же ситуация
Тебе лучше попробовать 1с.
Там все твои друзья.
Извини, конечно, но по большому счету ты утверждаешь, что компилер заинлайнит метод, но с функцией обосрется.
>сам дурак
Ясно.
>>863714
А, понятно - с памятью проблемы и вообще.
>>863693
>Указатель на функцию
Хотя стыдно, конечно - нехорошо смеяться над больными людьми.
>Читать это существо тоже не умеет
Скорее gcc не сумеет в инлайн метода, чем в инлайн функции :3
Дебил натуральный.
Вся ваша проблема в непонимании других.
И не потому что другие дебилы - хотя правило 95% работает всегда, да - а потому что дебилы с отставанием в развитии всего - это вы все, двачеры.
Совсем как маил.ру.
>Такое же как ты, в точности.
Я вообще другой анон, но так и не понял хуиты про паттерны и кроссплатформу: на сях так не пишут?
>на сях так не пишут?
Няшная не для всяких извращений.
Хотя крос можно напердолить дефайнами, конечно.
Кроссплатформа на плюсах пердолится точно так же как на говняшной. Про паттерны — посмотри ядро линукса или хотя бы GTK.
1. Быстро открывалась, без модулей sql, git и прочего лишнего. Кодить буду только cpp и winapi.
2. Был нормальный функционал для опытного пограммера. Подсветка, автокомплит, рефакторинг, find usage, goto defination and declaration и т.п.
3. Не нужно ебаться с привязкой компиляторов. Чтоб всё шло из коробки.
Т.е. не Visual Studio (пункт1), не sublime+gcc (пункт2), не Eclipse (пункт3).
Видел кучи рекомендаций CodeBlocks, QtCreator, DevCpp и т.д. - куча, какой наиболее подходит под мои требования?
int hui = hui1 | hui2;
if((hui & (hui1 | hui2) == (hui1 | hui2))
может быть быстрее кода типа
int hui = 1;
if(hui)
Так какого хуя-то?
Экономия места (в сетевых протоколах вполне оправдано), возможность проверить несколько флагов одновременно, удобство (назначить 20 флагов маской через | проще, чем писать 20 присваиваний). Алсо, if((hui & (FLAG1 | FLAG2) == (FLAG1 | FLAG2)) всего лишь на одну инструкцию длиннее, чем if (hui1), а гораздо более частый вариант с одной маской if (hu1 & FLAG1) и вовсе ничем от if (hui1) не отличается с точки зрения количества инструкций на самом деле от платформы зависит, но на x86 разницы нет.
Как лучше это реализовать? Объявить поля в базовом классе, а в наследниках присваивать им значения в конструкторе? Или можно как-то более красиво?
1) Это не крестотред;
2) Если не хочешь анальных трещин от архитектуры до рантайма — не суй, блядь, данные в родительский класс. Интерфейс должен обеспечивать только методы т.е. в твоём случае можно объявить в род. классе virtual int max_hp() а в наследниках просто возвращать константу int max_hp() override { return 100; }.
Это хуитка из жявы, не дающая стрелять в ногу реализовать метод которого нет в интерфейсе (например, ты совсем валет и вместо size_t написал unsigned int аргумент — без этой хуиты такой код компилировался везде молча, но при попытке дёрнуть виртуальный метод на платформе где size_t != uint всё бы жутчайшим образом распидорасило на пустом месте).
Крестоеб уходи!
* timestamp, бистрафик
пасиб
А если надо не чисто асбтрактный класс, а как шаблон, который делал бы почти всё, а наследникам надо только переопределить некоторые (по усмтотрению) методы, ну и поля?
Во втором K&R уже ANSI.
Тем, что пидорасит регистры и стек, что не всегда нужно когда надо например вставить свою хуитку в чужой код.
В универе выбрал не ту дорожку (не имел представления о мире программирования вообще) и пошел по пути веб-программирования, джава спринг и прочее. За год работы в конторе ужасно непонравилось, ушел в скриптинг на питоне/руби. Сейчас все еще думаю о том, чтобы перейти в с++, начал читать сначала С керигана ричи, смотреть лекции Линского, потом планирую какую нибудь книгу по с++. На все про все даю себе полгода до уровня Junior. В универе изучал С++ но, как уже сказал, выбрал не ту дорогу. Как думаете, аноны, реально ли до уровня уверенного джуна за полгода подняться? В программировании, структурах данных и алгоритмах минимально разбираюсь, в универе нормально решал. Спасибо.
>Год-два?
Если начинать с правильного возраста.
Тебе уже поздно, ты уже веб-дебил.
Твой мозг искалечен.
ну понятно.
Можно за год выучить и сишечку, и кресты до хуевого, но приемлемого уровня. Только надо въябывать, а не спрашивать на форумах для девочек-анимешниц, получится ли у тебя.
Приплюснутые как евреи, у ник ОП-стихоплет ушел, и они лишились родины, теперь кочуют туда сюда балмошаться без ума-толку
понял
У плюсов с си как раз общего дохуя, а большая часть роектов на плюсах — си с классами и шаблонами вместо макросов.
общего столько же, сколько у жс с жавой
а большинство проектов на жс - жава с динамической типизацией
Аноны, полный ноль в С на связи, препод дал это задание в С, т.е. создать программу для решения с вводом переменных, как долго я буду с этим дрочиться, если знаний в С тупо нет Только в Паскале еще более менее?
Хорошо. Хорошо?
да.ладно?
Подскажите в чем ошибка, почему криво заполняет массив с клавиатуры?
Ананасы, какую структуру данных лучше всего использовать для записи и хранения в ней логов? Основные требования - отсутствие malloc-ов и возможность добавления записей с помощью snprintf т.е. очевидный кольцевой буффер отпадает
Прям полное отсутствие malloc-ов, или один раз не пидарас? коли не пидор - выдели при инициализации всё что нужно и не еби мозга, иначе задумайся о своей реализации snptintf
>>864679
ДНК. А вообще - почитай про точки следования, с оптимизациями вычисление i может и покорёжится.
Ну и говно.
Кольцевой буфер + промежуточный буфер для печати. Печатаешь в промежуточный, копируешь в кольцевой.
Что такое !=?
Товсто
>snprintf т.е. очевидный кольцевой буффер отпадает
Не отпадает.
http://www.gnu.org/software/libc/manual/html_node/Custom-Streams.html
>А вообще - почитай про точки следования, с оптимизациями вычисление i может и покорёжится.
Чтобля? Каким образом?
>У плюсов с си как раз общего дохуя
Не настолько, чтобы мешать их в одну кучу и заменять один другим.
>большая часть роектов на плюсах — си с классами и шаблонами вместо макросов
Ну это явно хуёвый подход к программированию на крестах, ставить его в пример как-то глупо.
Молодец, мужественно признался на анонимном формуе.
>какую структуру данных лучше всего использовать для записи и хранения в ней логов?
Используй mmap, malloc-ов нет, можно через sprintf писать
Все на английцком, дай на руццком
Ну вот выучишь ты синтаксис языка, читая русские учебники, а что дальше? Все интересные статьи на английском, документация к либам на английском, комментарии в коде на английском, тикеты на английском, тз на английском. Намек понял?
Впрочем, если тебя в вузике язык учить заставлют, Керниган и Ричи есть в русских переводах, даже в трех изданиях, вместо каноничных двух.
На хуицком. В поиск научись
Разбей задачу на подзадачи: научись получать цифры числа (snprintf или делением на 10), а потом напиши цикл по цифрам, проверяя это самое чередование. Потом посмотри на свое решение и выкинь лишние шаги.
зачем мне тебя зашивать?
поплакался
Это нормально. Все на это напарывались. В твоей жизни еще будут и = вместо ==, и ошибки на 1 в for, и упущенные break в switch, и много других радостей.
и мне пиши
Дефайны более гибкие: можно делать unsigned, можно втыкать флаги в старшие биты. В целом, можно думать об этом так: если enum подходит в качестве типа переменной или аргумента (например, void foo(enum smth arg)), тогда стоит использвать enum. Если возникают причины так не делать, возвращаемся к дефайнам.
просто открой сорцы любого mature опенсорсного проекта
там сразу поймешь где и как перечисления используются
тупо того же линукса
кстати, все перечисленное тобой легко предупреждается подключением утилит статического анализа кода..
непонятно, почему разрабы до сих пор ленятся их использовать
> легко предупреждается подключением утилит статического анализа кода
Не так уж и легко. Ловится далеко не все, что хотелось бы, зато количество ложных срабатываний отбивает всякое желание проверять код на постоянной основе - либо ты каждый раз читаешь километры логов, либо ты орально ублажаешь статический анализатор вместо написания программы.
> непонятно, почему разрабы до сих пор ленятся их использовать
Встречный вопрос: ты что-нибудь крупное писал, или только на хелловорлдах тестил?
>В твоей жизни еще будут и = вместо ==, и ошибки на 1 в for, и упущенные break в switch, и много других радостей.
Это не то, что статическими анализаторами, это всеми компиляторами ловится.
>>866030
>Не так уж и легко.
Не легко, а ОЧЕНЬ легко.
> Ловится далеко не все, что хотелось бы
Не могу представить, чего бы ещё хотелось, столько всего выловилось.
> количество ложных срабатываний отбивает всякое желание проверять код на постоянной основе - либо ты каждый раз читаешь километры логов, либо ты орально ублажаешь статический анализатор вместо написания программы.
Осиль grep. 5 фильтров и никаких ложных срабатываний нет.
> ты что-нибудь крупное писал, или только на хелловорлдах тестил?
В проекте 2.3 MLOC C++ + 0.7 MLOC C
> это всеми компиляторами ловится.
res = 1;
for (i = 0; i <= e; i++) {
res *= x;
}
Не подскажешь, кем это ловится? И как оно вообще может ловиться?
>>866036
> 5 фильтров и никаких ложных срабатываний нет.
Какие фильтры, ты о чем вообще вон, в PVS-Studio предлагают комментариями с аннотациями срать, чтобы fp подавить? Например, есть одна вижуал студия. Есть глобальный массив структур items, последний его элемент всегда { 0 }. Функция делает: for (ptr = items; ptr->name != NULL; ptr++) { ... } Статический анализатор в студии клинит вроде починили в последнем апдейте, и он говорит, что я выхожу за пределы массива. Что ты будешь грепать? Отключишь сообщение целиком? А в другом месте оно может на баг указать.
Немного лучше гцц/местами/очень сильно зависит от кода/с каждым релизом обоих соотношение меняется. Собирай свой код и профилируй.
enum {HUITA_RAZ, HUITA_DVA, HUITA_TRI, KOLICHESTVO_HUIT};
struct huita massiv[KOLICHESTVO_HUIT] = { … };
Inogda eto udobno.
Пример:
11111011B1
1111001111
1111101111
11A1111011
1111111111
Есть вот плоскость из клеток.
Есть Начальная координата A(x1,y1) и конечная B (x2,y2).
Нужно найти кратчайший путь от A до B и записать все x3,y3 по которым нужно идти в массив walk_x[index], walk_y[index]
Нахуя мне это нужно? Есть 2d MMO в ней уже есть A алогритм поиска пути, но он блядь ограничен всего 32 клеточками, и в зоне 32 клеток от персонажа я могу ходить нормально (алгоритм работает и я обхожу препятствия), но блядь это работает исключительно в зоне 32x32, а карты от 300х400 до 500х500, т.е. мне нужно научится преодолевать препятствия другими способами, либо если существует способ задействовать A алгоритм и разбивать как-то локацию на отдельные участки и чек-поинты по которым можно двигаться (от одного к другому) - то это было гуд.
В общем чуваки, мне нужны ГОТОВЫЕ примеры рабочих функций ЛЮБОГО алгоритма поиска пути и записи всех координат от точки A(x1,y1) до точки B(x2,y2) c обходом препятсвий.
К сожалению я нашел в других языках программирования всех алогритмы которые мне интересны Jump Point Seach, A, D, Lee Algorithm но я слишком тупой что бы их портировать под Си, да и знаний Си особых нет.
Если кто-то может запилить функцию которая принимает find_route(X1, Y1, X2, Y2) (где X1,Y1 = начало где стоит чел, и X2, Y2 куда нужно найти путь если существует и записать его в массив route_x[index] route_y[index] - было бы ахуенно.
====================
Дополнительные вопросы:
====================
Назовите пожалуйста оптимальные алгоритмы для поиска пути которые не жрут систему пиздец как при поиске пути на картах от 300x300 клеток до 500x500 (больше 500х500 возможности сделать карту нет). Лабиринты проходить не собираюсь, 80% карты можно посетить, 20% карты занимают различные препятствия (здания, объекты, и т.п. т.д.)
Накидайте годной инфы и желательно примеры, а еще было бы ахуенно если бы можно было получить функцию в которую скинул бы указатель на свои массивы матрицы карты где уже изначально обозначены все клеточки как проходимые или нет, и получить ответ - можно ли добежать до указанной координаты, или нет, и если можно - записать все клетки (x,y) по которым можно пробежать до точки B с точки А.
Пример:
11111011B1
1111001111
1111101111
11A1111011
1111111111
Есть вот плоскость из клеток.
Есть Начальная координата A(x1,y1) и конечная B (x2,y2).
Нужно найти кратчайший путь от A до B и записать все x3,y3 по которым нужно идти в массив walk_x[index], walk_y[index]
Нахуя мне это нужно? Есть 2d MMO в ней уже есть A алогритм поиска пути, но он блядь ограничен всего 32 клеточками, и в зоне 32 клеток от персонажа я могу ходить нормально (алгоритм работает и я обхожу препятствия), но блядь это работает исключительно в зоне 32x32, а карты от 300х400 до 500х500, т.е. мне нужно научится преодолевать препятствия другими способами, либо если существует способ задействовать A алгоритм и разбивать как-то локацию на отдельные участки и чек-поинты по которым можно двигаться (от одного к другому) - то это было гуд.
В общем чуваки, мне нужны ГОТОВЫЕ примеры рабочих функций ЛЮБОГО алгоритма поиска пути и записи всех координат от точки A(x1,y1) до точки B(x2,y2) c обходом препятсвий.
К сожалению я нашел в других языках программирования всех алогритмы которые мне интересны Jump Point Seach, A, D, Lee Algorithm но я слишком тупой что бы их портировать под Си, да и знаний Си особых нет.
Если кто-то может запилить функцию которая принимает find_route(X1, Y1, X2, Y2) (где X1,Y1 = начало где стоит чел, и X2, Y2 куда нужно найти путь если существует и записать его в массив route_x[index] route_y[index] - было бы ахуенно.
====================
Дополнительные вопросы:
====================
Назовите пожалуйста оптимальные алгоритмы для поиска пути которые не жрут систему пиздец как при поиске пути на картах от 300x300 клеток до 500x500 (больше 500х500 возможности сделать карту нет). Лабиринты проходить не собираюсь, 80% карты можно посетить, 20% карты занимают различные препятствия (здания, объекты, и т.п. т.д.)
Накидайте годной инфы и желательно примеры, а еще было бы ахуенно если бы можно было получить функцию в которую скинул бы указатель на свои массивы матрицы карты где уже изначально обозначены все клеточки как проходимые или нет, и получить ответ - можно ли добежать до указанной координаты, или нет, и если можно - записать все клетки (x,y) по которым можно пробежать до точки B с точки А.
Вот например, загуглил в гугле и нашел курсовик на плюсах:
http://www.twirpx.com/file/998973/
>Какие фильтры, ты о чем вообще
О grep, читать научись.
>вон, в PVS-Studio предлагают комментариями с аннотациями срать, чтобы fp подавить
Так большинство анализаторов требует. Тот же coverity. Кстати, PVS после coverity тонны реальных ошибок выловил.
>студия
visual c++ вообще никак в плане оптимизаций. До последней экспериментальной версии, где они наконец реализовали SSA (хотя, как мне кажется, просто сунули внутрь llvm)
> Так большинство анализаторов требует.
Что и требовалось доказать. Ты >>866030
> орально ублажаешь статический анализатор
или несколько разом. И нехуй тут про grep затирать. А знаешь, что будет потом? Потом кто-нибудь напишет еще один анализатор, и ты пойдешь расставлять новые комментарии в файликах, и удалять старые. Что угодно, только бы сразу не писать качественный код. Правильно было бы хранить подавленные предупреждения вместе с контекстом анализатора в отдельном файле, и чтобы статический анализатор знал о системе контроля версий (и желательно, чтобы не только о git). Вот тогда бы можно было включить в билд статический анализ на постоянной основе. Надеюсь, clang к этому придет когда-нибудь.
Короче, лалка. Не-систематических (вырезаемых grep-ом) false positive находится две с половиной штуки. И то, если внимательно присмотреться, оказывается, что как минимум одно "false positive" опирается на implementation-defined behavior
Я тебе сейчас не могу конкретных примеров из живого проекта привести, но я в свое время заебался читать логи. Алсо, если у тебя богатый опыт, может, напишешь для оппоста абзац со ссылками?
Опыт небогатый. Прогнал PVS, показал результаты ребяткам. Они сказали "ого, coverity пропустил много лажи" (в основном копипейст в логических операторах, одинаковое тело у if и else ветки, невозможные условия типа A > B && A <= B или
if (A) {
if (!A) {
do_something();
}
})
Короче, что этим анализатором обычно находится.
Что было из систематических false positive: ссылка очень хитро инициализировалась динамически выделяемой памятью, но завёрнуто это всё было так, как будто из функции возвращается ссылка на локальную переменную.
выход за границу массива не статическими анализаторами проверяется, ты путаешь
Если говорить о PVS-Studio, есть еще такая проблема, как русские разработчики, не умеющие в бизнесцена - она абсолютно неподъемная для небольших команд, а cppcat кончился.
> невозможные условия
Не вижу причин вообще это ловить. Оно чаще всего остается после всяких #ifdef DEBUG (иногда напрочь выпиленных до проверки, иногда выпиленных только препроцессором), и отлично вычищается любым, даже самым говенным оптимизирующим компилятором.
>>866246
> выход за границу массива не статическими анализаторами проверяется
Отлично проверяется в простых случаях:
char x[10]; for(size_t i = 0; i <= 10; i++) printf("%i\n", x);
Что говорит нам Visual Studio?
> bounds.c(4): warning C6201: Index '10' is out of valid index range '0' to '9' for possibly stack allocated buffer 'x'.
А вот в том случае, про который я говорил выше, оно как раз не должно было проверять, но проверяло и не осиливало осознать условие прекращение цикла. Сейчас потестил - на простом примере уже не ругается, но может еще что-то влияло.
Не осилил даже на уровне установки. Нашёл какой-то MinGW, установил, в меню "Пуск" есть только одна программа, которая вызывает консоль, а на рабочем столе появился ярлык для установки всякого говна. Успешен?
Запускаешь ту самую консолю из меню пуск. В консоле пишешь mingw-get --help и читаешь. Не помню, нужно ли ставить gcc, или оно уже есть если что, mingw-get install mingw32-gcc. Пишешь хелловорлд, говоришь cd /d полныйпутькпапкесхелловорлдом. Говоришь cc helloworld.c -o helloworld.exe пока читаешь K&R, можешь писать просто make helloworld, где helloworld - имя .c файла без расширения. Большего тебе знать пока не нужно.
Если не осилишь и это, поставь себе Code::Blocks, там есть версия со встроенным GCC - ставишь, пишешь хелловорлд, мышкой тыкаешь конпелировать, ни о чем нидумоешь.
Ты очень добрый. Я бы понял, если бы ты просто послал нахуй. Спасибо, но я уже всё удалил.
Но Code::Blocks действительно просто берёт и работает, спасибо большое.
switch(a):
case 0:
switch(b):
....
break;
case 1:
switch(b):
.....
break;
> Можно ли так?
Можно, в лимит стандарт гарантирует минимум 127 ты не упрешься точно. А вот читаться это будет хуево. Уверен, что нельзя по-другому? Что за код ты будешь выполнять в свитче?
Обработчик ошибок. 4 из 10 вариантов запускают функции, 2 из 10 принты, остальные 4 из 10 обнуляют необходимые переменные/счетчики/указатели.
>>866357
Ну у меня 2 выбора для этого. Или свитч внутри свитч или 10 if-ов. 1ая переменная из структуры 2 флага всего имеет USE; SLEEP; 2ая 5 флагов. Вот эти 10 вариантов флагов я сравниваю, для определения дальнейших действий. Все объявлено через enum. Я не спал уже 2ой день и возможно мой почерк будет маленько бредовый, а посты будут похожи на поток мыслей, заранее прошу прощения.
Сделай композитный флаг по формуле (значение флага один помноженное на количество возможных значений флага два плюс значение флага два) и гоняй свич по одному этому числу. И простейший макрос вида
#define CHOICE(flag1, flag2) ((flag1) * FLAG2_COUNT + (flag2))
Так я же только учусь. Нет, что бы наставить на путь или кинуть в меня книжкой. А тут сразу на хуй шлют, пичаль.
хакеры юзают dwm, который сами допиливают для получения нужно функциональности
Не слушай его, он бака
если ты не троль, то не слушай даунов которые тебе ответили. Программирование это не знание языка, это знание структур данных и алгоритмов. Ты же не буковки произносишь, а строишь из буковок слова, из слов предложения, из предложений - выстраиваешь мысль. Верно? Аналогично и в программировании. Только огромное количество "слов", и "предложений", уже изобретено до нас, и программистам необходимо лишь жонглировать существующими алгоритмами, структурами данных, и применять уже известные и проверенные на горьком опыте паттерны проектирования и т.п. ит .д.
Если ты хочешь быть мартышкой - будь, и учи Си и С++, и потрать хуеву тучу времени и сил, что бы делать то, что делают на других языках программирования уже во всем продвинутом мире за неделю, на что ты будешь тратить все свои самые драгоценные года. Лучше перекатись в python тред, он намного полезнее будет, чем любые начинания с Си. Си чрезвычайно сложный язык, которые требует чрезмерно повышенное внимание и огромный опыт для его использования для каких-то задач. К сожалению при изучении ты не сможешь ничего сделать более чем сортировочку чисел в массиве, либо нарисовать табличку, это не есть программирование.
говно это все. Спасибо за ссылку, но это не то.
Алгоритмы поиска пути мне известны, проблема с их реализацией на Си, на других языках программирования с этим особых проблем нет, но из-за различных очень строгих ограничений в Си многое не представляется возможным реализовать простым способом.
Синенавистник!
Я бы сделал битовую структуру, где хранил бы флаги и катался по ней в switch c использованием масок. Из плюсов вижу возможную детекцию множественных ошибок (если оно вообще нужно). Но тк я Сишечку только изучаю, я хз адекватное ли это решение.
#include <stdio.h>
#define MAXLINE 1000
int get_line(char line[], int MAXLINE);
...
Error:
string.c:2:17: error: expected ‘;’, ‘,’ or ‘)’ before numeric constant
#define MAXLINE 1000
^
string.c:4:31: note: in expansion of macro ‘MAXLINE’
int get_line(char line[], int MAXLINE);
chto ya delayu ne taq?
too lazy to switch language
Препроцессор заменяет первый токен, определенный в дефайне, на остальные. Т.е., MAXLINE на 1000. Ты пишешь:
int get_line(char line[], int 1000)
Что ты делаешь не так?
Я говорю в объявлении функции "бери вторым аргументом какую-то хуйню 1000 целочисленного типа"
Правильно?
И что это должно по-твоему значить? Функции принимают аргументы. Аргумент - это значение, передаваемое тем, кто вызывает эту функцию. Чтобы можно было узнать значение аргумента, у него должно быть имя. А что ты со своей тысячей можешь сделать без имени? #define отрабатывает до компиляции - препроцессор проходит по исходнику и заменяет все дефайны на их значения, поэтому компилятор слово MAXLINE вообще не увидит нигде.
У тебя может быть два варианта.
1) Зафиксировать максимальный размер массива и не передавать его. Ты делаешь (сделал) #define MAXLINE 1000, и внутри функции используешь MAXLINE в качестве лимита. Получается:
int get_line(char line[]) { ... }
и вызов
char buffer[MAXLINE];
get_line(buffer);
2) Ты можешь предоставить вызывающему решать насчет максимального размера. Тогда ты передаешь размер аргументом и используешь этот аргумент в качестве лимита.
int get_line(char line[], int length) { ... }
и вызов
char buffer[12345];
get_line(buffer, 12345);
Я понимаю, что препроцессор заменяет дефайны, этот код я перепечатал прямо из книги, а оно не компилируется, вот я и опупел слегка. Так то я уже заменил имя формального параметра в функции, все заработало
Поглядел книгу - у тебя либо ошибка распознавания, либо ты просто ошибся регистром (там maxline). Регистр в сишечке имеет значение. MAXLINE и maxline - абсолютно разные вещи.
Простые, упрощенные до жути примеры и несложные задачки. Хочешь сказать, у Праты совсем дрисня в задачах?
шли ноль, не прогадаешь
Стараюсь в таких случаях чередовать switch-case и if, иначе адская каша получается
Изучи архитектуры компьютеров(процессоров), машинную логику/арифметику, строение *nix, Win систем. На это придеться потратить ~3-4 годика, при необходимом рвении и желании можно уложиться и в 2. После этого любой язык программирования осилишь за пару месяцев. При этом паралельно будет изучение алгоритмов. И к 1-ому курсу будешь первоклассным программистом.
Снова я. Почему может не работать ctrl-d? С клавой все ок, но ввод програамки не воспринимает EOF
В Windows - Ctrl+Z. Еще не забудь о том, что ввод по умолчанию буферизированный, и буфер заполняется по Enter, т.е., нужно жать Ctrl+Z (или Ctrl+D в Linux) и потом Enter. Ну или пости код.
>switch(a):
>case 0:
>switch(b):
Очевидно, это составное, сложное условие. Либо переделывай на битовую маску, если кончено это возможно, либо переписывай все на if, ищи оптимальную конструкцию. Я считаю switch - зло, прочитать тяжело, всегда стараюсь if использовать, легче вычитывать каждую ветку логики.
>867047
>чередовать switch-case и if
Говнецо тоже.
Перезалей на рыгохост какой-нибудь.
Аноны, поясните нуфагу, что за йобу они тут рекламируют? Это софтина находит плохой код?
Выше тред поскролли, мы как раз обсуждали. Плохой код - субъективное понятие. Софтина находит код, который нарушает какие-то положения стандарта. И, что гораздо круче, она находит еще и тот код, который на основании каких-то признаков или исходя из логических выводов программы может содержать ошибки (а может и не содержать). PVS-Studio стоит овердохуя и не продается физическим лицам. Кроме нее существуют и другие тулзы для статического анализа (всякие cppcheck, Coverity и прочие линты), в статический анализ понемногу учатся сами компиляторы (Visual Studio и clang кое-как умеют, например). Но с PVS-Studio, конечно, все это не идет ни в какое сравнение.
>PVS-Studio стоит овердохуя и не продается физическим лицам.
а сколько стоит и почему не продается? если застартпупить свой анализатор, взлетит?
>а сколько стоит
Для всех по-разному. Где-то была приведена переписка с PVS-Studio, там цена была в районе 5k$ в год.
В принципе, это в примерно равно месячной зарплаты девелопера, так что не то чтобы очень дорого.
Взлетит. Если тебе удастся его написать, конечно же - там работы до опизденения.
пилю годноту. я любитель эс в частности clips и в сабжевой гуглагруппе пару лет назад появился чел, говорил, что их компания работает над проектом статического анализатора, задавал грамотные вопросы, фирма его в подписи светилась, вроде как с пиндостана. так вот, что в нормальных анализаторах крутится экспертная система, это для меня без сомнения, проблема в базе знаний. если бы можно было набрать паттерны ошибок как здесь http://www.viva64.com/en/w/ то создать анализатор более чем реально. но с другой стороны, анализаторов этих всяких дохуя и даже если застартпупить проектик, вероятность занять место под солнцем милипиздрическая.
Да похуй абсолютно на находимые ошибки, вась, просто посмотри на Coverity. Умеет примерно следующее: генерировать красивые отчёты с графиками, конвертировать их в пдфчики/доки и любые другие форматы и... всё. К чему я это: тут главное пиар и количество бабла в него вложенное, как и всегда в бизнесе.
тематика интеллектуального анализа текста мне интересна и запилить годноту поимев профит тоже и если бы запахло жирной котлетой, я бы макнулся.
Вангую, что пока ты пилишь свой, анализатор в clang уже будет допилен до приемлемого уровня.
>>867747
Это не про анализ текста если только ты не правила для cppcheck пилить собрался, лол. Это гораздо больше про компиляторы. Когда компилятор обрабатывает исходник, он анализирует код и применяет разные техники оптимизации (constant propagation, dead code elimination, например), чтобы сгенерить быстрый и/или короткий код. Сгенерив код, компилятор данные анализа выбрасывает, а статический анализатор, наоборот, использует подобные данные для поиска возможных проблем.
>Это не про анализ текста
как раз про то, просто кампутерные языки более примитивные и легче поддаются анализу.
> разные техники оптимизации
это то причем? как бонус анализаторы могут выдавать подсказки по оптимизации.
грубо говоря, нужно в соответствии с стандартом искать семантические ошибки.
if (a = 1) <- как банальный пример.
> if (a = 1) <- как банальный пример.
Фу. Давай лучше поговорим о if ((ptr = malloc(1000))) { ... }?
> > разные техники оптимизации
> это то причем?
При том, что техники используются те же. Если у тебя в коде:
point.x = 1;
point.x = 1;
то статический анализатор после преобразования кода в какую-нибудь SSA-форму находит лишнее присваивание, а потом подключает базу знаний, из которой извлекает вероятное описание проблемы (например, он может посмотреть, что в структуре кроме x есть только y и намекнуть на копипаст), а если не найдет совпадений в базе знаний - рассказывает только о присваивании. Но чтобы увидеть подобную проблему в:
buffer[0] = 1;
buffer[42 * (1 - sizeof(char))] = 1;
ему приходится выполнять те же самые оптимизации, что и компилятору.
Алсо, вот тебе пример того, как студия делает анализ, мне он очень нравится. По сути это false positive (этот конкретный код не содержит ошибок), но если вдуматься, то я должен был использовать do { ... } while.
>if ((ptr = malloc(1000))) { ... }?
давай, что здесь не так?
и я смысла в твоей простыне не понял, что анализатор и конпилятор в связке могут давать более пролуктивный анализ? вопрос не о деталях и плюшках, а о коммерческом потенциале.
> а о коммерческом потенциале.
Шел бы ты в /biz/, барыган, с таким подходом к вопросу. Из-за таких как ты, у которых на первом месте прибыль, а на втором все остальное, мир и катится в пизду.
> и я смысла в твоей простыне не понял
А я про анализ текста отвечал. Анализируется совсем не текст. И вообще это серьезная магия, без соответствующего опыта ты ничего адекватного не напишешь.
Нагугли какой-нибудь quick reference (тысячи их), а дальше юзай help и официальную документацию по необходимости http://sourceware.org/gdb/current/onlinedocs/gdb/
Приятное теплое распирание и щекотание при выполнении каждой инструкции.
Анон, у меня вопросы по сетям, возможно глупые: при каждом http-соединении программой-сервером создаётся файл-сокет, поскольку http работает поверх tcp?
И ещё: через TCP-сокет можно ответить http-пакетом, но это уже будет вроде как нарушение конвенции?
Как с этим соотносится то, что TCP-бинарный, HTTP-текстовый?
Простейший абстрактный TCP-сервер принимает данные и выводит их. То что они сразу выводятся не в бинарном виде-заслуга либы (<sys/socket.h>, etc)?
> при каждом http-соединении программой-сервером создаётся файл-сокет
Во-первых, не при каждом. В HTTP/1.1 есть такой Keep-Alive, когда после получения одного ресурса с сервера клиент может попросить другой, используя уже установленное соединение. Например, так всякие картиночки с двачей браузеру удобнее грузить. Во-вторых, файлом сокет быть не обязан (в винде у сокета по умолчанию нет файлового I/O). Но в целом, ты прав: создается TCP-сокет, подключается к серверу, отправляется запрос и читается ответ.
> И ещё: через TCP-сокет можно ответить http-пакетом, но это уже будет вроде как нарушение конвенции?
Не совсем понятный вопрос. И не совсем правильно говорить про HTTP "пакеты". Это поточный протокол поверх поточного же TCP, данные могут приходить разными порциями.
> Как с этим соотносится то, что TCP-бинарный, HTTP-текстовый?
Текст - не абстрактная хуйня в вакууме, это просто интерпретация последовательности байтов. В частности, в HTTP используется ASCII.
> То что они сразу выводятся не в бинарном виде-заслуга либы
Данные приходят байтиками, но если ты делаешь какой-нибудь printf, это значит, что ты интерпретируешь эти байтики как символы в кодировке ASCII (в ASCII нет преобразований - порядковый номер символа равен численному значению байта).
#define MAXLINE 1000
int main(int argc, char *argv[]) {
char line[MAXLINE];
int found = 0;
if(argc < 2) printf("используйте find для образца\n");
else
while(getline(line, MAXLINE))
if(strstr(line, argv[1]) != NULL){
printf("%s", line);
found++;
}
return found;
}
собственно когда я откомпилировал это и запускаю программу не о какой инициализации аргументов разговора быть не может в окне пишется первый принтф допустимто. ну я открыл просто командную строку и ввел там типо find -"eblo" -n "lo", ввёл всё еще раз по другому. проясните короче за эту хуйню.
ну воще за эти аргументы, как я например указываю количество параметров в argc.
поясни за написание драйверов и служб для линукс, насколько хорошо освещена эта тема, какие актуальные годы для книжек, что вообще стоит почитать? Сам я байтоёб, вроде неплохо уже пишу для STM32, но без фанатизма. Посмотрел курсы на степике, но у них задания и вопросы просто дичь какие кривые и нулевая база теории, один упор на практику: что куда подставить, какие команды мы будем сейчас использовать и прочее и прочее. Почитал зарубежные статьи, и чот как-то грустненько они идут, ничего толком непонятно, какие-то корки хуёрки. Материал подается так, что считается что ты должен знать основной материал а разбирают уже нюансы. Вообщем нид сам хелп фром анон хеар.
А по делу что сказать?
Что тебе пояснить? Программа берет командную строку:
> find -"eblo" -n "lo"
разбивает ее на куски по пробелам (куски в кавычках считаются одним целым, даже если внутри есть пробелы). Конкретные детали того, как парсится командная строка, зависят от ОС и/или стандартной библиотеки C. После того, как командная строка разобрана, создается argv, в него кладутся указатели на каждый кусок, а в argc общее количество указателей. А потом еще в argv[argc] кладется NULL.
Если у тебя программа с аргументами не запускается, удостоверься, что ты не ошибся директорией и именем (может, у тебя компилятор собирает какой-нибудь a.exe). В Windows есть команда find, поэтому если в текущей директории нет твоей find.exe, запустится системная команда. Алсо, практически во всех IDE можно указать командную строку для запуска, но в таком случае указывать имя самой программы (find) не нужно, только аргументы.
Спасибо, бро, добра тебе!
Если литература годная, может вообще стоит начать с "основ программирования для чайников"?
Изначально хотел начать с какой нибудь простой книги о основа C + конспекты лекций институтов по алгоритмам и систем данных, а после перейти на книгу с оп пика.
Начни с питона, нет начального гемороя как в Си, куча готового кода, всякие онлайн соревнования и задачи. Как наберешься навыков именно программирования, там уже будешь видеть дальнейший свой путь развития.
А не скажешь, что можно почитать/посмотреть по теме.
Читал Олиферов год назад-ничего не запомнил, Beejs Netwrk Programming нормально зашло.
Сейчас планирую UNIX Network Programming начать.
Можешь оценить свой навык создания unix приложений? Что читал, что зашло, как оно вообще.
>>868910 - анон
Я правильно понимаю, что питон просто будет для меня лучшим началом, так как более дружелюбен к мимокрокам?
И почему в этой пасте советуют книгу Dive into python, когда есть Укус питона, потому используют даже в НАСА!!11
Завтра ищешь в интернете книжку Dive into python. Похуй если ничего не поймешь. Затем идешь на python.org и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию питоньего кода - PEP8, чтобы от зубов отскакивало. Когда напишешь свою первую имиджборду, по пути изучив верстку на html+css, скачиваешь и изучаешь любой питоний асинхронный вебсервер, рекомендую Tornado или Gevent. Как переделаешь имиджборду, чтобы выдавала по крайней мере 5 тысяч запросов в секунду, можешь идти дальше - тебя ждет увлекательный мир хайлоада. Apache Hadoop, сверхбыстрые асинхронные key-value хранилища, MapReduce. Отсос хиккующих выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые сосут хуй по жизни не заставит себя ждать и уже через пол года ты будешь получать такие суммы, что любая баба будет течь при одном упоминании твоей зарплаты.
Да, правильно понимаешь.
Мне питон нравится тем, что в нём можно работать как в командной строке сразу.
Практически нулевой. Кроме того что выше-почти ничего не читал.
Только начинаю вкатываться в низкий уровень, а так пишу всякую сетевую и около-сетевую хуиту на питоне. Хочу глубоко врубиться во все, с чём работаю.
Читай UNIX Network programming, да. Не стесняйся писать мелкие программки, пока читаешь. Собери себе виртуальную сеточку из пары-тройки линуксов в VirtualBox если воткнуть какой-нибудь арчик без гуя, оно будет летать даже на совсем днищепк без аппаратной виртуализации и экспериментируй. Теория, не закрепленная практикой, быстро забывается, а если соберешь все грабли по пути, в голове точно что-нибудь останется.
Так и сделаю, добра тебе ещё раз!
Ты походу дела вообще не понимаешь о сетях.
Google: инкапсуляция модели OSI;
google: модель OSI
> удобно обнулять при инициализации да и места не жрут
struct { bool foo:1; bool bar:1; unsigned baz:4; } x = { 0 };
>битовые операции
ну и норм
>struct { bool foo:1; bool bar:1; unsigned baz:4; } x = { 0 }
уотаквот malloc(sizeof(YOBAStruct))
Да, как-то хуёво отложилось.
HTTP-пакет неявно включает в себя заголовки всех нижележащих уровней, ты на это намекаешь?
Ну ты же написал "структура" - кто тебе мешает динамически выделять структуры с битфилдами?
> кто тебе мешает динамически выделять структуры с битфилдам
никто, просто по району ходит слух, что битфилды не всегда кроссплатформенны и конпиляторозависимы.
> что битфилды не всегда кроссплатформенны
Чушь собачья. Разворачиваются в те же самые инструкции, что и логические операции. Ты, наверное, не до конца понял. На самом деле, проблема с битфилдами - интероперабельность. Если твой код будет писать битфилды в файл - ты обязательно их прочитаешь, а вот программа, собранная другим компилятором или под другую платформу - не обязательно - выравнивание и порядок битов в битфилде зависит от компилятора. То же, если битфилды будут торчать в API твоей библиотеки. Если ты соберешь либу одним компилятором, а пользовательский код будет собран другим - может случиться неприятность. Но в своем коде можно использовать битфилды без проблем.
Не пихай в char флаги. Там выше видео про undefined behavior, и там поясняют, что бывает за то, что ты вдвигаешь 1 в знаковый бит.
> выравнивание и порядок битов в битфилде зависит от компилятора
а мне нужно более менее предсказуемо да еще максимально кроссплатформенно, вот.
>что ты вдвигаешь 1 в знаковый бит.
на ладно, unsigned char. да и что будет? если никто мой байтик не тронет.
Все хотят тронуть твой байтик
> максимально кроссплатформенно
Макисмально кроссплатформенно парсить бинарные форматы побайтово. Иначе ты можешь напороться и на порядок байтов, и на количество бит в инте, и на выравнивание по умолчанию.
>>869339
> unsigned char
С unsigned ничего не будет, с unsigned все ок.
Я нуфаг, не обессудь.
> а без unsigned? поясни.
А без unsigned ты можешь сдвигать вправо только положительные числа. На самом деле, ты вряд ли будешь сдвигать влево именно сам char с флагами, так что я зря прицепился.
>сдвигать влево именно сам char с флагами
ну там очевидно будет два стула или shl или shr, вот и неопределенность.
shl/sal быстрофикс
Неопределенность там из-за наличия других архитектур, в том числе и еще не существующих. x86 все в порядке, просто порежутся биты слева. Между SHL и SAL вообще разницы нет.
Алсо, я тут подумал, и понял, что зря вообще прицепился. Прошу прощения. Именно с char в принципе все ок, ибо integer promotions до int во время вычислений.
Оба воткнут тот же самый бит в CF.
Не помню уже, но должны завершаться. Читай описание формата РЕ-файла, там всё написано.
Количество именованных экспортов лежит в IMAGE_EXPORT_DIRECTORY.NumberOfNames. Имена завершаются нулем.
Не норма. Если только ты не пишешь для древнего компилятора какого-нибудь, делай inline/always_inline и не выделывайся.
вот есть например три цикла подряд, отличающиеся количеством повторений:
c = 10;
while(c--) {
}
c = 20;
while(c--) {
}
c = 30;
while(c--) {
}
хочу тело цикла задефайнить, что в этом плохого? зачем инлайн функция?
А что нужно чтобы, бороду заслужить?
Кстати, надо через программку програнть весь мой говнокод на питоне
Сделай инлайн-функцию с циклом, принимающую количество повторений? Или обычную static функцию, компилятор сам разберется.
Запускаю его как с правами администратора, так и без. Запись в реестре не появляется.
GetLastError и прочая диагностика где? 64-битная ОС и 32-битное приложение? В HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run смотрел?
>64-битная ОС и 32-битное приложение?
Да, так и есть.
>В HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run смотрел?
Нет, что это за ветка? Завтра посмотрю, батарея разряжена
64-битная винда частично редиректит доступ к реестру от 32-битных приложений в отдельную ветку из-за проблем совместимости. Например, чтобы ты случайно не прочитал имя 64-битной дллки какой-нибудь и не плакал, что не получается ее загрузить.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384232(v=vs.85).aspx
И как происходит запуск из той ветки? Почему моя программа не запускается при загрузке системы? Или из той ветки вообще не работает запуск?
Нормально происходит. Посмотри для начала, пишется ли. Может, ты все же не под админом запускаешь?
Анон, как мне сменить язык с С++ на просто С, я ультраньфаня
gets() официально выпилена из стандарта, пользуйся fgets(). Остальные предупреждения отключаются втыканием #define _CRT_SECURE_NO_WARNINGS (или в старых версиях #define _CRT_SECURE_NO_DEPRECATE 1) в самое начало исходника (перед всеми инклудами). Или при компиляции из командной строки -D_CRT_SECUREблаблабла. Или через GUI (пикрелейтед) ошибки превращаются в варнинги. В любом случае, внимания обращать на это не стоит, пользоваться функциями с _s не стоит тем более.
> где можно почитать про создание собственного представления int-ов
В википедии в статье "длинная арифметика". Узнаешь про Карацубу, посмотришь быстрое возведение в степень. Сложение и вычитание в столбик, как в школе (если сумма меньше любого слагаемого, значит был перенос). Хранить лучше в виде структурки с массивом каких-нибудь uint_fast32_t, битность этих самых fast посчитаешь. А вообще, мы уже в новый тред перекатились, сюда вряд ли многие заглядывают.
Как и чем этот говнокод можно покрыть тестами? Есть ли тут те, кто покрывают Си код тестами? Чем пользуетесь, как тестируете, что почитать, что изучить? Короче любой фидбек будет только на пользу.
Подскажите как сложить два массива.
Это копия, сохраненная 23 ноября 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.