使用C转换方法将数据读入结构时出现问题 我在C++中写了一个Md3模型装入程序,我理解文件格式和我需要做的,但是我不能把语法弄对。我有一个模型类,在该类中有一组结构,将模型数据读入其中。在类的实现中,有一个构造函数,当使用MD3文件初始化时,该构造函数将读取数据。我使用C风格的铸造来做这件事。第一个结构似乎正在工作,数据似乎被正确读取,但下面两个结构似乎将所有值都保留为零,这不应该是这种情况。代码编译时没有错误,但我对C++是相当新的,所以我可能在这里犯了一个简单的错误!p>
主文件只是用一个MD3文件设置对象,然后继续设置一些OpenGL的东西,但这些都正常工作,不会影响构造函数 界面:GameObject.h使用C转换方法将数据读入结构时出现问题 我在C++中写了一个Md3模型装入程序,我理解文件格式和我需要做的,但是我不能把语法弄对。我有一个模型类,在该类中有一组结构,将模型数据读入其中。在类的实现中,有一个构造函数,当使用MD3文件初始化时,该构造函数将读取数据。我使用C风格的铸造来做这件事。第一个结构似乎正在工作,数据似乎被正确读取,但下面两个结构似乎将所有值都保留为零,这不应该是这种情况。代码编译时没有错误,但我对C++是相当新的,所以我可能在这里犯了一个简单的错误!p>,c++,casting,struct,C++,Casting,Struct,主文件只是用一个MD3文件设置对象,然后继续设置一些OpenGL的东西,但这些都正常工作,不会影响构造函数 界面:GameObject.h class GameObject1 { public: GameObject1(); GameObject1(const char * filename); virtual ~GameObject1(); virtual void Draw(); private: struct md3_header_t { int IDENT;
class GameObject1 {
public:
GameObject1();
GameObject1(const char * filename);
virtual ~GameObject1();
virtual void Draw();
private:
struct md3_header_t
{
int IDENT; //id of file, always "IDP3"
int Version; //version number, always 15
char Name[64]; //name of character
int Flags; //blank but needed
int Num_frames; //number of Frames
int Num_surfaces; // number of shaders
int Num_skins; //...
int Num_triangles; //num triangles - important one
int Ofs_triangles; // offset of triangles
int Ofs_frames; // frames offset
int Ofs_tags; // tags offset
int Ofs_surfaces; //offset to surfaces
int Ofs_eof; //offset of end of header
};
typedef float vec3[3];
struct md3_frame_header_t
{
vec3 Min_bounds; //first corner of bounding box
vec3 Max_bounds; //other corner
vec3 local_origin; //usually 0 0 0
float Radius; //radius of bounding sphere
char NAME[16]; // name of frame
};
struct md3_tag_header_t
{
char NAME[64]; //name of tag
vec3 origin; //origin of tag eg head or torso
vec3 Axis[3]; //axis stuff
};
struct md3_surface_header_t
{
int IDENT; //id, must be IDP3
char Name[64]; //name of mesh
int Flags; // blank space
int Num_frames; // number of frames
int Num_shaders; // no shaders
int Num_vert; // number verts
int Num_triangles; //number of triangles
int Ofs_triangles; //offset of triangle data from surface start
int Ofs_shaders; // offset of shaders
int Ofs_st; // offset texture data
int Ofs_xyznormal; // offset of verts
int Ofs_end; // offset of end of surface section from start
};
和接口GameObect.cpp,注意我在这里只包括构造函数方法,因为析构函数和draw方法当前都是空的:
#include "GameObject1.h"
GameObject1::GameObject1() {
//if we have no model...
}
//constructor if a model has been provided
GameObject1::GameObject1(const char * filename) {
ifstream md3file;
md3file.open(filename, ios::in|ios::binary);
// C stuff
md3_header_t * md3header = (struct md3_header_t *)
malloc(sizeof(struct md3_header_t));
md3file.read((char *) md3header, sizeof (struct md3_header_t));
// Check the file
if (md3header->IDENT != 860898377) {
// Error!
cerr << "Error: bad version or identifier" << endl;
}
// seekg to search through the file to add new data to structs
// frame struct
md3_frame_header_t * md3frame = (struct md3_frame_header_t *)
malloc(sizeof(struct md3_frame_header_t));
md3file.seekg(md3header->Ofs_frames);
md3file.read((char *) md3frame, sizeof (struct md3_frame_header_t));
//surface struct
md3_surface_header_t * md3surface = (struct md3_surface_header_t *)
malloc(sizeof( md3_surface_header_t));
md3file.seekg(md3header->Ofs_surfaces);
md3file.read((char *) md3surface, sizeof (struct md3_surface_header_t));
md3file.close();
}
GameObject1::~GameObject1() {
// deconstructor
}
void GameObject1::Draw(){
// eventually a method to draw the model to screen using OpenGL and SDL
}
我真的很迷茫,所以任何帮助都将不胜感激
谢谢
Jon检查md3header->Ofs_帧和md3header->Ofs_曲面的值,以确保它们不会试图索引到文件末尾。如果是,则MD3文件可能已损坏,或者读取文件时未正确映射到结构
不确定这是否是一个问题,但如果文件是在32位上生成的,则在64位系统上可能会遇到问题,反之亦然,因为INT的大小会不同,这会导致到结构的映射中断
可能想找到一个你知道可以正确读取文件的工具,并将这些值与你得到的值进行比较。或者使用十六进制编辑器手动查看文件以验证值。检查md3header->Ofs_框架和md3header->Ofs_曲面的值,以确保它们没有试图索引到文件末尾。如果是,则MD3文件可能已损坏,或者读取文件时未正确映射到结构
不确定这是否是一个问题,但如果文件是在32位上生成的,则在64位系统上可能会遇到问题,反之亦然,因为INT的大小会不同,这会导致到结构的映射中断
可能想找到一个你知道可以正确读取文件的工具,并将这些值与你得到的值进行比较。或者使用十六进制编辑器手动查看文件以验证值。我的建议:
该代码在构造函数中存在内存泄漏,因为您尚未释放在堆上分配的内存。
因此,在没有任何用处时释放内存。我的建议:
该代码在构造函数中存在内存泄漏,因为您尚未释放在堆上分配的内存。
因此,在没有任何用处时释放内存。查看结构的内存布局:打印出sizeoffloat、SizeOffint、SizeOffChar、SizeOffd3\u frame\u header\t等,看看它们是否正是您所期望的。如果没有,您可能希望使用pragma包,强制结构的momory布局成为文件布局。此外,文件中字节的结尾是否与内存布局相同
一般来说,我还建议不要从文件中读取结构。在90年代,通过这样做节省下来的几个CPU周期很重要,但现在它们不再重要了。您应该实现正确的读写代码,按照文件格式文档中的指定读取和解析字段,然后使用set方法将它们存储在您自己的内存表示中。这使得内存布局独立于文件布局,使代码更易于调试,如果您想切换到不同的体系结构或类似的体系结构,则更易于移植查看结构的内存布局:打印输出sizeoffloat、SizeOffit、SizeOffChar、SizeOffd3\u frame\u header\t、,等等,看看它们是否正是你所期望的。如果没有,您可能希望使用pragma包,强制结构的momory布局成为文件布局。此外,文件中字节的结尾是否与内存布局相同
一般来说,我还建议不要从文件中读取结构。在90年代,通过这样做节省下来的几个CPU周期很重要,但现在它们不再重要了。您应该实现正确的读写代码,按照文件格式文档中的指定读取和解析字段,然后使用set方法将它们存储在您自己的内存表示中。这使内存布局独立于文件布局,使代码更易于调试,也更易于移植如果您想切换到不同的体系结构或类似的体系结构,请看。您的结构需要正确对齐,请看。您的结构需要正确对齐,请看。首先给出准确的值,然后检查
检查大小是否正确首先给出准确值,然后检查
检查大小是否正确谢谢您的帮助。我最终通过检查md3_header_t结构的大小发现了问题。在Ofs_三角形中有一个额外的int,不应该在那里。它现在正在完美地读取数据,所以我将开始下一部分的工作 再次感谢
乔恩谢谢你的帮助。我最终通过检查md3_header_t结构的大小发现了问题。在Ofs_三角形中有一个额外的int,不应该在那里。它现在正在完美地读取数据,所以我将开始下一部分的工作 再次感谢
Jon您应该测试要读取的调用的返回值-这至少会告诉您哪个调用失败。您应该测试要读取的调用的返回值-这至少会告诉您哪个调用失败。