2014-07-10 4 views
-1

구조체의 필드에 구조체를 지정하고 싶습니다. 구조체에 대한 포인터입니다.구조체 내부의 다른 구조체에 구조체를 할당하십시오.

typedef struct { 

    char *name; 

} geometry; 

typedef struct sceneGR_tag { 
    geometry *g; 
    struct sceneGR_tag *next; 
} sceneGR; 

typedef struct { 
    geometry *g; 
    int nshapes; 

    sceneGR *root; 
} scene; 

당신이 볼 수 있듯이, sceneGR는 형상 *의 g (형상 그래서 배열을)이 있습니다 나는 무슨 말인지 여기 당신을 보여줍니다. 전제가 그것의 지오메트리와 함께 'scene'구조체를 이미 초기화했다는 전제가 있습니다. 구조체 'sceneGR'에 지오메트리를 복사하려고합니다. 그래서 sceneGR-> g에 그 구조체를 복사하고 싶습니다.

내가 할 수있는 방법이 for 내에서 :

scene *scn; //already initialized with nshapes=6, and so with 6 geometries until g[5]; 

for(k = 0; k < scn->nshapes; k++) { 
    //what can i do here? 
} 
+1

'장면 * scn;'은 단지 선언입니다. 초기화가 아닙니다. –

+0

사본을 원하거나 동일한 객체를 가리켜 야합니까? – mch

+0

@Jayesh 전체 프로그램을 보여줄 수는 없지만 루프를 수행하기 전에 이미 초기화했음을 신뢰하십시오. 나는 수백 줄의 코드가 있기 때문에 그것을 쓰지 않았다. – Aerox

답변

1

왜 루프를해야합니까? 방금해야 할 일 :

scn->root->geometry = scn->geometry; 

내가 원하는 것이 아닌지 알려주세요.

당신은 각 sceneGR->gscn->g의 각 형상 값을 복사 할

편집 할 수 있습니다. 그러나 struct scenegeometry** g이 없으면 이상합니다. 그러나 당신이 당신의 코드로 작업을 수행 할 수 있습니다

scene *scn; 
sceneGR *s_list = scn->root; 

for(k = 0; k < scn->nshapes; k++) { 
    s_list->g = &(scn->g[k]); 
    s_list = s_list->next; 
} 

하지만 당신의 struct scenegeometry** g, 당신은 할 수 있습니다 :

scene *scn; 
sceneGR *s_list = scn->root; 

for(k = 0; k < scn->nshapes; k++) { 
    s_list->g = scn->g[k]; 
    s_list = s_list->next; 
} 
+0

그래, 미안하지만, 내가 뭘하고 싶은지 알지 못해. scn-> g [k]가 sceneGR-> g에서 새롭게 정의 된 sceneGR로 옮겨집니다. 왜냐하면 모든 scene-> g [k]가 다르기 때문입니다. 그래서 각기 다른 sceneGR에서 단독으로 복사하려고합니다. – Aerox

+1

방금 ​​편집했습니다 – Kabulan0lak

+0

이제는 당신이 게시 한 첫 번째 방법입니다. 정말 고마워요. 오류가 정확히 어디 있었는지 이해가 안되요. 내가 아는 유일한 것은 그것이 작동한다는 것입니다 :-) – Aerox

0

geometry 경우 정의 된 비트 복사본이 의미가 있도록, 다음 :

SceneGR *gr = malloc(sizeof *gr); 
size_t num_bytes_to_copy = scn->nshapes * sizeof scn->g[0]; 

gr->next = NULL; 
gr->g = malloc(num_bytes_to_copy); 
memcpy(gr->g, scn->g, num_bytes_to_copy); 

다음 각 geometry 오브젝트의 복사 함수를 호출을 통해 루프를해야합니다 그렇지 않은 경우.

또한 이 배열에 얼마나 많은 항목이 있는지 알 수없는 것은 확실하지 않습니다.

SceneGR을 (를) 파괴하는 경우 free(gr->g)을 잊지 마세요.

관련 문제