2010-08-10 5 views
1

내 코드에 컴파일 오류가 없습니다. 런타임 오류가있는 것 같습니다. 다음 코드에서는 while 루프가 처음 실행될 때 모든 것이 잘 동작합니다. 그러나 두 번째 반복에서는 모든 것이 "list :: iterator k = (temp2-> store) .begin();"에서 멈 춥니 다. "list :: iterator k ..."부분을 주석 처리하면 모든 것이 잘 동작합니다. 변수 temp2 및 temp2-> store가 NULL 또는 비어 있지 않습니다. 디버거가 "euler.exe 프로젝트의 0x009bc0cf에서 처리되지 않은 예외가 발생했습니다 : 0xC0000005 : 0xddddddf5 위치를 읽는 액세스 위반"메시지가 나타납니다.while 루프 내에 반복자를 정의 할 수 있습니까?

struct edge 
{ int end1, end2;  
    ptr_to_edge *ptr_end1, *ptr_end2; 
    edge *next, *l_chd, *r_chd; 
    edge(): next(NULL), l_chd(NULL), r_chd(NULL), ptr_end1(NULL), ptr_end2(NULL) 
    { } 
}; 


    struct ptr_to_edge { 
     int flag, vertex;  
     list<edge*> store; 
     ptr_to_edge(): flag(1) 
     { } 
    }; 
void parallel_reduction_step(ptr_to_edge *front, vector<edge> &a) { 

    list<edge*>::iterator next = (front->store).begin(); 
    next++; 
    list<edge*>::iterator current = (front->store).begin(); 
    list<edge*>::iterator last = (front->store).end(); 
    --last; 

    while(current!= last) { 

     if(((*current)->end1 == (*next)->end1)&&((*current)->end2==(*next)->end2)) { 

      edge temp1; 
      temp1.end1 = (*current)->end1; temp1.end2 = (*current)->end2; 
      a.push_back(temp1); 

      ptr_to_edge *temp2; 
      if ((*current)->end1==front->vertex) 
       temp2 = (*current)->ptr_end2; 
      else 
       temp2 = (*current)->ptr_end1; 

      list<edge*>::iterator k = (temp2->store).begin(); 

       current = (front->store).erase(j); 
      *current = &(a.back()); 
      } 
     else current++; 
     next++; 
     } 
    }; 
+0

죄송합니다. 내가 너의 글을 읽을 수 없다면 너를 도울 수 없어. –

+8

코드에있는 첫 번째 문제점은 너무 많은 한 문자 변수를 사용하고 너무 많은 블록을 중첩한다는 것입니다. 완전히 읽을 수 없습니다. 의미있는 변수 이름을 사용하고 기능을 구성 요소로 분해하여 이해하고 이해하기 쉽도록하십시오. –

+0

@ user416689 : 두 번째로 temp2의 값은 무엇입니까? temp2-> store의 가치는 무엇입니까? 내 생각 엔 temp2 또는 temp2-> store가 NULL이라는 것입니다. –

답변

2

코드 정리를 이용해 주셔서 감사합니다. 벡터에 요소를 푸시하고 다른 구조의 요소에 포인터를 놓는 것 같습니다. 이 문제는 "a"의 크기를 변경하면 (포인터를 추가 할 때 발생할 수 있음) 해당 요소에 대한 포인터 (또는 반복자)가 유효하지 않게되고 이로 인해 요소를 누를 때 발생할 수있는 문제가 있습니다. 이 문제가 코드로 인해 발생하는지는 알 수 없지만 문제가 발생할 수 있습니다. "a"를 deque로 변경하면 끝에 추가 할 때 해당 요소에 대한 포인터가 무효화되고 해당 부분을 수정해야합니다.

+0

필자는 이터레이터의 이름을 변경했습니다. 하지만 반복기 마지막 (또는 편집되지 않은 게시물에서 m) 문제가되지 않습니다 .. – user416689

+0

나는 그것을 밖으로 시도하고 그것에 당신에게 돌아갈 것이다 .. 나는 또한 어떤 도움이 될 것이라고하면 구조체 정의가 포함되어 있습니다 .. – user416689

+0

+ 1'deque'는 사실상의 컨테이너 여야합니다! –

0

프로그램이 중단 될 때 발생하는 오류 메시지에 대한 자세한 내용은 도움이 될 수 있지만 어쨌든 나는 야생의 추측을 할 것입니다. temp2temp2->store 값이 NULL이 아닌 경우 temp2->store은 빈 컨테이너입니까? 즉, temp2->store.begin() == temp2->store.end()입니다. 당신은 k를 역 참조하려고 시도하기 전에 그 케이스를 검사 해 볼 수 있습니다. 예를 들어, temp2->store가 비어

while(reached == 0 && k != temp2->store.end()) { 
    . 
    . 
    . 
} 

경우에 while 루프를 변경할 수 있습니다, 다음은 반복자가 끝 반복자와 동일한 시작과 끝 반복자를 역 참조하는 것은 좋지 않습니다. 결국 문제가되지 않더라도 문제가 발생하지 않도록 점검해야합니다.

+0

temp2-> store is empty – user416689

+0

비어있을 가능성이 있습니까? 코드의 유스 케이스에서? 나는 당신의 문제를 해결하지 못하더라도 여전히 그 수표를 넣을 것입니다. 아마도 길 아래에서 다른 문제를 피할 것입니다. –

+0

은 k! = temp2-> store.end() 부분을 while 조건에 추가했습니다. 그러나 문제는 지속되는 것처럼 보인다. – user416689