2012-05-19 8 views
1

나는 간단한 반복 구조체 인 Recursive을 가지고 있으며, 프로그램에 필요한 값으로 초기화 된 const 배열을 갖고 싶습니다. 그런 다음 IterateAux이라는 간단한 반복자 함수를 사용하고이를 main이라고합니다. 지금까지의 코드를 봐 :중첩 배열을 재귀 구조로 정의하기

#include <iostream> 
#include <string> 

struct Recursive 
{ 
    std::string data; 
    Recursive* Children; 
}; 

void IterateAux(Recursive* Item) 
{ 
    int i = -1; 
    while (Item[++i].data != "") 
    { 
     std::cout << Item[i].data << "\n"; 
     if (Item[i].Children) 
      IterateAux(Item[i].Children); 
    } 
} 

int main() 
{ 
    IterateAux((Recursive*)Parent); 
    return 0; 
} 

을 지금이처럼 내 const를 배열이있는 경우 작동 :

const Recursive Children[] = { 
    {"Child1", NULL}, 
    {"Child2", NULL}, 
    {"", NULL} 
}; 

const Recursive Parent[] = { 
    {"Parent1", NULL}, 
    {"Parent2", NULL}, 
    {"Parent3", Children }, 
    {"", NULL} 
}; 

그러나 다음과 같은 중첩 된 양식을하지 않습니다 :

const Recursive Parent[] = { 
    {"Parent1", NULL}, 
    {"Parent2", NULL}, 

    {"Parent3", (Recursive[]) 
     { 
      {"Child1",NULL}, 
      {"Child2",NULL}, 
      {"", NULL} 
     } 
    }, 
    {"", NULL} 
}; 

과 그 질문은 왜? 어떻게 작동시킬 수 있습니까?

내 조사에서 처음에는 .children 포인터가 유효하지 않을 수 있다고 생각했지만 int 데이터 대신 시도했을 때는 std::string으로 완벽하게 작동했습니다.

std::string 데이터 GDB가 메시지 During startup program exited with code 0xc0000135.과 충돌하여 프로그램을 디버깅 할 수 없습니다. 어쩌면 배열 초기화 코드가 어딘가에서 엉망이되고있다.

GCC 4.6에서이 모든 것을 시도했다.

+0

'../sta/recurstruct.cpp:30:3 : 경고 : ISO-C++은 복합 리터럴을 금지합니다. ' – CapelliC

+0

그건 C++ 언어의 한계에 불과합니다. 몇 가지 템플릿 메타 프로그래밍을 사용하여 문제를 해결할 수 있습니다. –

+0

"경고"없이 컴파일 된 후 Linux에서 g ++ 4.6.3을 사용하기 위해 "const"를 제거해야했습니다. – stark

답변

0

약간의 작업을 통해 gdb를 만들 수 있습니다. IterateAux의 while 문에서 중단 점 설정. 그것은 부모 잘 통해 이동, 다음 t 내가 작업의 경우에서 볼 어린이의 경우에 도달 할 때 :

(gdb) p Item[0] 
$2 = {data = "Child1", Children = 0x0} 

이이 실패한 경우 :

(gdb) p Item[0] 
$2 = {data = <error reading variable: Cannot access memory at address 0xfffffff4>, 
Children = 0x48d24d79} 

그래서 그에게 캐스트처럼 보인다 재귀 적 []은 첫 번째 경우와 같은 형식으로 컴파일되지 않는다는 사실을 숨기고 있습니다.

-Wall로 g ++ 4.6.3으로 컴파일 중이며 경고가 표시되지 않습니다.