溢出或内存错误c ++

时间:2011-05-23 18:28:54

标签: c++ arrays

这可以被视为一个家庭作业问题。 这个问题众所周知:“you have a triangle of numbers and you have to find the greatest sum

没问题,我前段时间在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;    
}

注意:我不是在寻找解决方案,只是处理溢出的好方法,示例赞赏!

5 个答案:

答案 0 :(得分:3)

如果您遇到内存问题,请尝试动态分配数组:

short** trifield = new short[1001][1001];

答案 1 :(得分:2)

你有一个1001x1001短裤阵列......那是1002001 * 2字节。这一切都在你的local stack。取决于你的系统可能太大了。尝试使用malloc为“trifield”分配空间。看看它为你做了什么

答案 2 :(得分:1)

你得到堆栈溢出而不是数字溢出!

将数组移动到main之外的静态内存中,因此它不使用堆栈。

答案 3 :(得分:1)

我检查溢出的方法是检查明显的虚假结果。例如,

if (myInt + 1 < myInt) {
    // Overflow condition
    cerr << "Overflow" << endl;
}
else {
    myInt++;
}

答案 4 :(得分:0)

溢出int是一个UB。溢出无符号的int值在标准中定义。

因此,唯一的方法是在执行操作之前手动检查值,并确保它不会溢出。