Runtime Error:Segmentation fault oj时出现上述错误,在VS2013中正常运行,也没有warning,不知问题在哪里或者可能在哪里? #include <iostream> #include <vector> using namespace std; class ip { public: int m; ip() :id(3){} void save(); //一边插入一边排序 long long int search(long long int V); //找V所在ID private: int T, n; vector<vector<long long int> > id; long long int dich(int left, int right,long long int V); //二分法定位 }; void ip::save() { cin >> T >> n; long long int a, b, Id; int j; for (int i = 0; i < n; ++i) { cin >> a >> b >> Id; id[0].push_back(a); id[1].push_back(b); id[2].push_back(Id); for (j = i; j >0 && id[0][j-1]>a; --j) { id[0][j] = id[0][j - 1]; id[1][j] = id[1][j - 1]; id[2][j] = id[2][j - 1]; } id[0][j] = a; id[1][j] = b; id[2][j] = Id; } cin >> m; } long long int ip::search(long long int V) { if (long long int x=dich(0, n-1,V)) return x; else return -1; } long long int ip::dich(int left, int right,long long int V) { if (V<id[0][left] || V > id[1][right]) return -1; int mid; mid = (left + right) / 2; if (V >= id[0][mid] && V <= id[1][mid]) return id[2][mid]; else if (V < id[0][mid]) return dich(left, mid, V); else return dich(mid + 1, right, V); } int main() { ip ip_s; long long int v; ip_s.save(); for (int i = ip_s.m; i > 0; --i) { cin >> v; cout << ip_s.search(v) << endl; } return 0; } |
|
看了半天,木有看出来哪里有问题,楼主有测试数据吗
|
|
5分 |
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
|
样例输入 这个是给的测试数据 |
|
这个是在VS里面的操作还是?主要是在VS中运行完全正确,不会崩溃。但是提交会显示上述错误。 |
|
我在自己的环境测试,也没有问题,最少楼主给出来的测试用例是没问题的,估计是特殊的测试才会出现问题
|
|
30分 |
long long int ip::search(long long int V)
{ if (long long int x=dich(0, n-1,V)) return x; else return -1; } 如果查出来ID正好是0,楼主岂不是直接返回-1? |
5分 |
段错误,这个应该是linux下遇到的吧?
难道没有coredump嘛?用gdb可以详细定位问题行啊 |
这个问题的确是个bug。后面自己又写了个map的省事一些而且避免了这个问题。 后面跟提供的代码作比较,发现确实是个别测试用例会出问题,没有考虑到的就是: |
|
上面两位说的linux下的查错方法没有去试,不过我想即使是在linux下,由于没有考虑到n=0这一测试用例,恐怕也难以找到问题所在,还是感谢~~
感觉自己还是得有空好好用linux |
|
把自己写的map版的也放过来~~
已经加上了n==0的条件判断 #include <iostream> #include <map> #include <utility> using namespace std; typedef long long int lli; struct st { lli x, y; st() :x(0), y(0){} st(lli a, lli b) :x(a), y(b){} friend bool operator < (const struct st &ls, const struct st &rs); }; inline bool operator < (const struct st &ls, const struct st &rs) { return (ls.x < rs.x && ls.y < rs.y); } lli search(lli x, const map<st, lli> &id) { st tmp = st(x, x); auto it = id.find(tmp); if (it == id.end()) return -1; else return it->second; } int main() { int T; unsigned int n,m; st key; lli ID, V; map<st, lli> id; cin >> T; for (; T > 0; --T) { cin >> n; for (unsigned int i=n; i>0; --i) { cin >> key.x >> key.y >> ID; id.insert(pair<st, lli>(key, ID)); } cin >> m; for (; m > 0; --m) { cin >> V; if (n == 0) cout << "-1" << endl; else cout << search(V, id) << endl; } } return 0; } |
|
inline bool operator < (const struct st &ls, const struct st &rs)
{ return (ls.x < rs.x && ls.y < rs.y); } 哈哈,楼主你这个写的有问题 不是应该这样吗: return ls.x < rs.x || (ls.x == rs.x && ls.y < rs.y) |
|
Linux:
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令 |