Другое С/С++ Вопрос - Ответ

Gunborg Johansson

Потрачен
32
21
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

dekname

Участник
44
2
Можно как-то использовать shared_ptr с sampapi::v037r1::CChat? Пытался вызывать, но ничего не приходит в чат.
C++:
std::shared_ptr<sampapi::v037r1::CChat> m_chat
 

memir

🇷🇺
Всефорумный модератор
333
599
Можно как-то использовать shared_ptr с sampapi::v037r1::CChat? Пытался вызывать, но ничего не приходит в чат.
C++:
std::shared_ptr<sampapi::v037r1::CChat> m_chat
там не нужен умный указатель, CChat принадлежит игре и если ты его случайно освободишь то всё сломается
 

LuaQ

Участник
84
27
Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,637
2,487
И иногда компилятор его опускает
кого опускает? кто он такой чтобы опускать? какое у него право?
Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
 
  • Нравится
Реакции: LuaQ

dekname

Участник
44
2
Как можно сделать функцию, которая находится в классе, коллбэком для cmdproc? (samp-api)
 

dekname

Участник
44
2
Без static'a же тоже можно сделать callback. Получить адрес через union и дописать this на текущий класс (thunk). Например так:

C++:
// union
union UnionCallbackCommand
{
    using ptr_t = void(SomeClass::*)(const char*);
    ptr_t ptr;
    uint64_t addr_as_uint64;
};

// получение адреса

m_union_cmd_callback.ptr = &SomeClass::Command;

// в private:

UnionCallbackCommand m_union_cmd_callback;

// регистрация команды:

m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_union_cmd_callback.addr_as_uint64);

// сам callback

void SomeClass::Command(const char* cmd)
{

}

Но так я получаю зависание игры, как можно пофиксить?
 

memir

🇷🇺
Всефорумный модератор
333
599
Без static'a же тоже можно сделать callback. Получить адрес через union и дописать this на текущий класс (thunk). Например так:

C++:
// union
union UnionCallbackCommand
{
    using ptr_t = void(SomeClass::*)(const char*);
    ptr_t ptr;
    uint64_t addr_as_uint64;
};

// получение адреса

m_union_cmd_callback.ptr = &SomeClass::Command;

// в private:

UnionCallbackCommand m_union_cmd_callback;

// регистрация команды:

m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_union_cmd_callback.addr_as_uint64);

// сам callback

void SomeClass::Command(const char* cmd)
{

}

Но так я получаю зависание игры, как можно пофиксить?
Действительно, делай static
Ебани __cdecl метод, дальше в тханке пушь указатель на свой объект, делай call на обработчик, затем вытаскивай запушеные четыре байта, ретайся (первым аргументом в обработчике придется сделать адрес возврата).
 
  • Нравится
Реакции: dekname