2013-04-06 29 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

相關問題