Мой код работает нормально на VS-коде или любой другой IDE на моем ноутбуке, но в онлайн-IDE выдает ошибку SIGABRT - PullRequest
1 голос
/ 13 апреля 2020

Кто-нибудь, пожалуйста, помогите мне с этим кодом.

#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]

Я не могу найти ошибку, и я застрял на несколько дней. В своей основной функции я печатаю «начало» в начале, пока l oop, и печатаю «конец» в конце l oop. Ожидается, что мое время l oop будет запущено 4 раза. В первый раз, когда l oop, он идет до конца l oop, выполнил 'cout << "end \ n"', но не запускает снова, пока l oop. Спасибо </p>

1 Ответ

1 голос
/ 13 апреля 2020

Ошибка здесь (в конце merge).

while (i1<l2){
    c[i3++] = a[i1++];
}

Это должно быть

while (i1<l1){
    c[i3++] = a[i1++];
}

Используя отладчик, я нашел эту ошибку буквально через пять минут ( также благодаря отличной информации в вопросе). Время узнать, как использовать отладчик?

Также я бы не рекомендовал смешивать имена переменных, такие как i1 и l1, слишком легко, чтобы запутать их.

...