5

我正在尝试将 a 存储c-float array在一个NSDictionary以供以后使用。
我最初使用 anNSArray来存储 C 数据,但NSArray为了我的意图而放慢了速度。

我正在使用以下代码将数组包装在 NSDictionary 中:

[self.m_morphPositions setObject:[NSValue valueWithBytes:&positionBuff objCType:@encode(float[(self.m_countVertices * 3)])] forKey:fourCC];

并使用以下方法检索 C-Float 数组:

float posMorphs[(self.m_countVertices*3)];

NSValue *posValues = [self.m_morphPositions objectForKey:name];

[posValues getValue:&posMorphs];

当我退出数组时,每个索引的值都设置为 0.0,这是错误的。

我怎样才能解决这个问题?

4

4 回答 4

3

我也认为这NSData可能是最好的解决方案。但如果有人感兴趣:你不能使用@encode可变大小的数组,因为它是一个编译器指令。所以

@encode(float[(self.m_countVertices * 3)])

不能工作。实际上,编译器在这里为大小为零的浮点数组创建了编码,这解释了为什么在读取NSValue.

但是您可以在运行时创建类型编码字符串。对于浮点数组,编码是[<count>^f](请参阅Type Encodings),因此以下内容将起作用:

const char *enc = [[NSString stringWithFormat:@"[%d^f]", (self.m_countVertices * 3)] UTF8String];
NSValue *val = [NSValue valueWithBytes:positionBuff objCType:enc];
于 2013-04-06T14:23:40.087 回答
2

NSValue可能是针对标量值的,而不是针对它们的数组。在这种情况下,使用NSData应该会容易得多

NSData* data = [NSData dataWithBytes:&positionBuff length:(self.m_countVertices * 3 * sizeof(float))];
[data getBytes:posMorphs length:(self.m_countVertices * 3 * sizeof(float))];

另一种解决方案是在堆上分配数组并用于NSValue存储指针。

于 2013-04-06T13:55:04.463 回答
1

如果将字节包装在 NSData 中,则可以将它们提供给 NSDictionary。

如果你想跳过它,你可以使用一个NSMapTableNSPointerFunctionsOpaqueMemory(或MallocMemory)作为值指针函数。

于 2013-04-06T14:12:26.180 回答
0

我不确定这是否是您编码值的方式,但它可能有助于将您的数组封装到结构中。

// Put this typedef in a header
typedef struct
{
    float values[3];
} PosValues;

在您的代码中:

// store to NSValue
PosValues p1 = { { 1.0, 2.0, 3.0 } };
NSValue *val = [NSValue valueWithBytes:&p1 objCType:@encode(PosValues)];

// retrieve from NSValue
PosValues p2;
[val getValue:&p2];

NSLog(@"%f, %f, %f", p2.values[0], p2.values[1]. p2.values[2]);

这种方法的好处是您的数组被保存为数组类型。此外,即使原始数组不是,这些结构也是可分配的:

PosValues p1 = { { 1.0, 2.0, 3.0 } };
PosValues p2;

p2 = p1;
于 2013-04-06T14:10:58.550 回答