Ошибка выравнивания байтов с плавающей запятой iOS5 Xcode4.2?

#floating-point #ios5 #xcode4.2

#ошибка выравнивания байтов с плавающей запятой #ios5 #xcode4.2

Вопрос:

Посмотрите на этот код:

это файл определения структуры с упаковкой структуры в 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 *)amp;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 simulator 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.

Как я могу это исправить? Пожалуйста, помогите мне.

Комментарии:

1. На первый взгляд это кажется ошибкой. Пожалуйста, отправьте сообщение об ошибке в Apple. developer.apple.com/bugreporter

Ответ №1:

У меня была подобная проблема, связанная с ошибками в вычислениях с плавающей запятой, но в коде позиционирования пользовательского интерфейса. Я исправил это, добавив:

 -mno-thumb
  

к параметрам «Другие флаги C» в разделе «Настройки сборки», только для устройств armv6 («Добавить настройку сборки»> «Добавить условную настройку»).

Я не претендую на то, чтобы точно понимать, что здесь происходит, но, добавляя этот параметр сборки, вы отключаете набор команд Thumb, который, согласно некоторым (http://wanderingcoder.net/2010/07/19/ought-arm /) в любом случае не рекомендуется для сборок armv6. Thumb изменяет способ работы вычислений с плавающей запятой.

Ответ №2:

И, по словам того же человека (со ссылкой на ответ Крейга), то есть меня, в том же самом сообщении, обработка смещенных данных на ARM очень плоха (симулятор x86). Я могу понять это для целых чисел в сетевом коде (хотя я бы предпочел явно сериализовать), но не должно быть никаких причин для того, чтобы когда-либо иметь смещенные числа с плавающей запятой (здесь, когда вы сохраняете значение с плавающей запятой, оно, кажется, автоматически перестраивается на 4-байтовую границу и перезаписывает часть wtf.значение). Вы не передаете необработанные значения с плавающей запятой по сети, верно? Верно?