Сообщество - Лига программистов C/C++
Добавить пост

Лига программистов C/C++

63 поста 4 765 подписчиков

Популярные теги в сообществе:

Пишем чит для Counter-Strike или как работать с памятью в C++

Сёркииис! Сегодня затронем почти не обсуждаемую тему в рунете - как написать чит на C++. Я не призываю вас писать читы для игр, эту тему я затрагиваю лишь в познавательных целях.

Вчера мне предложили написать чит для игры, опыта в этом у меня конечно нет, но из любопытства я сразу же "побежал" читать забугорные сайты на эту тему, так в итоге я написал свой "чит" для накрутки денег в CS 1.6:


Идея такая, ищем процесс с игрой, заходим в его память и меняем нужные нам данные. Как можно заметить, я явно указываю адрес в памяти, который хранит деньги, чтобы сэкономить вам время чтения этого поста (кому интересно, здесь можно посмотреть, как перебирать ячейки памяти процесса). Весь код прокомментирован и думаю, у вас не должно быть проблем с его понимаем, ведь в C++ невероятно удобно работать с памятью.

Мой телеграм-канал: @itpods

Пишем чит для Counter-Strike или как работать с памятью в C++ Читы, C++, Программирование, Видео
Показать полностью 1 1

Попытка в программирование С++

Решил как-то раз попробовать в это ваше С и С++ программирование для начинающих. В принципе выглядит неплохо, хотя создателям языка предстоит еще много сделать для его усовершенствования. К примеру в Дельфи есть такое понятие, как property - свойства по нашему. Нечто на подобии можно сделать и в С++ .


class MyTest
{
...
private:
// приватный член класса
int m_member; 
public:
// константная ссылка на приватный член - публичный доступ только на чтение
const int & Member = m_member; 
void SetMember( int var) { };
...
}

Ну и с помощью препроцессора автоматизировать эту конструкцию


// Property
#define _PROPERTY_(TYPE, MEMBER, PROP_NAME)\
protected: \
TYPE MEMBER;\
public:\
const TYPE & PROP_NAME = MEMBER;\
void Set ## PROP_NAME (TYPE _v) { MEMBER = _v; };

Применение выглядит так:

class MyTest
{
...
_PROPERTY_( int,  m_member,  Member );
_PROPERTY_( bool, m_isvisible,  IsVisible );

_PROPERTY_( long, m_flag,  Flag );

...

}

PS:  Наверное это потребует применение стандарта С++11

Показать полностью

Разработка игры Пазлы на С++ для Android

Кончается лето, а в месте с тем — и прекрасная возможность для самообразования. Тысячи студентов мечтают научиться программировать под Android, при этом, многие из них знакомы с языком С++ и библиотекой Qt. Значит — вы возможно уже все умеете, но не «делаете это».


Библиотека Qt с давних пор позволяет разрабатывать приложения для Android на С++. Однако, при этом у вас обязательно возникнут проблемы — стандартные элементы интерфейса на телефонах будут выглядеть ужасно, вам придётся разрабатывать свои собственные или найти готовые.


В статье по ссылке описаны наиболее интересные моменты разработки классической игры «Пазлы»: https://pro-prof.com/archives/5795.


Бесплатная, совсем без рекламы, доступна для загрузки из Google Play: https://play.google.com/store/apps/details?id=org.qtproject....


Конечно, исходный код открыт: https://bitbucket.org/rrrfer-admin/simple_android_puzzle/src...


Компоненты, использование которых должно помочь вам выпустить своё приложение для Android быстрее выделены в отдельную статью: https://pro-prof.com/archives/4636#Qt_gamedev


При проектировании Пазлов, мне показалось возможным применение шаблона проектирования Декоратор. В статье описано почему это не получилось и о чем нужно задуматься если Вам тоже кажется подходящим этот паттерн.


Непосредственно о пазлах, в статье написано: «как нарисовать фигурные контуры?» (пазлы резные) и «как вырезать фигурный фрагмент изображения?». Я описал лишь эти аспекты, т. к. они могут пригодиться и в других ваших приложениях.


PS. Очень прошу протестировать игрушку и, при возникновении проблем, - описать их в комментариях к статьи или отзывах на Google Play.

Разработка игры Пазлы на С++ для Android Qt, Android разработка, Программирование, Длиннопост
Показать полностью 1

Ошибка

Сейчас пишу программу. И столкнулся с этим:

Ошибка Быдлокодинг, Восстание машин

Это весьма забавно, если ещё учесть тот факт, что все работает так как надо!

То есть программа работает, но ей что-то в этой жизни не нравится, вот только что, она сама пока еще не знает... Машины потихоньку превращаются в людей!

P.S. С ошибкой разобрался, но ситуация прикольная!

Показать полностью 1

Как искать работу джуном c++?

Собственно, сабж. Ищу советов и дельных комментариев к ситуации.

Итак.

Некоторое время назад решил сменить сферу деятельности и перейти в IT, благо, небольшой багаж был. В процессе просмотра вакансий и разъездов по интервью выяснил, кто непосредственно позиций для джунов нигде нет. Под джуновским уровнем я понимаю учебник Прата + Программирование Под Win95 + Программирование на С++ для профессионалов + всякие базы вроде алгоритмов и с.д. Везде требуется дополнительный стек, и часто уникальный (от подразделов буста, до всячески рестов и т.д.)

Что в таком случае делать? Есть ли стратегия прокачки?

И вообще - актуально ли сейчас искать по c++? Или лучше уж переходить на java?

Спасибо.

Реализуем числа Фибоначчи на Си, по простому о сложном...               Машинное Обучение.

Внимание: Видео на английском языке, но изъяснения вполне понятны и ясны.

Начинаем с простых правил и заканчиваем более сложными моментами.

Используем low-level возможности языка C

Итак, у нас есть какая-то задачка. Качество решения определяется временем выполнения: меньше - лучше. В первую очередь нам нужен рациональный алгоритм, но не только. Процесс работы программы зачастую сильно затягивается из-за "узких мест". Типичный случай - простой процессора в ожидании результата обращения к памяти. С этим можно бороться по следующей аналогии.


Представьте, что вы делаете ручную работу, сидя за просторным деревянным столом. Инструменты и материалы разложены по полкам в шкафу в 3-х метрах от вас. Если всякий раз выкладывать ту или иную вещь из рук на полку и брать с полки, большая часть времени уйдет на хождение от стула к шкафу и обратно. Умный человек довольно скоро додумается разместить активно используемые инструменты прямо на столе, чтоб они были под рукой.


Вернемся к компьютеру. В компьютере, по грубой аналогии, роль стола играет процессор, роль шкафа - оперативная память, а жесткий диск, который нас, впрочем, не интересует, представляет большой склад в отдаленном помещении. Нас интересуют регистры - это такая штука в процессоре, которая в нашем случае играет роль места "под рукой" для размещения активно используемых вещей, в т.ч. и тех, что обрабатываются в текущий момент. Не буду вдаваться в подробности, какое особое назначение у RAX, RBX, RCX, RDX, RSI, RDI.. Скажу лишь, что они всегда используются, в худшем случае (тупой компилятор) только для счетчика комманд, указателя стека и прочих технически важных вещей, а также для передачи некоторых аргументов функции, возвращаемого значения функции и для переменных, над которыми идет операция в текущий момент, после чего каждый раз производится перезапись в память. На языке высокого уровня этого не видно, видны лишь имена переменных, а реальный (машинный) код создается компилятором. Assembly же, где соотношение того, что вы пишете, и того, что получится - один к одному, отпускает полный контроль под ваши руки.


Перейдем к делу. Возьмем простенький итерационный алгоритм нахождения n-го числа Фибоначчи.

Используем low-level возможности языка C C++, Программирование, Длиннопост

Если запустить цикл while на несколько миллирадов итераций, такое количество обращений к памяти (f,f1,f2) займет немало времени. Можно написать функцию fibo(n) на ASM.

Используем low-level возможности языка C C++, Программирование, Длиннопост

Но подобная экзотика не всем по вкусу. К счастью, такая прекрасная вещь, как C/++, позволяет во многих случаях обходиться и без Assembly. Можно "попросить" компилятор держать, по возможности, те или иные переменные по возможности держал в регистрах. Делается это очень просто: перед объявлением переменной пишется ключевое слово register.

Используем low-level возможности языка C C++, Программирование, Длиннопост

Но надо еще все протестировать. Запустим это дело на 4 миллиарда. С такими входными данными, разумеется, ни о каком корректном результате речи не идет, но главное, чтоб не вылетало (благо не Java, под 64 бита срежет и промолчит) и чтоб обе memslow и regfast дали одинаковый результат, этого более чем достаточно для честной проверки быстродействия.

Используем low-level возможности языка C C++, Программирование, Длиннопост

Скриншот говорит сам за себя. 5-кратная разница в результате. А вот разница в причине такого результата.

Используем low-level возможности языка C C++, Программирование, Длиннопост

Выделена та часть, где вводятся f, f1, f2.

Используем low-level возможности языка C C++, Программирование, Длиннопост

Первое - медленный вариант, последнее - быстрый. Обратите внимание, что в последнем случае за весь цикл (все что между jmp и jne) - ни разу не обращаемся к памяти.


Ассемблерную часть изложенной инфы не обязательно всем понимать, достаточно было узнать про register-фичу языка C. Не вижу смысла расписывать ASM, кто шарит тот шарит, а кто не шарит, но хочет, тому могу посоветовать хорошую книжку PC Assembly Language чувака по имени Paul A. Carter (ссылку оставлю в комментах).


Сомневаюсь, что будут плюсы, поскольку не занимаюсь регулярно постами на какую-либо тематику, и вообще сам учусь, но чувствую необходимость где-то это зафиксировать, чтоб хоть сокурснику в удобном виде (ссылка Pikabu) кинуть. Грубо говоря, воспользовался сайтом в качестве удобного средства оформления информации с такими ништяками, как картинки и хранение в сети. Да простят меня за это.


Гавнокод мой - тег моё.

Показать полностью 6

Корректно или нет?

интересуюсь плюсами довольно давно... вообщем преамбулу отбросим,

нашёл баг еще в начале года в VS2017 (15.6.х) компилере (пофиксили буквально неделю назад в обнове 15.7.1)

баг в том что если есть например родительский класс с парой мемберов(неважно сколько и каких) и конструктором принимающим допустим 2 аргумента, то если с дочернего класса из constructor member initializer попытаться вызвать этот конструктор юниформно и не с 2мя аргументами а например с тремя, то есть derived() : base{1,2,3}{} то студийный компилер это спокойно хавал (в отличии от gcc и clang, и даже родного IntelliSense,который это место считал ошибочным), и на выходе получалось что базовый класс не проинициализирован а в дочернем всё ок. но это ладно, пофиксили и хорошо, просто

тут еще одна фантазия возникла:


#pragma pack(1)

struct _jGate

{

// due to initializers, added implicit ctor and called on creation

const unsigned char j_code = 0xEE;

unsigned int j_address;

const unsigned short int j_segment = 0x0033;

};

#pragma pack()


...

jGate stub{ 1}; // sets j_code member to 1, which is initially const.! Clang & gcc does same

// stub.j_code = 0xee; // error C3892: 'stub': you cannot assign to a variable that is const


тут вот вопрос, а вообще логично ли инициализировать константный мембер если у него уже в определении структуры есть инициализатор? (это  я вообще юниформной инициализаций заморочился)

(пс код и комменты писать по русски не могу - глаза режет)

Показать полностью
Отличная работа, все прочитано!