Мне нужно изменить проект с открытым исходным кодом, чтобы предотвратить повторное использование кода (более эффективно только для создания функции GetGameRulesPtr(), чем для того, чтобы продолжать работать с этим движком. Проблема в том, что он хранится как void ** g_pGameRules. Я никогда не понимал концепцию указателя на указатель, и я немного смущен.Как сделать функцию геттера для двойного указателя?
Я создаю функцию GetGameRules() для извлечения этого указателя, но я не уверен, что моя функция getter должна быть недействительной * ret введите, а затем верните * g_pGameRules или как именно я должен идти по этому вопросу.Я фактически чистил на использование моего указателя сейчас, но хотел узнать правильный метод для изучения.
Вот код, строки 58- 89 - это функция SDK, которая возвращает g_pGame Указатель правил из игрового движка. Другие функции - это то, к чему я добавляю функцию getter.
// extension.cpp
class SDKTools_API : public ISDKTools
{
public:
virtual const char *GetInterfaceName()
{
return SMINTERFACE_SDKTOOLS_NAME;
}
virtual unsigned int GetInterfaceVersion()
{
return SMINTERFACE_SDKTOOLS_VERSION;
}
virtual IServer *GetIServer()
{
return iserver;
}
virtual void *GetGameRules()
{
return *g_pGameRules;
}
} g_SDKTools_API;
// extension.h
namespace SourceMod
{
/**
* @brief SDKTools API.
*/
class ISDKTools : public SMInterface
{
public:
virtual const char *GetInterfaceName() = 0;
virtual unsigned int GetInterfaceVersion() = 0;
public:
/**
* @brief Returns a pointer to IServer if one was found.
*
* @return IServer pointer, or NULL if SDKTools was unable to find one.
*/
virtual IServer* GetIServer() = 0;
/**
* @brief Returns a pointer to GameRules if one was found.
*
* @return GameRules pointer, or NULL if SDKTools was unable to find one.
*/
virtual void* GetGameRules() = 0;
};
}
// vglobals.cpp
void **g_pGameRules = NULL;
void *g_EntList = NULL;
void InitializeValveGlobals()
{
g_EntList = gamehelpers->GetGlobalEntityList();
char *addr;
#ifdef PLATFORM_WINDOWS
/* g_pGameRules */
if (!g_pGameConf->GetMemSig("CreateGameRulesObject", (void **)&addr) || !addr)
{
return;
}
int offset;
if (!g_pGameConf->GetOffset("g_pGameRules", &offset) || !offset)
{
return;
}
g_pGameRules = *reinterpret_cast<void ***>(addr + offset);
#elif defined PLATFORM_LINUX || defined PLATFORM_APPLE
/* g_pGameRules */
if (!g_pGameConf->GetMemSig("g_pGameRules", (void **)&addr) || !addr)
{
return;
}
g_pGameRules = reinterpret_cast<void **>(addr);
#endif
}
Почему бы не включить код как часть вопроса, чтобы когда-либо все, что исчезло в палитре дня, код сохраняется как запись для кого-то другого, который находит этот вопрос? – Flexo
Простите, я подумал, что выбрал вариант, чтобы ampaste никогда не удалял мой пост, но похоже, что я нажал на месяц. –