c++ - 我的代码在我的笔记本电脑上的 VS 代码或任何其他 IDE 上运行良好,但在在线 IDE 上,它给出了 SIGABRT 错误
问题描述
有人请帮我处理这段代码。
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
bool common(pair<int,int> a, pair<int,int>, pair<int,int>);
vector<pair<int,int> > merge(vector<pair<int,int> > a, vector<pair<int,int> > b, int l1, int l2);
vector<pair<int,int> > merge_sort(vector<pair<int,int> > a, int l);
int binarySearch(vector<pair<int,int> > arr, int l, int r, int x) ;
int main(){
int t = 0;
cin >> t;
int n = 0;
bool valid = false;
bool jd = false;
int cases = 0;
while(t-->0){
cout << "start\n";
cases++;
cin >> n;
valid = true;
jd = false;
vector<pair<int,int> > vect1(n, std::make_pair(-1, -1));
vector<pair<int,int> > vect(n, std::make_pair(-1, -1));
vector<char> ass(n,' ');
vector<char> final(n, ' ');
for (int i=0;i<n;i++){
cin >> vect1[i].first;
cin >> vect1[i].second;
}
vect = merge_sort(vect1,n);
// for (int i=0;i<n;i++){
// cout << vect[i].first << " " << vect[i].second << endl;
// }
int m =0;
for (int i=0;i<n-2;i++){
if (common(vect[i],vect[i+1],vect[i+2])){
valid = false;
break;
}
if(jd){
ass[i]='J';
}
else{
ass[i]='C';
}
jd = !jd;
m++;
}
if(jd){
ass[m] = 'J';
ass[m+1] = 'C';
}
else{
ass[m] = 'C';
ass[m+1] = 'J';
}
if (valid){
for (int i=0;i<n;i++){
int index = binarySearch(vect,0,(n-1),vect1[i].first);
final[i] = ass[index];
// cout << ass[i];
}
// cout << endl;
cout << "Case #" << cases << ": ";
for (int i=0;i<n;i++){
cout << final[i];
}
cout << endl;
}
else{
cout << "Case #" << cases << ": IMPOSSIBLE" << endl;
}
cout << "end\n";
}
return 0;
}
bool common(pair<int,int> a, pair<int,int> b, pair<int,int> c){
if (b.first<a.second){
/*common interval is b.first to min(b.second,a.second)*/
if(c.first<min(a.second,b.second)){
return true;
}
}
return false;
}
vector<pair<int,int> > merge(vector<pair<int,int> > a, vector<pair<int,int> > b, int l1, int l2){
// cout << "called1" << endl;
vector<pair<int,int> > c(l1+l2, std::make_pair(-1, -1));
int i1 = 0;
int i2 = 0;
int i3 = 0;
// cout << i1 << i2 << i3;
while(i1<l1 && i2 <l2){
if(a[i1].first<=b[i2].first){
c[i3++] = a[i1++];
}
else{
c[i3++] = b[i2++];
}
}
while (i2< l2){
c[i3++] = b[i2++];
}
while (i1<l2){
c[i3++] = a[i1++];
}
return c;
}
vector<pair<int,int> > merge_sort(vector<pair<int,int> > a, int l){
if (l==0 | l==1) return a;
vector<pair<int,int> > left(l/2, std::make_pair(-1, -1));
vector<pair<int,int> > right(l-l/2, std::make_pair(-1, -1));
for (int i=0;i<l/2;i++){
left[i] = a[i];
}
for (int i = 0;i<l-l/2;i++){
right[i] = a[i+l/2];
}
// cout << "sorted3\n";
left = merge_sort(left, l/2);
right = merge_sort(right, l-l/2);
vector<pair<int,int> > sorted(l, std::make_pair(-1, -1));
sorted = merge(left,right,l/2,(l-l/2));
// cout << "sorted3\n";
return sorted;
}
int binarySearch(vector<pair<int,int> > arr, int l, int r, int x){
if (r >= l) {
int mid = l + (r - l) / 2;
if (arr[mid].first == x)
return mid;
if (arr[mid].first > x)
return binarySearch(arr, l, mid - 1, x);
return binarySearch(arr, mid + 1, r, x);
}
cout << "[binarySearchError]" << endl;
return -1;
}
输入是:
4
3
360 480
420 540
600 660
3
0 1440
1 3
2 4
5
99 150
1 100
100 301
2 5
150 250
2
0 720
720 1440
它在 VS Code 上运行良好。但在任何在线 IDE 上,它都会显示以下运行时 SIGABRT 错误。
*** Error in `./prog': free(): invalid next size (fast): 0x000055718b7fad40 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bcb)[0x2b6a09886bcb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76f96)[0x2b6a0988cf96]
/lib/x86_64-linux-gnu/libc.so.6(+0x7778e)[0x2b6a0988d78e]
./prog(+0x119a)[0x55718b3d319a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x2b6a098362b1]
./prog(+0x14da)[0x55718b3d34da]
======= Memory map: ========
2b6a08b36000-2b6a08b59000 r-xp 00000000 fe:01 1705825 /lib/x86_64-linux-gnu/ld-2.24.so
2b6a08b59000-2b6a08b5d000 rw-p 00000000 00:00 0
2b6a08b66000-2b6a08b6b000 rw-p 00000000 00:00 0
2b6a08d59000-2b6a08d5a000 r--p 00023000 fe:01 1705825 /lib/x86_64-linux-gnu/ld-2.24.so
2b6a08d5a000-2b6a08d5b000 rw-p 00024000 fe:01 1705825 /lib/x86_64-linux-gnu/ld-2.24.so
2b6a08d5b000-2b6a08d5c000 rw-p 00000000 00:00 0
2b6a08d5c000-2b6a08ece000 r-xp 00000000 fe:01 1835225 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a08ece000-2b6a090ce000 ---p 00172000 fe:01 1835225 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a090ce000-2b6a090d8000 r--p 00172000 fe:01 1835225 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a090d8000-2b6a090da000 rw-p 0017c000 fe:01 1835225 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
2b6a090da000-2b6a090de000 rw-p 00000000 00:00 0
2b6a090de000-2b6a091e1000 r-xp 00000000 fe:01 1705854 /lib/x86_64-linux-gnu/libm-2.24.so
2b6a091e1000-2b6a093e0000 ---p 00103000 fe:01 1705854 /lib/x86_64-linux-gnu/libm-2.24.so
2b6a093e0000-2b6a093e1000 r--p 00102000 fe:01 1705854 /lib/x86_64-linux-gnu/libm-2.24.so
2b6a093e1000-2b6a093e2000 rw-p 00103000 fe:01 1705854 /lib/x86_64-linux-gnu/libm-2.24.so
2b6a093e2000-2b6a093f8000 r-xp 00000000 fe:01 1705792 /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a093f8000-2b6a095f7000 ---p 00016000 fe:01 1705792 /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a095f7000-2b6a095f8000 r--p 00015000 fe:01 1705792 /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a095f8000-2b6a095f9000 rw-p 00016000 fe:01 1705792 /lib/x86_64-linux-gnu/libgcc_s.so.1
2b6a095f9000-2b6a09611000 r-xp 00000000 fe:01 1705811 /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09611000-2b6a09810000 ---p 00018000 fe:01 1705811 /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09810000-2b6a09811000 r--p 00017000 fe:01 1705811 /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09811000-2b6a09812000 rw-p 00018000 fe:01 1705811 /lib/x86_64-linux-gnu/libpthread-2.24.so
2b6a09812000-2b6a09816000 rw-p 00000000 00:00 0
2b6a09816000-2b6a099ab000 r-xp 00000000 fe:01 1705948 /lib/x86_64-linux-gnu/libc-2.24.so
2b6a099ab000-2b6a09baa000 ---p 00195000 fe:01 1705948 /lib/x86_64-linux-gnu/libc-2.24.so
2b6a09baa000-2b6a09bae000 r--p 00194000 fe:01 1705948 /lib/x86_64-linux-gnu/libc-2.24.so
2b6a09bae000-2b6a09bb0000 rw-p 00198000 fe:01 1705948 /lib/x86_64-linux-gnu/libc-2.24.so
2b6a09bb0000-2b6a09bb4000 rw-p 00000000 00:00 0
2b6a0c000000-2b6a0c021000 rw-p 00000000 00:00 0
2b6a0c021000-2b6a10000000 ---p 00000000 00:00 0
55718b3d2000-55718b3d5000 r-xp 00000000 fe:01 2377562 /home/P4aATu/prog
55718b5d4000-55718b5d5000 r--p 00002000 fe:01 2377562 /home/P4aATu/prog
55718b5d5000-55718b5d6000 rw-p 00003000 fe:01 2377562 /home/P4aATu/prog
55718b7e7000-55718b819000 rw-p 00000000 00:00 0 [heap]
7ffc9328d000-7ffc932ae000 rw-p 00000000 00:00 0 [stack]
7ffc93317000-7ffc93319000 r--p 00000000 00:00 0 [vvar]
7ffc93319000-7ffc9331b000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
我找不到错误,我被困了好几天。在我的主要功能中,我在 while 循环的开头打印“start”并在循环结束时打印“end”。我的 while 循环预计会运行 4 次。对于 while 循环的第一次,它一直到循环结束,执行 'cout << "end\n"' 但不会再次启动 while 循环。谢谢
解决方案
错误在这里(在末尾merge
)。
while (i1<l2){
c[i3++] = a[i1++];
}
它应该是
while (i1<l1){
c[i3++] = a[i1++];
}
使用调试器,我在五分钟内发现了这个错误(也感谢问题中的优秀信息)。是时候学习如何使用调试器了?
此外,我不建议混合变量名称i1
和l1
,太容易让这些混淆。
推荐阅读
- c++ - 更快的 RAM 吞吐量
- sql - Oracle SQL:在 UTL 匹配中添加大小写
- sql - Using a trigger to insert values into another table unless value exists in which case update
- javascript - Play youtube video in full screen
- reactjs - React 导出 useContext 导致错误
- php - header() 函数在我的实时网络托管中不起作用
- javascript - setTimeout on a high volume data
- php - 为什么加载需要这么长时间?
- python - Python ctypes 传递指针并获取空指针访问
- android - Dagger2 - 如何每次提供一个新实例