2013-06-04 4 views
0

xor 연결 목록에 대한 코드를 작성합니다. 제가 xor 결과로 가능한가요, 잘못된 포인터가 있습니까?

template <class T> 
Node<T>* List<T>::get_next(Node<T>* curr, Node<T>* prev) 
{ 
    assert(curr != 0); 
    return (Node<T>*)((int)prev^(int)curr->np); 
} 

하지만 결국 GDB와 fault.Debugging 세그먼트를 얻을

그 도시 한 함수의 코드 C.link 여기 XOR B.를 = 속성을 이용하여, I 포인터를 얻는 기능을 가지고 이것에 대한 이유가없는 변수 라인 return (Node<T>*)((int)prev^(int)curr->np); 같은 값 제 생각에는 XOR

p ((int)prev^(int)curr->np) 
$8 = 16 

의 끝에서

p *prev 
$6 = {data = 2, np = 0x60} 
p *curr 
$7 = {data = 12, np = 0x804c058} 

입니다 유효 포인터이므로 세그먼트 오류가 발생합니다. 어떻게 해결할 수 있습니까? 감사합니다

Тhe 문제는 solved.The 문제는 내가이 2 개 라인을 제거 할당 연산자

template <class T> 
List<T>& List<T>::operator=(const List& l) 
{ 
    if(this == &l) 
    { 
     return *this; 
    } 
    delete this->m_head; 
    delete this->m_tail; 
    this->m_size = l.m_size; 
    this->m_head = new Node<T>(l.m_head->data); 
    this->m_tail = new Node<T>(l.m_tail->data); 
    this->m_head = l.m_head;// problem here 
    this->m_tail = l.m_tail;// and here 
    return *this; 
} 

에 있었고, 문제가 사라입니다.

int main() 
{ 
    List<int> l; 
    l.insertAtBack(5); 
    l.insertAtBack(4); 
    l.insertAtBack(8); 
    l.insertAtBack(9); 
    l.insertAtBack(2); 
    l.insertAtBack(12); 
    List <int> i; 
    i = l; 
    i.insertAtBack(19); 
    l.insertAtBack(21);  
    i.traverse(); 
    l.traverse(); 
    if(i == l) 
    { 
     std::cout << "Objects is equal :)" << std::endl; 
    } 
    else 
    { 
     std::cout << "Objects is not equal :)" << std::endl; 
    } 
    return 0; 
} 

메인 프로그램은 할당 연산자라는 새로운 객체에 기존 객체의 머리와 꼬리 값을 할당했다. 당신이있는 경우

+0

포인터로 펑키 수학을 중단 할 수 있습니다. 당신이 XOR을 int로 강제해야하는 이유가 있습니다 ... : P – cHao

+0

하지만 저는 예를 들어 그렇게했습니다 (int) prev. 네가하는 말은 아니야? –

+0

C++은 두 포인터를 배타 처리하는 것이 실제로 int라고 생각하도록 속이지 않으면 조작을 허용하지 않기 때문에 실제로 xORing 두 포인터가 사용자를 가져올 것이라고 말하지 않습니다. 기껏해야 IB 영역에 있습니다. – cHao

답변

0
  • 사용 intptr_t보다는 int은 ... int 특히 64 비트 시스템에서, 포인터를 저장하기에 충분히 필요는 크지 않다. 구형 컴파일러에서는 size_t이 충분히 클 수 있습니다.
  • curr은 목록의 마지막 요소 또는 그 밖의 요소를 가리키는 것 같습니다. (np은 거대한 것이 일반적으로 null 포인터로 XOR 처리되거나 제대로 설정되지 않았다는 것을 의미합니다.) np을 처음으로 설정하는 방법을 살펴보십시오. 이상한 것이 있습니다.