【问题标题】:How do i fix Runtime Error [SIGABRT] Assertion Failed如何修复运行时错误 [SIGABRT] 断言失败
【发布时间】:2020-06-20 13:23:13
【问题描述】:

当我尝试在我的程序中使用 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(): Assertion `arr[i]>b' failed.

【问题讨论】:

  • 你知道assert 做什么吗?它告诉您arr 中的某些值不大于b。您有示例输入,您应该能够找出arrb 中的值。
  • 是的,我知道它的作用,这就是我使用它的原因。我这里用它来满足问题约束的要求。
  • 在这种情况下,它按设计工作,您的代码中没有什么需要修复的。您的输入数据不正确。

标签: c++ runtime-error sigabrt


【解决方案1】:

assert 的想法是在不满足某些条件时使用 SIGABRT 来粉碎您的程序,因此,它完全按照它在这种情况下应该做的事情。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2016-02-21
    • 1970-01-01
    • 2019-12-16
    相关资源
    最近更新 更多