2010-08-10 98 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

对不起。如果我甚至无法阅读你的帖子,也无法帮助你。 – 2010-08-10 22:46:03

+8

你的代码的第一个问题是你使用了太多的单字母变量,并且你嵌套了太多的块。这是完全不可读的。尝试使用明智的变量名称,并将该功能分解为组件部分,以便更容易理解和理解。 – 2010-08-10 22:47:55

+0

@ user416689:第二次通过时temp2的值是多少?什么是temp2-> store的价值。我的猜测是temp2或temp2-> store是NULL。 – 2010-08-10 22:49:31

回答

2

感谢您清理代码。它看起来像是在向量a上推入元素,然后在其他结构中指向其元素的指针。问题在于,“a”的大小(可能随着它的增加而发生)会导致指向其元素的指针(或迭代器)变为无效,并且可能会在您对其上的元素进行推送时发生。我不知道这是否与代码有关,但可能会导致问题。您可以将“a”更改为deque,在添加到最后时不会使指向其元素的指针无效,并且应该修复该部分。

+0

我已经重新命名了迭代器。但迭代器最后(或从未编辑的帖子M)是不是问题.. – user416689 2010-08-10 23:05:56

+0

我会试试看,并得到它回到你..我还包括结构定义,如果这将有任何帮助.. – user416689 2010-08-11 00:03:10

+0

+ 1'deque'应该是事实上的容器! – 2010-08-11 09:00:29

0

有关程序中止时所得错误消息的更多详细信息可能会有所帮助,但无论如何我都会猜测。如果您的temp2temp2->store值不为NULL,那么可能temp2->store是一个空容器?那就是,temp2->store.begin() == temp2->store.end()。在尝试解除引用k之前,您可以尝试检查该情况。例如,你可以在你的while循环改为

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

如果temp2->store是空的,那么开始迭代器等于end迭代,以及解引用结束迭代器是坏的。所以你应该有一个检查来防止它,即使最终不是问题。

+0

temp2->商店不是空的 – user416689 2010-08-10 23:20:10

+0

它有可能是空的吗?在你的代码的任何用例中?即使它不能解决您的问题,我仍然会将该支票放在那里。它可能会在一段时间内避免另一个问题。 – 2010-08-10 23:29:14

+0

在while条件中添加了k!= temp2-> store.end()部分。但问题似乎仍然存在。 – user416689 2010-08-10 23:35:19

相关问题