指针值似乎受到其前面的值的影响
Pointer value seems to be affected by value preceding it
在我当前的工作流程中,我正在通过Python从Blender导出3D模型以及各种信息(顶点颜色、UV坐标等)。它存储在一个二进制文件中,可以用C++读取。
考虑以下代码:
Python:
ar = [0, 1, 2, 3, 4]
with open('model.bin', 'wb') as file:
file.write(struct.pack('%si' & len(ar), *ar))
C++:
u32* ar = (u32*) model_bin; //model_bin is already declared externally
for(int i=0; i<5; i++){
printf("%dn", ar[i]);
}
这很管用!但是,我的文件包含不止一个数据列表。它包含许多不同类型的数据。我在每个新"元素"开头的不同指针的帮助下跟踪这一点。即:
rgb* vcols = (rgb*) model_bin;
u32* uvco = (u32*) ((char*) vcols + 2*numVcols)
现在,除了我的UV纹理的第一个值之外,所有的东西都检查出来了。在我的导出脚本中将其设置为0会使我的C++应用程序将其读取为-566558720。
但是,如果我将UV坐标号导出并读取为短裤,则一切都会正常工作。
但情况越来越好了!当我将最后一个vcol[]元素的值设置为0时,我可以很好地读取写入的int!将最终vcol设置为1将使第一个uvco读取为65578。
我意识到在没有看到实际代码之类的情况下进行调试是非常棘手的,但也许有人可以根据这些信息向我提供一些见解或建议?
谢谢,
Patrick
编辑:不小心把vcols写成了u16[],而它实际上是一个rgb[]。rgb是一个typedef的无符号short。
我需要调试你的代码,以找出你为什么要覆盖内存的其他部分,但如果这是由于双关语,我不会感到震惊。
作为所有强制转换的替代方案,您可以将数据memcpy()到必需的变量中。
u32 ar;
memcpy(&ur, model_bin, sizeof(u32));
考虑到我在评论中发布的链接,投指针应该会让你感到紧张。使用memcpy()更安全,而且不会得到所有这些编译器警告和错误。
我的数据对齐出现错误。在指出这个想法后,我检查了指针地址,它不能像应该的那样被4除。添加填充已经解决了这个问题。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 移除前面有空格的前2个字符串
- 为什么擦除方法会影响结束方法
- 内联如何影响模块接口中的成员函数
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 在容量内调整矢量大小时的性能影响
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 未达到的情况会影响开关外壳性能
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 字符数组前面的加号是什么意思?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 模板如何影响C++中隐式声明的规则?
- 通过struct将参数传递给CreateThread(),并在不影响前面线程的情况下更改后续线程的成员
- 打开GL后面影响前面照明渲染
- 指针值似乎受到其前面的值的影响