0

看看这段代码:

这是带有 1 字节结构打包的结构定义文件(用于套接字网络)

#pragma pack(1)

typedef struct _TestStruct1 {

double d1;
double d2;

} TestStruct1;


typedef struct _TestStruct2 {

unsigned long v1;
unsigned short v2;
unsigned long v3;
unsigned long value;
TestStruct1 ts1;

} TestStruct2;

#pragma pack()

行。现在看下面的简单代码:

TestStruct2 wtf;
wtf.v1 = 0;
wtf.v2 = 0;
wtf.v3 = 0;
wtf.value = 4294967295;
wtf.ts1.d1 = 37.785834f;
wtf.ts1.d2 = 37.785834f;
char * cp = (char *)&wtf;
for (int i = 0; i < sizeof(TestStruct2); i++) NSLog(@"[%d] %d", i, (int)cp[i]);
NSLog(@"wtf.value: %lu", wtf.value);

iphone 5.0 模拟器 XCode 4.2 上的结果:

[0] 0
[1] 0
[2] 0
[3] 0
[4] 0
[5] 0
[6] 0
[7] 0
[8] 0
[9] 0
[10] -1
[11] -1
[12] -1
[13] -1
[14] 0
[15] 0
[16] 0
[17] 64
[18] -106
[19] -28
[20] 66
[21] 64
[22] 0
[23] 0
[24] 0
[25] 64
[26] -106
[27] -28
[28] 66
[29] 64
wtf.value: 4294967295

没有问题。但是当涉及到真实设备(iPhone4)时......

[0] 0
[1] 0
[2] 0
[3] 0
[4] 0
[5] 0
[6] 0
[7] 0
[8] 0
[9] 0
[10] -1
[11] -1
[12] 0
[13] 0
[14] 0
[15] 64
[16] -106
[17] -28
[18] 66
[19] 64
[20] 0
[21] 0
[22] 0
[23] 64
[24] -106
[25] -28
[26] 66
[27] 64
[28] 88
[29] 84
wtf.value: 65535

哦,天哪,发生了什么?我将 wtf.value 存储为 4294967295,但在设备上,它更改为 65535。此问题仅发生在设备上,而不发生在模拟器上。

这个问题在 iOS5 XCode4.2 之前从未发生过。

我该如何解决?请帮我。

4

2 回答 2

3

我遇到了这样的问题,涉及浮点计算错误,但在 UI 定位代码中。我通过添加来修复它:

-mno-thumb

到构建设置下的“其他 C 标志”选项,仅适用于armv6设备(“添加构建设置”>“添加条件设置”)。

我不会假装完全理解这里发生了什么,但是通过添加这个构建设置,您将禁用 Thumb 指令集,根据一些(http://wanderingcoder.net/2010/07/19/ought-arm/ ) 无论如何都不推荐用于 armv6 构建。Thumb 改变了浮点计算的工作方式。

于 2011-10-18T05:31:22.990 回答
0

根据同一个人(参考克雷格的回答),也就是我,在同一篇文章中,在 ARM 上处理未对齐的数据非常糟糕(模拟器是 x86)。我可以理解网络代码中的整数(尽管我宁愿显式序列化),但不应该有任何未对齐的浮点数的理由(在这里,当您存储浮点值时,它似乎被默默地重新对齐到一个 4 字节的边界,它会覆盖 wtf.value 的一部分)。您不会通过网络传输原始浮点值,对吗?对?

于 2011-10-19T12:49:18.927 回答