c++ - 如何修复运行时错误 [SIGABRT] 断言失败
问题描述
当我尝试在我的程序中使用断言函数时,它会转储代码并给出运行时错误。谁能告诉我我的代码有什么问题?
#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 的想法是如果不满足某些条件,则使用 SIGABRT 粉碎您的程序,因此,它完全按照它在这种情况下应该做的事情。
首先,我强烈建议你重新组织这段代码,因为它不可读,这使得理解错误变得更加困难 - 一眼就无法理解这段代码的作用。
其次,如果你在 linux 上工作,asserts 会导致 core dump,这是一个包含程序崩溃时的内存状态的文件。通过这个核心转储,您可以使用名为 GDB(GNU 调试器)的工具窥探程序的最后时刻。它不是最漂亮的,但它很强大。
另一种有效的方法是将打印(或日志)添加到您的代码中,这样您就可以看到发生了什么,以及为什么得到断言。
最后,assert 是一种工具,旨在记录您的代码的不变量,并确保只要该不变量不再正确(由于错误或滥用代码),程序将立即崩溃,将错误暴露为尽快。
推荐阅读
- python - np.mean() 的值错误?
- azure - 如何在慢速 Internet 连接上发布 Azure Web App?
- angular - 如何使用 Angular 7 前端和 Laravel 后端在 Firebase 上存储图像?
- sql-server - SQL Server 将硬编码日期确定为更大的日期?
- yocto - polkit-0.113-r0 do_configure:功能失败:do_configure
- javascript - 在数据表中使用表单时,Ajax 调用返回空模型?
- python - Matplotlib 图中的第二行不准确/在整个网格中运行
- r - 如何修复 nls 模型上的“未使用的参数”错误
- mysql - 如何从数据库中选择分配给他们的书籍数量的所有作者?
- python-3.x - 使用 pyodbc 连接到本地 sql 服务器时出现登录超时过期错误