ObjC + Cocos2d: странный EXEC_BAD_ACCESS ТОЛЬКО на устройстве - PullRequest
1 голос
/ 04 апреля 2011

Я получил странную ошибку EXEC_BAD_ACCESS только на устройстве, она работает в эмуляторе.

Вот фрагмент кода:

#define MAX_ELEMENT_A 24
#define MAX_ELEMENT_B 24
#define MAX_ELEMENT_C 24

typedef struct {
 int pos;
 int index;
} A_STRUCTURE;

typedef struct {
 int pos;
 int index;
} B_STRUCTURE;

typedef struct {
 int pos;
 int index;
} C_STRUCTURE;

typedef struct {
 A_STRUCTURE As[MAX_ELEMENT_A];
 int a_count;

 B_STRUCTURE Bs[MAX_ELEMENT_B];
 int b_count;

 C_STRUCTURE Cs[MAX_ELEMENT_C];
 int c_count;
} LEVEL;

Структура в основном игрового уровня, элементы уровня читаются из файла карты:

LEVEL level;
int a_count;
int b_count;
int c_count;

for (int i = 0; i < map_size; i++) {
 MAP_TILE tile = [map nextTile];
 if (tile.type == TYPE_A && a_count < MAX_ELEMENT_A) {
  level.As[a_count++] = tile.data;
 } else {
  // do the same for element B and C
 }
}

level.a_count = a_count;
level.b_count = b_count;
level.c_count = c_count;

return level;

каждый раз, когда читается фрагмент карты, я проверяю его тип (A, B или C) и помещаю их в относительный массив; Я также проверяю, превысил ли номер определенного типа элемента свой максимум (размер массива).

Проблема заключается в том, что при указанном выше значении MAX_ELEMENT_ * (т.е. всех 24) нет проблем с запуском в симуляторе или устройстве, но если я изменю любые два из них с 24 на 64, я получу EXEC_BAD_ACCESS при запуске на устройстве ТОЛЬКО. Я пытался найти, где это произошло, но безуспешно, после чтения уровня, его данные затем передаются в мир Box2d, ошибка произошла до того, как мир начинает тикать, я думаю, это может быть вызвано некоторой проблемой с памятью, что 64 слишком велика и с 24 все в порядке, но я сомневаюсь в этом, поскольку я проверил с использованием sizeof (LEVEL) и получил 2 *** для 64, что не должно быть слишком большим, за один раз читается только один уровень.

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 04 апреля 2011

Хмм ... Похоже, вы используете неинициализированные локальные переменные.

int a_count = 0;
int b_count = 0;
int c_count = 0;
...