2014-11-18 4 views
-1

구조체 내부에 int 배열의 2 차원 배열을 초기화하려고합니다. 내 프로그램 내가 구조체를 만들었습니다 (글로벌 액세스)의 시작이 구조체의 배열에서 :구조체 내부에 2 차원 배열을 초기화하십시오.

다음
struct block { 
    int theblock[3][3]; 
}; 

struct block blockArray[6]; 

내가 함수에 구조체의 배열을 초기화하는 것을 시도하고있다 :

void afunction() { 
    int block1[3][3] = { 
     {0, 1, 0}, 
     {0, 1, 0}, 
     {0, 1, 0} 
    }; 

    blockArray[0].theblock = block1; 
} 

컴파일러 오류 :

error: incompatible types when assigning to type 'int[3][3]' from type 'int[*][3]' 

사람이 내가 잘못 여기에 무엇을했는지 설명해 주시겠습니까, 내가 알고있는이 아주 기본적인 것들이지만, 나는 정말로 읽고 일을 해결하기 위해 노력했다 나 혼자이다. 나는 자바에서 오는와 C가

+2

당신은 당신이 그들을 초기화가 어느 C에서, 배열에 할당 할 수 없습니다 생성 시간을 지정하거나 요소별로 채 웁니다. –

답변

2

임시 구조체를 만들고 배우고 구조체의 배열의 당신의 요소에 할당하는 것을 시도하고있다 :

struct block temp = { { {0, 1, 0}, {0, 1, 0}, {0, 1, 0} } } ; 

blockArray[0] = temp ; 

또는 당신의 배열을 사용하고 복사

int temp[3][3] = { {0, 1, 0}, {0, 1, 0}, {0, 1, 0} } ; 

assert(sizeof(temp) == sizeof(blockArray[0].theblock)) ; 
memcpy(blockArray[0].theblock , temp , sizeof(temp)) ; 
+0

감사합니다. 가장 쉬운 솔루션이라고 생각합니다. 나는 그것을 시도 할 것이다. – BruceB

-1

C에서이 방법으로 배열을 복사 할 수 없습니다. 그 점에 관해서는 자바로도 할 수 있다고 생각지 않았습니다.

당신은 예를

blockArray[0].theblock = block1; 

를 들어, 주변의 포인터를 복사 할 수 있습니다하지만 할 모든이 & 블록 1과 동일한 주소에서 blockArray [0] .theblock 점을 가지고있다 [0]. 콘텐츠를 복사하지 않으며 얕은 사본입니다.

당신은() 또는 루프 (들) 방어 적이기에 걸쳐 구성원을 복사해야합니다 :

for (int i = 0; i < 3; i++) 
    for (int j = 0; j < 3; j++) 
     blockarray[0].theblock[i][j] = block1[i][j]; 
+0

http://zhangliaoyuan.me/blog/2013/01/28/structure-assignment-and-its-pitfall-in-C-language/ 딥 복사본입니다. 구조체의 ** 멤버 **가 동적으로 할당되면 해당 멤버는 별칭 일 뿐이며 전체 복사본의 결과가 아닙니다. 'memcpy'는이 특별한 경우에 최적화를 막을 수도 있습니다. – DevNull

+0

@Dogbert 너는 물건을 섞어. 나는 너의 연결을 다시 읽는 추천한다. – 2501

관련 문제