Как исправить ошибку во время выполнения [SIGABRT] Ошибка подтверждения - PullRequest
0 голосов
/ 08 марта 2020

, когда я пытаюсь использовать функцию assert в моей программе, она выводит код и выдает ошибку времени выполнения. Может кто-нибудь сказать мне, в чем проблема с моим кодом?

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long int a;
    cin>>a;
    while(a--)
    {
        long long int a,b;
        cin>>a>>b;
        long long int arr[a];
        long long int arr1[a];
        long long int z=b;
        long long int sum[z];
        for(int i=0;i<z;i++)
        {
            sum[i]=0;
        }
        for(int i=0;i<a;i++)
        {
            cin>>arr[i];
        }

        for(int i=0;i<a;i++)
        {
            cin>>arr1[i];
        }
        for(int i=0;i<a;i++)
        {
            assert(arr[i]>b);
            assert(arr[i]<1);
            assert(arr1[i]>50);
            assert(arr1[i]<0);
        }
        for(int i=1;i<=b;i++)
        {
            for(int j=0;j<a;j++)
            {
                if(arr[j]==i)
                {
                    sum[i-1]=sum[i-1]+arr1[j];
                }
            }
        }
        sort(sum,sum+z);
        long long int c[z]={0};
        long long int j=0;
        for(int i=0;i<z;i++)
        {
            if(sum[i]!=0)
            {
                c[j]=sum[i];
                j++;
            }
        }
        cout<<c[0];
    }
    return 0;
}

Ввод: 1 6 4 1 2 3 3 2 2 7 3 9 1 1 1

Вывод: prog: prog. cpp: 30: int main (): сбой утверждения `arr [i]> b '.

1 Ответ

0 голосов
/ 08 марта 2020

Идея assert состоит в том, чтобы выполнить sh вашу программу, если определенное условие не выполнено, с использованием SIGABRT, поэтому она делает именно то, что должна делать в этом случае.

Прежде всего, я настоятельно рекомендуем вам реорганизовать этот код, поскольку он нечитабелен, и это усложняет понимание ошибки - невозможно понять , что делает этот код с первого взгляда.

Во-вторых, если вы работаете с linux, утверждения вызовут дамп ядра, который представляет собой файл, содержащий состояние памяти программы при ее сбое. С этим дампом ядра вы можете заглянуть в последний момент программы, используя инструмент под названием GDB (GNU debugger). Это не самый красивый, но мощный.

Другой правильный способ - добавить распечатки (или логи) в ваш код, чтобы вы могли видеть, что происходит, и почему вы получаете утверждение.

Наконец, assert - это инструмент, предназначенный для документирования вашего инварианта вашего кода и обеспечения того, чтобы всякий раз, когда этот инвариант больше не был корректным (из-за ошибки или неправильного использования ваш код), программа сразу же взломает sh, сообщая об ошибке как можно скорее.

...