我如何修复运行时错误 [SIGABRT] 断言失败

How do i fix Runtime Error [SIGABRT] Assertion Failed

当我尝试在我的程序中使用断言函数时,它会转储代码并给出运行时错误。谁能告诉我我的代码有什么问题吗?

#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;
}

Input: 1 6 4 1 2 3 3 2 2 7 3 9 1 1 1

Output : prog: prog.cpp:30: int main(): Assertion `arr[i]>b' failed.

assert 的想法是在不满足特定条件时使用 SIGABRT 破坏您的程序,因此,它在这种情况下完全按照预期的方式执行。

首先,我强烈建议你重新组织这段代码,因为它不可读,这使得错误更难理解——无法理解什么这段代码一目了然。

其次,如果您在 linux 上工作,断言将导致核心转储,这是一个包含程序崩溃时的内存状态的文件。通过这个核心转储,您可以使用称为 GDB(GNU 调试器)的工具查看程序的最后时刻。它不是最漂亮的,但它很强大。

另一个有效的方法是将打印(或日志)添加到您的代码中,这样您就可以看到发生了什么,以及为什么会得到断言。

最后,assert 是一种工具,旨在记录您的代码的 不变性 ,并确保无论何时这个不变性是不再正确(由于错误或误用您的代码),程序将立即崩溃,尽快暴露错误。