【问题标题】:Following Structures In Memory Using C and Cpp使用 C 和 Cpp 跟踪内存中的结构
【发布时间】:2014-03-22 00:22:50
【问题描述】:

头文件中有很多结构。我正在想办法巩固它们。我知道必须有更好的方法来访问这些指针。我使用了一个名为 reclass 的程序;它所做的是基于指针和用户选择的其他数据类型创建结构。您将这些结构放入源代码中并使用它们。但是因为我的程序现在如此庞大。结构的布局方式。这让我很头疼。

这是我所拥有的(版本号示例):

class Level1ToVersionNumer
{
    public:
        char _0x0000[8];
            char VersionNumber[12]; //0x0008 
        char _0x0014[44];
};//Size=0x0040

class Level0ToVersionNumber
{
    public:
    char _0x0000[20];
        Level1ToVersionNumer* Level1PointerToVersionNumber; //0x0014 
    char _0x0018[40];
};//Size=0x0040

class BaseObjectWorld
{
    public:
        char _0x0000[32];
            Level0ToVersionNumber* Level0PointerToVersionNumber; //0x0020 
        char _0x0024[1844];
            ObjectTable* ObjectTablePtr; //0x0758 
        char _0x0748[760];
            LocalPlayerLevel0* LocalPlayerLevel0Ptr; //0x0A54 
        char _0x0A44[1348];
            NearLootTable* NearLootTablePtr; //0x0F88 
            volatile __int32 SizeOfNearLootTable; //0x0F8C 
        char _0x0F90[160];
            FarLootTable* FarLootTablePtr; //0x1030 
            __int32 SizeOfFarLootTable; //0x1034    
};//Size=0x1840

你可以看到Level0ToVersionNumber类里面有20个字节的填充。

Level1ToVersionNumber 里面有 8 个字节的填充。

我目前通过以下方式访问这些结构:

g_pArmaMain->BaseObectWorld->Level0PointerToVersionNumber->Level1PointerToVersionNumber->VersionNumber;

如您所见,这是 4 层结构。好吧,我的一些代码有 15 到 20 个结构深。我知道必须有更好的方法来设置它。这不是唯一的方法。

有谁知道如何使用多级指针或其他一些创造性的方式来缩小/合并类?

当我不得不做这样的事情时,这很荒谬:

if( !( g_pArmaMain->BaseObjectWorld->ObjectTablePtr->ObjectTableArrayPtr->ObjectTableArrayElement[i].element->EntityPtr->EntityPlus70->EntityPlus70Plus40->ObjectNamePtr <= 0 ) && !( g_pArmaMain->BaseObjectWorld->ObjectTablePtr->ObjectTableArrayPtr->ObjectTableArrayElement[i].element->EntityPtr->EntityPlus70->EntityPlus70Plus40->ObjectNamePtr->lengthOfEntName <= 0 ) )

它有效,但它只是讨厌讨厌讨厌......

感谢您的帮助。

【问题讨论】:

  • 为什么是C++的时候标记为C?
  • 因为 asm / c / c++ 都是同一种语言。 c 板上的某个人可能有我的答案
  • 汇编程序、C 和 C++ 是三种截然不同的语言。

标签: c++ class subclassing dll-injection


【解决方案1】:

首先,C 和 C++ 绝对不是同一种语言。举个简单的例子,你的代码不会编译为 C,因为 C 中没有 class 这样的东西,也没有内存保护,所以 public/protected/private 说明符也不存在。

除了 C++ 具有附加功能之外,还有很多不同之处。它甚至不是 C 的严格超集。但是,如果您好奇,我会在这里放下我的肥皂盒,让您阅读:more info


对于你的问题,你的代码没有提供很多关于它试图完成什么任务的信息,所以我无法提供具体的建议。不过,我可以提供一些一般性的想法和方法来解决这个问题:

首先,在代码块中引用了许多嵌套数据结构,这表明该函数正在尝试做的事情超出了应有的范围。根据经验,你应该努力将你的任务分解成小的、实用的部分;编写小的、专门的函数来做简单的事情,然后使用这些函数作为构建块来完成更大的任务。

我的第二个想法是在你的类中定义方法。例如,如果您需要从 BaseObjectWorld 对象中获取版本信息,您可以编写方法:

char* BaseObjectWorld::getVersion() { ... };

遍历 BaseObjectWorld 成员层次结构并返回对象的版本信息。

如果您宁愿坚持使用 C 风格的编码,您需要将这些 class 定义转换为 struct 定义,然后对函数执行类似的方法:

char* get_version(struct BaseObjectWorld* instance) { ... };

我最后要看的是某些结构是否真的需要是不同的结构。如果没有将 Level1ToVersionNumber 对象与 Level0ToVersionNumber 对象分开实例化的情况,则可以将它们滚动到单个对象中,依此类推。关键是要考虑“对于这项任务,我最小的功能构建块是什么?”然后定义你的对象来匹配那些。

希望这会有所帮助。干杯:)

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2010-10-28
    • 2016-02-08
    • 1970-01-01
    • 2011-02-19
    • 2012-11-09
    • 2021-03-23
    相关资源
    最近更新 更多