Можете ли вы помочь мне сохранить b2Vec2 в NSArray?

#c #objective-c #nsarray

#c #objective-c #nsarray

Вопрос:

Я создал файл, NSArray в котором есть некоторые b2Vec2 объекты (C ). Я использовал следующий код:

 NSMutableArray *array = [[NSMutableArray alloc] init];
b2Vec2 verts[] = {
    b2Vec2(28.3f / PTM_RATIO, 80.3f / PTM_RATIO),
    b2Vec2(7.1f / PTM_RATIO, 89.4f / PTM_RATIO)
};

[array addObject:[NSValue valueWithPointer:verts]];
  

Затем я считываю b2Vec2 объекты из NSArray вот так:

 NSValue *val = [array objectAtIndex:0];
b2Vec2 *verts;
[val getValue:amp;verts];
b2Vec2 vec = verts[0];
  

Я видел x и y значения из vector объекта, но у него непонятные значения.

Например, PTM_RATIO = 32 так 28.3f / PTM_RATIO = 0.884375 , но вектор имеет значение x, равное 4.3629125e-38.

Я хочу вернуть verts объект в его исходной форме C , в виде b2Vec2 массива. Как я могу это сделать?

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

1. Нет, я не думаю, что кто-то имеет хоть малейшее представление, о чем ты говоришь. Но если приведенный выше код буквально соответствует тому, что вы сделали, я не удивлен, что он терпит неудачу.

2. Неправильно ли добавлять значение b2Vec2 в NSArray? Что в этом плохого?

3. Где расположен ваш массив? Каков срок его службы?

4. Я отредактировал его. У него все еще есть проблемы?

5. С избытком. Объявление b2Vec2, по-видимому, находится в вашей процедуре, что означает, что это автоматическая переменная. Как только эта процедура возвращает данные, они перезаписываются. Вы должны разместить массив либо в статическом хранилище, либо в хранилище кучи.

Ответ №1:

Вы можете сохранить свои вершины как в NSValue как CGPoints и сохранить это в массиве. Затем переведите в b2Vec2, когда вам это нужно.

//

 NSMutableArray *array = [[NSMutableArray alloc] init];

CGPoint vert1 = CGPointMake(28.3f / PTM_RATIO, 80.3f / PTM_RATIO);
CGPoint vert2 = CGPointMake(7.1f / PTM_RATIO, 89.4f / PTM_RATIO);
[array addObject:[NSValue valueWithCGPoint:vert1]];
[array addObject:[NSValue valueWithCGPoint:vert2]];
  

затем извлеките

 NSValue *vert1val = [array objectAtIndex:0];
NSValue *vert2val = [array objectAtIndex:1];


b2Vec2 b2vert1 = [vert1val CGPointValue];
b2Vec2 b2vert2 = [vert2val CGPointValue];
  

Для развлечения и поделиться с нами, вы можете попробовать сохранить b2Vec2 непосредственно в NSValue объекты, учитывая, что они представляют собой одинаковые структуры под ними.
Что касается хранения массива структур непосредственно в NSValue, я никогда не видел, чтобы это делалось раньше

Ответ №2:

помещение указателя в NSArray, вероятно, не очень хорошая идея, потому что вы добавляете только указатели в массив без фактических данных, попробуйте скопировать или инициализировать ваш массив b2Vec2 в NSData или NSMutableData, а затем добавьте их в свой массив.

 [array addObject:[NSData dataWithBytes:verts length:sizeof(b2Vec2)*2]];
  

 b2Vec2 * vl = (b2Vec2*)[[array objectAtIndex:0] bytes];
b2Vec2 vec = vl[0];
  

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

1. NSData *d = [NSData dataWithBytes:amp;verts длина:sizeof (версты)];