溢出或内存错误c++
Overflow or Memory error c++
这可以被认为是一个家庭作业问题。这个问题是众所周知的:"你有一个三角形的数字,你必须找到最大的和"
好吧,没问题,我前段时间在python中做了一个解决方案,完美无瑕。但现在在c++中,解决方案是75256,我的答案是9729。所以问题是类型short
溢出。
因此,为了解决这个问题,我假设将数组更改为int类型可以解决所有问题。。但是当声明一个数组a[1001][1001]
时它就冻结了(我猜是内存错误)。
有人知道该怎么办吗?我尝试了另一个int,每当a
中的值大于32767时,它就会增加,但我的解决方案仍然是300?(代码有效-在许多较小的代码上测试)
#include <iostream>
#include <fstream>
int main() {
std::ofstream fout ("numtri.out");
std::ifstream fin ("numtri.in");
short trifield[1001][1001] = {0};
int Rows, tmp=0;
fin >> Rows;
for (int x = 0; x<Rows;x++)
for (int nr = 0; nr<=x;nr++){
fin >> tmp;
trifield[x][nr] = tmp;}
for (int y = (Rows-2); y > -1; y--)
for (int x = 0; x <= y+1; x++) {
int a = trifield[y+1][x];
int b = trifield[y+1][x+1];
if (a > b) trifield[y][x] += a;
else trifield[y][x] += b;
}
fout << trifield[0][0] << std::endl;
return 0;
}
注意:我不是在寻找解决方案,只是一个处理溢出的好方法,示例不胜感激!
如果内存有问题,请尝试动态分配数组:
short** trifield = new short[1001][1001];
您有一个1001x1001短裤的数组。。。就是1002001*2个字节。这些都在你的本地堆栈上。根据您的系统,它可能太大。试着用malloc为您的"trifield"分配空间。看看这对你有什么帮助
您得到的是堆栈溢出,而不是数字溢出!
将数组移动到main之外的静态内存中,这样它就不会使用堆栈。
我检查溢出的方法是检查明显虚假的结果。例如,
if (myInt + 1 < myInt) {
// Overflow condition
cerr << "Overflow" << endl;
}
else {
myInt++;
}
溢出的int是UB。标准中定义了溢出的无符号int值。
因此,唯一的方法是在执行操作之前手动检查值,并确保它不会溢出。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'