2012-06-14 2 views
2

내가 예를 들어구조의 모든 항목을 철저히 반복하는 방법은 무엇입니까?

typedef struct{ 
    tMY_STRUCT2 my_struct2; 
    u16 item1; 
    u8 item2[20];  
    u32 item3; 
}tMY_STRUCT; 

가 어떻게 구조를 통해 얻을 수있는 구조의 형식을 가지고? 때문에이 너무 쉽지 않아서 오프셋을 계산할 때 SIZEOF (항목)으로 시작하는 오프셋을 계산할 수 없습니다.

어떨까요?

이유 : 큰 구조를 시작해야하는데, 몇 가지 조건이 있으므로 FOR주기 내에서 만들어야합니다.

+2

[무엇을 시도해 봤습니까?] (http://whathaveyoutried.com) – sczizzo

답변

5

하지 마십시오. 구조의 요점은 일 수 없습니다 데이터 항목을 균일하게 처리 할 수 ​​없습니다. 구조가 균질이기 때문에 이질적인 데이터 구조입니다.

코드에서 각 필드를 한 번에 하나씩 초기화하거나 전체 구조체를 0으로 초기화하십시오. 그것만이 좋은 연습 옵션입니다. 특히 정렬은 컴퓨터 아키텍처, 컴파일러 등에 따라 달라집니다. 따라서 선언을 사용하여 필드를 재정렬하거나 다른 OS에서 실행하거나 다른 곳에서 컴파일하는 등 코드에 사소한 변경을 가하면이를 사용하는 방법이 중단 될 수 있습니다 .

옵션 :

memset(mystruct, 0, sizeof(mystruct)); 

또는 (난이 C99 생각) mystruct_t foo = {0};

하거나 각 필드를 초기화하기.

+0

모든 구조체에 대한 Memset이 충분하지 않습니다. Init는 그 해결책보다 어렵다고 말했기 때문입니다. 필자의 경우에는 정렬 전의 각 항목의 길이가 특수 배열로 정의됩니다. 그래서이 구조체를 바이트 배열로 serialize하는 함수를 만들어야하고이 배열을 내 init 사이클에 사용해야합니다. – Meloun

+0

그런 다음 코드에서 각 필드를 개별적으로 초기화해야합니다. – djechlin

+0

각 필드 테스트에 대해 550 개 항목, 일부 조건 및 init보다? – Meloun

0

for 루프가 어떻게 도움이 될지 잘 모르겠지만 구조를 반복하는 좋은 방법은 없습니다.

구조체의 개체에 대한 포인터 구조를 설정 한 다음 sizeof (ptr)를 통해 건너 뛸 수 있지만 그 작업은 끔찍한 일이며 동료가 여러분을 린치시킵니다.

관련 문제