#c #queue #segmentation-fault
#c #очередь #ошибка сегментации
Вопрос:
Я программирую на 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 1n";
// 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 horzwiren";
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 2n";
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 3n";
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;
}
};
Я надеюсь, что это делает проблему более понятной.
Комментарии:
1. Не могли бы вы объяснить, что делает эта функция? Похоже, вы пытаетесь решить лабиринт, используя поиск в ширину, это правильно? Что такое проводные переменные?
2. Вы пробовали распечатать значение
VertWire[ v[a][0] ][ v[a][1] ]
. Если он выходит из строя, вы знаете, что обращаетесь к массиву за пределами границ, вызывая UB.3. Пожалуйста, опубликуйте код для
Wire_seg
, особенно. конструкторы / деструктор.4. Этот фрагмент кода неполон, и я не могу поверить, что он минимальный.
Ответ №1:
Ваше использование std::deque
кажется довольно безопасным, поэтому, если вы получаете ошибку сегментации, возможно, вы компилируете с реализацией std::vector
, которая не выполняет проверку границ. Включите это, если сможете.
Если ваша среда не обеспечивает проверку границ, попробуйте использовать g (который обеспечивает). Или напишите простой класс-оболочку std::vector
, который предоставляет вам требуемый интерфейс: size()
и operator[]
, похоже, это все, что вам нужно. И так сделайте свою собственную проверку границ. Тогда вы сможете увидеть, к чему вы обращаетесь после конца вектора.
Комментарии:
1. Как вы делаете то, что вы только что сказали?