#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 (версты)];