簡體   English   中英

溢出或 Memory 錯誤 c++

[英]Overflow or Memory error c++

這可以被認為是一個家庭作業問題。 這個問題是眾所周知的:“ 你有一個三角形的數字,你必須找到最大的和

沒問題,我前段時間在 python 中做了一個解決方案,完美無瑕。 但是現在在c++中,解是75256,我的答案是9729。所以問題是類型short溢出了。

因此,為了解決這個問題,我假設將數組更改為 int 類型可以解決所有問題。但是,當聲明數組a[1001][1001]時,它會凍結(我猜是 memory 錯誤)。

有誰知道該怎么做? 我用另一個 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;    
}

注意:我不是在尋找解決方案,只是一種處理溢出的好方法,示例贊賞!

如果您對 memory 有疑問,請嘗試動態分配您的數組:

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

你有一個 1001x1001 短褲的數組......那是 1002001*2 字節。 這一切都在您的本地堆棧上進行。 根據您的系統可能太大。 嘗試使用 malloc 為您的“三場”分配空間。 看看這對你有什么作用

您會得到堆棧溢出而不是數字溢出!

將數組移動到主外部的 static memory ,因此它不使用堆棧。

我檢查溢出的方法是檢查明顯虛假的結果。 例如,

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

溢出一個 int 是一個 UB。 溢出無符號整數值在標准中定義。

因此,唯一的方法是在執行操作之前手動檢查值,並確保它不會溢出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM