2016-12-05 74 views
-1

我有一個二維陣列狀,例如:的OBJ-C:如何將2D數組c添加到NSData的

struct myStruct twoDarray[maxX][maxY]; 

我可以在陣列上進行迭代,並看到所有的值被適當地分配。 我試圖把這個數組轉換成一個NSData對象像這樣:

NSData *myData = [NSData dataWithBytes:&twoDarray length:sizeof(struct myStruct) * actualX * actualY]; 

此任務成功。 myData.length顯示預期的大小(struct * x * y)。在這個問題上接受的答案表明,這是正確的語法:Is it possible to store 2D array in info.plist

最後,我嘗試用一​​個循環來讀回數組:

int start = 0; 
for (int x = 0; x < actualX; x++) 
{ 
    for (int y = 0; y < actualY; y++) 
    { 
     struct myStruct readBack 
     [myData getBytes:&readBack range:NSMakeRange(start, sizeof(struct myStruct))]; 
     start += sizeof(struct myStruct) 
    } 
} 

不過,我只在提取循環時,獲得有效數據x = 0。如果x = 0,則y的所有值的所有結構都存在且正確。對於任何x大於或等於1,readBack中的所有值都爲0.

我不確定此時我會出錯。如果我通過twoDarray進行迭代,它肯定有所有x值的數據。爲什麼當x大於或等於1時數據爲零?

回答

2

用C數組,& twoDarray實際上是指向數組的第一個元素afaik,所以它只是把第一個元素放到NSData中。也許寫的每一個元素(X,而不是x和y)爲一個NSData對象,然後將它們結合起來

NSData *data1 = ... 
NSData *data2 = ... 
NSMutableData *completeData = [data1 mutableCopy]; 
[completeData appendData:data2]; 

然後我想,當你在你的數據讀取你正在做的方式,元素的原因因爲新的NSData對象的內存爲零,所以如果你有一個X * n的NSData,並且你只需要放入X * 1的數據,其餘的將會是0的

作爲@macmoonshine提到,可以使用appendData:length:而不是爲每個元素創建臨時NSData對象,這將更有效率

+1

編寫數據到臨時數據對象是沒有必要的。您可以使用['appendData:length:'](https://developer.apple.com/reference/foundation/nsmutabledata/1407704-appendbytes?language=objc)。 – clemens

+0

啊是的,那會更好 – Fonix

+0

是的,迭代方法肯定有效,可能是可以接受的。但我希望單一的操作來複制整個塊。我想知道,是一個2d C陣列在內存中不連續和順序嗎? – Thunk

1

您的數組是一個pointe RS。對於你的方法更容易使用單一陣列和改造二維索引一維指標:

struct myStruct twoDarray[maxX*maxY]; 
// twoDarray[x][y] is equivalent to twoDarray[x * maxY + y] 

可以類似於回讀您的數據,寫它

[myData getBytes:&readBack length:sizeof(struct myStruct) * maxX * maxY]; 
+0

所以這裏的工作原理似乎是我們根本不能添加兩個數組在一次操作中將二維C數組轉換爲nsdata?不知道我在評論中關注你的數學。隨着maxX = 56和maxY = 40,我需要總共2,240個插槽。如果x = 55,y = 40,在你的等式中,我得到了#3,120的插槽。 – Thunk

+0

對不起,我混合了這些值。我已糾正它。 – clemens