2016-12-05 4 views
-1

에 2 차원 C 배열을 추가하는 방법 나는 그런 같은 두 가지 차원 배열을 가지고있다. 나는 그런 같은있는 NSData 객체로,이 배열을 넣어려고 :의 Obj-C는 :</p> <pre><code>struct myStruct twoDarray[maxX][maxY]; </code></pre> <p>내가 배열을 반복하고 모든 값이 제대로 할당되었는지 볼 수있는 NSData

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

이 할당이 성공합니다. myData.length은 예상되는 크기 (struct * x * y)를 보여줍니다. 난 단지 추출 루프 경우에 유효한 데이터를 얻을, 그러나

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) 
    } 
} 

: 나는 루프와 배열을 다시 읽으려고, 결국 Is it possible to store 2D array in info.plist

:이 질문에 대한 허용 대답이 올바른 구문 제안 x = 0 인 경우, y의 모든 값에 대한 모든 구조가 존재하고 정확합니다. 1보다 크거나 같은 임의의 x에 대해 readBack의 모든 값은 0입니다.

내가 잘못 될 때가 어디인지 확신 할 수 없습니다. twoDarray을 반복 할 경우 확실히 x의 모든 값에 대한 데이터가 있습니다. x가 1보다 크거나 같을 때 데이터가 제로가되지 않는 이유는 무엇입니까?

답변

2

C 배열의 경우, twoDarray는 실질적으로 배열 의 첫 번째 요소 afaik에 대한 포인터이므로 첫 번째 요소를 NSData에 넣는 것입니다. 어쩌면있는 NSData 객체로 (X,하지 x와 y의) 각 요소를 작성하고 난 당신이, 당신의 데이터 요소를 당신이 그 일을하는 방법을 읽고있는 이유를 추측 그런 다음 그들에게

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

을 결합 새로운 NSData 객체가 0부터 시작하는 메모리를 가지므로 0이됩니다. NSData가 X * n이고 X * 1 값의 데이터 만 넣으면 나머지는 0이됩니다. 나머지는 0이됩니다

@macmoonshine이 언급했듯이, 더 효율적이 될 각 요소에 대해 임시 NSData 객체를 만드는 대신 appendData:length:을 사용할 수 있습니다.

+1

를 작성 유사하게 데이터를 다시 읽을 수 있습니다 : 당신의 접근을 위해 하나의 배열을 사용하고 한 차원 인덱스에 두 개의 차원 인덱스를 변환하는 것이 더 쉽습니다 임시 데이터 객체에 대한 데이터는 필요하지 않습니다. 대신 ['appendData : length :'] (https://developer.apple.com/reference/foundation/nsmutabledata/1407704-appendbytes?language=objc)를 사용할 수 있습니다. – clemens

+0

아 그래, 그게 더 좋을거야 – Fonix

+0

그래, 반복적 인 접근 방식은 확실히 작동하고 아마도 받아 들일 만하다. 하지만 전체 블록을 복사하는 단일 작업이 필요했습니다. 두 번째 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