Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C和Cpp在内存中跟踪结构_C++_Class_Subclassing_Dll Injection - Fatal编程技术网

C++ 使用C和Cpp在内存中跟踪结构

C++ 使用C和Cpp在内存中跟踪结构,c++,class,subclassing,dll-injection,C++,Class,Subclassing,Dll Injection,我在头文件中有很多结构。我在想办法巩固他们。我知道必须有更好的方法来访问这些指针。我使用了一个名为reclass的程序;它所做的是基于指针和用户选择的其他数据类型创建结构。将这些结构放入源代码并使用它们。但是现在我的计划太大了。结构布局的方式。它使我头痛 以下是我所拥有的(版本号示例): 您可以看到在类Level0ToVersionNumber中有20个字节的填充 在Level1OversionNumber内部有8个字节的填充 我目前正在通过以下方式访问这些结构: g_pArmaMain->

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

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

您可以看到在类Level0ToVersionNumber中有20个字节的填充

在Level1OversionNumber内部有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 ) )

if(!(g_pArmaMain->BaseObjectWorld->ObjectTablePtr->ObjectTableArrayPtr->ObjectTableArrayElement[i]。元素->EntityPtr->EntityPlus70->EntityPlus70Plus40->ObjectNamePtr BaseObjectWorld->ObjectTablePtr->ObjectTableArrayElement[i]元素> > EntultPLUSS70-> EntIpPLUSS70PLUES40-> ObjnNePtRe>LothFoTrNeNt> P>首先,C和C++绝对是“强>不<强”同一语言。作为一个简单的例子,您的代码将不会被编译成C,因为C中没有“代码>类< /代码>,而且没有内存保护,所以<代码>公共/保护/私有< /C。ode>说明符也不存在

除了C++有很多额外的特性外,还有很多不同之处。它甚至不是C的严格超集。但是,我会从这里打开我的SOAP框,让你在好奇的时候读起来:


对于您的问题,您的代码没有提供有关其试图完成的任务的大量信息,因此我无法提供具体建议。不过,我可以提供一些解决此问题的一般思路和方法:

首先,在代码块中引用大量嵌套数据结构对我来说意味着函数正在尝试做更多的事情。根据经验,您应该努力将任务分解为小的、功能性的部分;编写完成简单任务的小的、专门化的函数,然后将这些函数用作构建块我们要完成更大的任务

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

char* BaseObjectWorld::getVersion() { ... };
它遍历BaseObjectWorld成员层次结构并返回对象的版本信息

如果您更愿意使用C风格的编码,您将希望将这些
class
定义转换为
struct
定义,然后对函数执行类似的方法:

char* get_version(struct BaseObjectWorld* instance) { ... };
我要看的最后一件事是,某些结构是否确实需要是不同的结构。如果不存在将Level1OversionNumber对象与Level0OversionNumber对象分开实例化的情况,那么您可能能够将它们滚动到单个对象中,依此类推。关键是要考虑“此任务的最小功能构建块是什么?”然后定义与之匹配的对象


“希望这有帮助。欢呼:”/p>为什么当C++时标记为C?因为ASM/C/C++是完全相同的语言。C板上的某人可能有我的应答器汇编程序,C和C++是三种完全不同的语言。
char* get_version(struct BaseObjectWorld* instance) { ... };