2012-01-30 1 views
0

embedded device을 기준으로 MIPS에 대한 애플리케이션을 개발하고 싶습니다. 나는 mipsel-elf-g++ 크로스 컴파일러를 사용하고있다. 나는 간단한 코드를 다음과 같이 구현한다.세그먼트 오류는 객체 포인터의 가상 함수 호출로 인해 발생합니다.

class A { 
    public: 
      virtual int getValue(); 
    } 

    class B : public A { 
    public: 
      virtual int getValue(); 
    } 

    int A::getValue() { 
      return 1; 
    } 

    int B::getValue() { 
      return 2; 
    } 

    int main() { 

      A a1; 
      B b1; 
      A* a2 = &a1; 
      B* b2 = &b1; 

      int a_val_1 = a1.getValue(); 
      int b_val_1 = b1.getValue(); 

      int a_val_2 = a2->getValue(); 
      int b_val_2 = b2->getValue(); 

      return 0; 
    } 

a1.getValue()b1.getValue() 라인이 성공적으로 작동하지만, a2->getValue() 또는 b2->getValue() 라인의 각이 실행될 때, 나는 화면에 segment fault 메시지가 표시됩니다. OS, 컴파일러 또는 라이브러리 중 하나가 고장난 것 같습니다. 나는 내가 어떻게 문제를 발견 할 수 있는지 모른다.

무엇이 잘못 되었나요?

B b1; 

당신은 할당됩니다 :

+2

당신은 최소한의 작업 예와 ** 복사본을 생성해야 질문에 대한 예를 들어, 비슷한 것을 타이핑하는 것. 이 코드는 다른 오타가 있음을 나타내는 구문 오류가 있으며 구문을 수정하면 코드에 다른 하나 이상의 차이가 있음을 나타내는 표시된 동작을 나타내지 않아야하는 유효한 프로그램이 생성됩니다. –

+0

클래스 정의에서 누락 된 ";"을 수정 한 후, 코드는'mips-linux-gnu-g ++ '로 컴파일 할 때 MIPS 시스템에서 정상적으로 실행됩니다. – markgz

+0

@markgz :'mipsel-elf-g ++'와'mips-linux-gnu-g ++'의 차이점은 무엇입니까? 내 임베디드 장치 OS는 리눅스가 아닙니다. 'mipsel-elf-g ++ '대신'mips-linux-gnu-g ++'를 사용할 수 있습니까? –

답변

2

당신은이

B* b2 = &b2; 

그것은해야한다 : **

B* b2 = &b1; 
+0

사실이지만, 그대로 컴파일하면 안됩니다. – Roddy

+0

네 말이 맞아, 내 질문에 내 실수 야. 내 질문을 편집합니다. –

+0

무슨 뜻입니까? 이 '초기화'에서 'B **'를 'B *'로 변환 할 수 없습니까? –