2012-09-24 2 views
0

왼쪽과 오른쪽 하위에 포인터를 할당하려는 것과 관련이 있다는 사실 외에 프로그램이 실패하는 원인을 알지 못합니다. 오류 메시지가 없으면 프로그램이 실행되지 않습니다. 포인터를 잘못 지정했기 때문에 그럴 것이라고 가정합니다. 클래스의 이름은 BinaryTree 템플릿을 사용실행 실패 (알 수없는 원인)

struct TreeNode 
    { 
      Type nodeinfo; 
      BinaryTree<Type> *left; 
      BinaryTree<Type> *right; 
    }; 

:

다음은 구조체입니다. 다음은 잘못된 방법입니다.

template <typename Type> 
void BinaryTree<Type>::setSubtree(Type a){ 
    root = new TreeNode; 
    BinaryTree<Type> *b,*c; 
    root->nodeinfo=a; 

    b->root = s.top(); 
    root->right = b; 
    s.pop(); 

    c->root = s.top(); 
    root->left = c; 
    s.pop(); 
    s.push(root); 
} 

s는 TreeNode * 유형의 스택이며 노드를 보유합니다. 루트는 개별 노드입니다.

여러 번 변경 했으므로 처음부터 잊어 버렸습니다. 이것은 (setInfo가 잘 작동) 테스트 코드입니다 : 내가 포인터를 할당하기로되어있어 방법에 대한

tree.setInfo('b'); 
tree.setInfo('c'); 
tree.setSubtree('-'); 

어떤 통찰력을 크게 감상 할 수있다.

+4

초기화되지 않은 포인터를 역 참조하려고합니다. – chris

+0

어딘가에 오류 메시지가 있으며 액세스 위반이 있으며 심각한 오류 메시지입니다. 다른 코드 행을 작성하기 전에 출력 메시지가 덤프되는 위치를 찾아야합니다. – Aesthete

답변

0
BinaryTree<Type> *b,*c; 
... 
b->root = s.top(); 
... 
c->root = s.top(); 

당신은 결코 포인터를 bc 초기화되지 않습니다.

직접 이러한 오류가 발생 했어야합니다. 오류에 대한 첫 번째 방어로서이 사이트에 오는 것은 매우 나쁜 생각입니다. 디버깅 방법을 배울 수 없습니다. 우리의 도움없이 어떻게 이러한 문제들을 발견 할 수 있었습니까? 컴파일러에서 valgrind와 같은 분석 도구를 사용하거나 디버거를 사용하거나 직접 코드를 실행합니다.

컴파일러 경고를 활성화하여 컴파일러를 효과적으로 활용하는 방법을 학습하십시오. GNU와 clang은 최적화 된 컴파일과 적절한 경고가 가능할 때 이런 오류를 잡아낼 것입니다. 디버거 사용 방법을 익히십시오. 코드 실행 방법을 익히십시오.

관련 문제