传递参数时引发异常
exception thrown while passing parameters
我收到错误Exception thrown at 0x009523B9 in Project5.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00E42ED4).
在下面的程序中
测试用例:
5
1 2 3 4 5
1
Q 2 4
执行此行时出现错误 struct node query(int index, int start, int endv, int l, int r)
那是query
函数第一次在 main 中被调用的时候
参数就像在抛出异常时一样应该是 query(0,0,4,1,3)
但它们会自动更改为query(0,1,1,1,3)
我做错了哪里
这是基于分段树的问题 spoj KGSS
#include<iostream>
#include<algorithm>
#include<climits>
#pragma warning(disable:4996) //disable scanf warning
using namespace std;
struct node {
long long int maxsum;
long long int maxnum;
};
long long int a[100];
struct node tree[100];
void build(int index, int start, int endv) {
if (start == endv) {
tree[index].maxsum = a[start];
tree[index].maxnum = a[start];
}
else {
int mid = (start + endv) / 2;
build(2 * index + 1, start, mid);
build(2 * index + 2, mid + 1, endv);
tree[index].maxnum = max(tree[2 * index + 1].maxnum, tree[2 * index + 2].maxnum);
tree[index].maxsum = max(tree[2 * index + 1].maxnum + tree[2 * index + 2].maxnum, max(tree[2 * index + 1].maxsum, tree[2 * index + 2].maxsum));
}
}
struct node query(int index, int start, int endv, int l, int r) {
struct node result;
result.maxnum = INT_MIN;
result.maxsum = INT_MIN;
if (l > endv || r < start)
return result;
int mid = (start + endv) / 2;
struct node left, right;
left = query(index, start, mid, l, r);
right = query(index, mid + 1, endv, l, r);
tree[index].maxnum = max(left.maxnum, right.maxnum);
tree[index].maxsum = max(left.maxnum + right.maxnum, max(left.maxsum, right.maxsum));
return tree[index];
}
void update(int index, int start, int endv, int aidx, long long int value) {
if (start == endv) {
a[aidx] = value;
tree[index].maxsum = value;
tree[index].maxnum = value;
}
else {
int mid = (start + endv) / 2;
if (aidx <= mid) {
update(2 * index + 1, start, mid, aidx, value);
}
else {
update(2 * index + 2, mid + 1, endv, aidx, value);
}
tree[index].maxnum = max(tree[2 * index + 1].maxnum, tree[2 * index + 2].maxnum);
tree[index].maxsum = max(tree[2 * index + 1].maxnum + tree[2 * index + 2].maxnum, max(tree[2 * index + 1].maxsum, tree[2 * index + 2].maxsum));
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
build(0, 0, n - 1);
//for(int i = 0)
int q;
cin >> q;
for (int i = 0; i < q; i++) {
int l, r;
char ap;
cin >> ap >> l >> r;
if (ap == 'U') {
update(0, 0, n - 1, l - 1, r);
}
else {
struct node temp = query(0, 0, n - 1, l - 1, r - 1);
printf("%lldn", temp.maxsum);
}
}
}
注意 ->我用了result.maxnum = INT_MIN;
result.maxsum = INT_MIN;
在查询函数和result.maxnum
和result.maxsum
是long long int
类型,我正在为它们分配INT_MIN
。
这是因为有时从递归的两侧我得到最小值和添加这些值并将它们存储在 int
变量上会导致整数溢出,这就是我使用long long int
有人可以提供处理这种情况的方法,或者这没关系
scanf("%d", &a[i]);
当a[i]
类型为 long long int
时不正确。C++将 I/O 与 C/O 混合使用也不是一个好主意。没有错
cin >> a[i];
但主要问题是您有一个堆栈溢出。在您的示例中
query(0,0,4,1,3) ->
query(0,0,2,1,3) ->
query(0,0,1,1,3) ->
query(0,0,0,1,3) ->
return result
query(0,1,1,1,3) ->
query(0,1,1,1,3) ->
query(0,1,1,1,3) ->
query(0,1,1,1,3) ->
query(0,1,1,1,3) ->
query(0,1,1,1,3) ->
query(0,1,1,1,3) ->
BOOM!! stack overflow
不太确定该怎么做才能解决它,因为我不明白代码。我会想这样
if (start >= endv)
return result;
一开始会有所帮助,但我不太确定。
相关文章:
- 有没有办法捕获 STL 函数未被赋予正确参数的异常?
- 调用参数不是原子参数的函数是此代码引发异常的原因吗?
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 当构造函数的参数类型错误时引发异常
- 在 Myfile.exe 中0x00831D39时未处理的异常:0xC00000FD:堆栈溢出(参数:0x0000000
- 为什么可以指定异常规范的参数类型
- 如何避免字符串到整数转换情况下的无效参数异常
- basic_string::替换的超出范围异常,而在范围内,正如调试相同参数的输出所证明的那样
- 自动存储中没有无参数构造函数的类对象和异常
- 为什么初始化构造函数列表参数时会发生异常?
- JNI自定义异常具有多个参数
- 防止在将未引发的异常作为参数传递时在"throw e;"中切片
- 传递参数时引发异常
- 如果在可变参数模板解包中达到终止函数,则出现异常
- 与构造函数参数相关的异常安全的习语
- 从 noexcept 函数参数的构造函数引发的异常会立即导致对 std::terminate() 的调用吗?
- 插入>>运算符重载:从 CIN 检索对象的 CTOR 参数时的异常处理
- 接收器参数和异常
- 抛出类似可变参数宏包装的函数,替换抛出的异常