我如何修复运行时错误 [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 是一种工具,旨在记录您的代码的 不变性 ,并确保无论何时这个不变性是不再正确(由于错误或误用您的代码),程序将立即崩溃,尽快暴露错误。
当我尝试在我的程序中使用断言函数时,它会转储代码并给出运行时错误。谁能告诉我我的代码有什么问题吗?
#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 是一种工具,旨在记录您的代码的 不变性 ,并确保无论何时这个不变性是不再正确(由于错误或误用您的代码),程序将立即崩溃,尽快暴露错误。