将元素推送到队列时出现分段错误

问题描述:

我在很长一段时间内在Cpp中编程,而我被困在一个地方。下面的代码中给出(其长所以患者):将元素推送到队列时出现分段错误

bool mazerouter(int xs, int ys, int ps, int xt, int yt, int pt) 
{ 
    int n = gn; int w = gw; 
    // The expansion list as maintained by the maze router. Could be declared as a class variable 
    // but then, we need to find a way to empty the queue every time mazerouter is exited. 
    queue <Wire_seg> explist; 

    // Step 1: mark all the track segments that are available and adjacent to target as "t". 
    // this depends on pin number. 
    vector < vector<int> > target = getWireSegments(xt, yt, pt); 
    //int skip = 1/fc_in; 
    int i,j; 

    std::vector < std::vector <Wire_seg> > HorzWire = fpga.getHorzWire(); 
    std::vector < std::vector <Wire_seg> > VertWire = fpga.getVertWire();  
    for (i = 0; i < target.size(); i = i+2) 
    { 
     if (pt == 1 || pt == 3) 
     { 
      if (VertWire[ target[i][0]][ target[i][1] ].getTag() == "a") 
       VertWire[ target[i][0] ][ target[i][1] ].setTag("t"); 
     } 
     else if (pt == 2) 
     { 
      if (HorzWire[ target[i][0]][ target[i][1] ].getTag() == "a") 
       HorzWire[ target[i][0] ][ target[i][1] ].setTag("t"); 
     } 
    } cout<<"Completed routing step 1\n"; 

    // Step 2: mark all the track segments that are available and adjacent to source as "o". 
    // Push all the wire_segs in expansion list. 
    vector < vector<int> > source = getWireSegments(xs, ys, ps); 
    //skip = 1/fc_out; 
    len = 0; // for initialization of the source wire segments 
    for (i = 0; i < source.size(); i = i+1) 
    { 
     if (HorzWire[ source[i][0] ][ source[i][1] ].getTag() == "a") 
     { 
      HorzWire[ source[i][0] ][ source[i][1] ].setNtag(0); 
      HorzWire[ source[i][0] ][ source[i][1] ].setTag("u"); 
      explist.push(HorzWire[ source[i][0] ][ source[i][1] ]); 
     } 
    } cout<<"Completed routing step 2 and expansion list size: "<<explist.size()<<"\n"; 

    // The while loop 

    bool pathfound = false;  
    vector < vector <int> > h; 
    vector < vector <int> > v; 
    while (!explist.empty()) 
    { 
     Wire_seg ws = explist.front(); 
     cout<<"Completed routing step 3 substep 1 with front's tag:"<<explist.front().getTag()<<"\n"; 
     explist.pop(); 
     h = ws.getHorzCon(); 
     v = ws.getVertCon(); 
     len = ws.getNtag() + 1; 
     int a; 
     for (a = 0; a < h.size(); a++) 
     { 
      if (HorzWire[ h[a][0] ][ h[a][1] ].getTag() == "t") 
      { 
       cout<<"target hit in horzwire\n"; 
       pathfound = true; 

       //path.push_back( vector <string>()); pl++; 
       //path.at(pl).push_back(fpga.getHorzWire(h[a][0], h[a][1]).getUid()); 
       break; 
      } 
      else if (HorzWire[ h[a][0] ][ h[a][1] ].getTag() == "a") 
      { 
       HorzWire[ h[a][0] ][ h[a][1] ].setTag("u");HorzWire[ h[a][0] ][ h[a][1] ].setNtag(len); 
       cout<<"target not found, pushing horzwire("<<h[a][0]<<","<<h[a][1]<<") in explist with new tag:"<<HorzWire[ h[a][0] ][ h[a][1] ].getTag()<<"\n"; 
       explist.push(HorzWire[ h[a][0] ][ h[a][1] ]); 
      } 
     } 
     cout<<"Completed routing step 3 substep 2\n"; 
     for (a = 0; a < v.size(); a++) 
     { 
      if (VertWire[ v[a][0] ][ v[a][1] ].getTag() == "t") 
      { 
       pathfound = true; 
       //path.push_back( vector <string>()); pl++; 
       //path.at(pl).push_back(fpga.getVertWire(v[a][0], v[a][1]).getUid()); 
       break; 
      } 
      else if (VertWire[ v[a][0] ][ v[a][1] ].getTag() == "a") 
      { 
       VertWire[ v[a][0] ][ v[a][1] ].setTag("u"); VertWire[ v[a][0] ][ v[a][1] ].setNtag(len); 
            // the following is the line causing trouble 
       explist.push(VertWire[ v[a][0] ][ v[a][1] ]); <================================================================= 
       cout<<"target not found, pushing vertwire("<<v[a][0]<<","<<v[a][1]<<") in explist with new tag:"<<VertWire[ v[a][0] ][ v[a][1] ].getTag()<<"\n"; 
      } 
     } 
     h.clear(); 
     v.clear(); 
     cout<<"Completed routing step 3 substep 3 and expansion list size: "<<explist.size()<<"\n"; 
    }// end while 
    cout<<"Completed routing step 3\n"; 
    return pathfound; 
}// end mazerouter 

我正在为线分段故障“explist.push(VertWire [V [A] [0]] [V [A] [ 1]]);“已在代码中标记为”< ==“。一旦我评论该行并运行代码,我没有任何错误,但是当然,我找不到解决我的问题的方法。我在做什么错误?任何事情都会有很大的帮助。提前致谢

这个函数做了什么:给定源块(xs,ys)和传入方向(ps,有四个值分别对应东,西,北,南)和目标块(xs,ys)和输出方向(pt,与ps相同),我需要找到连接它们的路线,实际上,我正在FPGA中实现路由,其中​​Wire_seg是逻辑块之间的导线段的类(它是作为Logic_Block类实现的),我需要在逻辑块之间进行路由。就VertWire [v [a] [0]] [v [a] [1]]'的打印值而言,它是一个类,因此我正在访问它的成员变量标签以确保它存在。

@daniel:我已经在使用g ++编译器。

为 “Wire_seg.h” 的代码是:

class Wire_seg 
{ 
// the track number for each wire segment, varies from 0 to w-1. 
int tno; 

// the orientation of the wire segment. 
char ornt;  

// vector to store the indices of all possible connections that can be made from 
// this wire segment. 
std::vector < std::vector<int> > horz_con; 
std::vector < std::vector<int> > vert_con; 

//an unique id given to each wire of the following format "ornt:row:col" 
std::string uid; 

// The tag that helps determine whether this wire is availabel for a path or not. 
// initially all wires are available. 
std::string tag; 

int ntag; 

public:  

Wire_seg() 
{ 
    tag = "a"; 
} 

    void setHorzCon(std::vector < std::vector<int> > h) 
{ 
    horz_con = h; 
} 

void setVertCon(std::vector < std::vector<int> > v) 
{ 
    vert_con = v; 
} 

void setTno(int t) 
{ 
    tno = t; 
} 

void setOrnt(char orientation) 
{ 
    ornt = orientation;  
} 

void setUid(std::string id) 
{ 
    uid = id; 
} 

void setTag(std::string t) 
{ 
    tag.assign(t); 
} 

void setNtag(int t) 
{ 
    ntag = t; 
} 

int getTno() 
{ 
    return tno; 
} 

char getOrnt() 
{ 
    return ornt;  
} 

std::vector < std::vector<int> > getHorzCon() 
{ 
    return horz_con; 
} 

std::vector < std::vector<int> > getVertCon() 
{ 
    return vert_con; 
} 

std::string getUid() 
{ 
    return uid; 
} 

std::string getTag() 
{ 
    return tag; 
} 

int getNtag() 
{ 
    return ntag; 
} 
}; 

我希望这使得问题更加清晰。

+0

你能解释一下这个函数的作用吗?它看起来像你试图用广度优先搜索来解决迷宫,这是正确的吗?什么是电线变量? – Pubby

+0

你试过打印出VertWire [v [a] [0]] [v [a] [1]]的值吗?如果它崩溃,你知道你正在访问超出界限的数组而导致UB。 –

+0

请发布'Wire_seg'的代码,尤其是构造函数/析构函数。 – NPE

您对std::deque的使用看起来很安全,所以如果您遇到分段错误,您可能正在编译一个不执行边界检查的std::vector实现。如果可以的话,打开它。

如果您的环境不提供边界检查,请尝试使用g ++(它会)。或者在std::vector附近写一个简单的包装类,给你所需的接口:size()operator[]似乎是你所需要的。你自己的边界检查也是如此。然后,您将能够看到您在过去的矢量末尾访问的位置。

+0

你如何做你刚刚说的? –