2013-04-06 58 views
5

我想一个c-float array存储在一个NSDictionary以后使用。
我最初使用NSArray来存储C数据,但NSArray是为了减缓我的意图。存储一个C int数组中的一个NSDictionary

我使用以下代码来包装在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]; 

当我retireve阵列,对于每个错误的索引,值都被设置为0.0。

我该如何解决这个问题?

回答

2

NSValue大概intented的标值,而不是数组他们。在这种情况下,使用NSData要容易得多

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

另一个解决方案是在阵列在堆上分配,并使用NSValue存储指针。

+0

它与阵列(见下面的回答)。但是'NSData'可能是更好的解决方案。 – 2013-04-06 14:32:20

+0

完美工作。非常感谢 – samb90 2013-04-06 15:12:07

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; 
1

可以养活字节到一个NSDictionary如果他们包裹在一个NSData。

如果你想跳过的是,你可以使用一个NSMapTableNSPointerFunctionsOpaqueMemory(或MallocMemory)的价值指针功能。

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]; 
+0

+1关于编译器指令的好处。很高兴学习新的东西。但是,我想知道它为什么不发出任何警告。 – Sulthan 2013-04-06 16:44:05

+0

@Sulthan:这是个好问题! – 2013-04-06 22:41:54

相关问题