简体   繁体   中英

Overflow or Memory error c++

This could be considered a homework question. This problem is wel known: " you have a triangle of numbers and you have to find the greatest sum "

well no problem, I've made a solution in python some time ago, works flawless. But now in c++, the solution is 75256, my answer is 9729. So the problem is that the type short overflows.

So to fix this, I assumed changing my array to type int would solve everything.. but then, when declaring an array a[1001][1001] it freezes (i guess memory error).

anyone know what to do? I tried something with another int, and whenever the value in a got bigger than 32767 it would increment, but my solution then still is off 300? (the code works - tested on many smaller ones)

#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;    
}

note: I'm not looking for the solution, just a good way to deal with overflows, examples appreciated!

If you have issues with memory try to assign your array dynamically:

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

You have an array of 1001x1001 shorts... that's 1002001*2 bytes. That's all going on your local stack . Depending on your system that could be TOO big. Try allocating the space for your 'trifield' with a malloc instead. See what that does for you

You get a stack overflow instead of a numeric overflow!

Move the array to static memory outside of main, so it doesn't use the stack.

The way I check for overflow is to check for an obviously bogus result. For instance,

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

Overflowing an int is an UB. Overflowing an unsigned int value is defined in the standard.

So, the only way is to manually check the values before doing the operation, and make sure it doesn't overflow.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM