Re: [問題] 為什麼陣列從main中拿到global答案就錯?
我想問題可能是因為stack太小,所以改用static後,
在sum這個function內return時,受到static的影響,所以執行結果不同。
找了很多方法都很麻煩,剛剛找到一個最簡單的解決方法,
就是直接把stack的預設大小改大。
Visual studio 可以調整stack的大小
專案->屬性->組態屬性->連結器->系統
project->setting->link->system
將堆疊預留大小改大就可以了
然後就可以直接int a[1000][1000]; 不用加static。
※ 引述《initial1635 (SurprisingTW)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Microsoft Visual Studio C++
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: stdio.h
: iostream
: 問題(Question):
: 存放input的二為陣列放到全域之後答案就錯掉了
: 餵入的資料(Input):
: 2
: 2
: -1 1
: 3 4
: 3
: -1 -1 -1
: 2 2 2
: -3 -3 -3
: 預期的正確結果(Expected Output):
: 5
: -2
: 錯誤結果(Wrong Output):
: 5
: -1
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: #include<stdio.h>
: #include<iostream>
: using namespace std;
: #define MAX 1000
: int n=0;
: int m[MAX][MAX];
: int r=0;
: int t=0;
: int sum(int a[][1000],int i, int j)
: {
: if(i<0)i=0;
: else if(j<0)j=0;
: else if(j>n-1)j=n-1;
: else if(a[i-1][j-1] > a[i-1][j] && a[i-1][j-1] > a[i-1][j+1]){
: //cout <<t;
: m[t][r++]=a[i][j];
: return a[i][j]+sum(a, i-1, j-1);
: }
: else if(a[i-1][j] >= a[i-1][j-1] && a[i-1][j] >= a[i-1][j+1]){
: //cout << t ;
: m[t][r++]=a[i][j];
: return a[i][j]+sum(a, i-1, j);
: }
: else if(a[i-1][j+1] > a[i-1][j-1] && a[i-1][j+1] > a[i-1][j]){
: //cout << t ;
: m[t][r++]=a[i][j];
: return a[i][j]+sum(a, i-1, j+1);
: }
: }
: int main()
: {
: static int a[1000][1000]; //<-----------問題出在這
: int cases=0;
: int q[MAX];
: int p=0;
: int s[MAX];
: cin >> cases;
: while(p<cases){
: cin >> n;
: for(int i=0; i<n; i++)q[i]=0;
: for(int i=0;i<n;i++){
: for(int j=0;j<n;j++){
: cin >> a[i][j];
: }
: }
: /*for(int i=0;i<n;i++){
: for(int j=0;j<n;j++){
: cout << a[i][j] << " ";
: }
: cout << endl;
: }*/
: t=0;
: for(int j=0; j<n; j++){
: sum(a, n-1, j);
: r=0;
: t++;
: //cout << t <<endl;
: }
: cout << endl;
: for(int i=0;i<n; i++){
: for(int j=0; j<n; j++){
: cout << m[i][j] <<" ";
: }
: cout << endl;
: }
: cout << endl;
: for(int i=0; i<n; i++){
: for(int j=0; j<n; j++){
: cout << q[i] << " " << m[i][j] << endl;
: q[i]=q[i]+m[i][j];
: }
: cout << q[i] << endl;
: }
: //cout << endl;
: for(int i=0; i<n; i++){
: if(q[i]>s[p])s[p]=q[i];
: }
: p++;
: }
: for(int i=0; i<p; i++)cout << s[i] << endl;
: system("pause");
: return 0;
: }
: 補充說明(Supplement):
: 這個題目是給一n*n的陣列 從最底層開始往左上 中上 右上走 哪個數字大就走哪邊
: 最後把路徑上經過的數字都加起來 po出最大的數字
: 如輸入-1 1
: 3 4
: 3走去1 加起來是4
: 4走去1 加起來是5
: 最後印出來是5
: 原本用比較小的陣列a[100][100]跑沒有問題
: 但是因為題目要求是1000*1000的大小 所以必須將陣列放到全域 不然stack overflow
: 但是放去global之後就出現奇怪的現象
: code裡面有監看各個陣列的cout
: 陣列m是用來存行走的路徑
: 原本m[i][j]存入的值應該是-3 2 -1
: -3 2 -1
: -3 2 -1
: 卻變成 -3 2 0
: -3 2 -1
: -3 2 0
: 在下新手 看不出為什麼 希望高手解惑
: 另外 這個程式有bug 就是當某一層所有數字相等時
: 只會往正上方走 但這樣就變成不一定是最佳解
: 在下試過的判斷式都沒用 不然就是overflow 無奈只能讓他往正上方走
: 如果能提供解法 在下感激不盡<(_ _)>
--
我們一路奮戰所作的一切,不是為了改變世界,而是為了不讓世界改變我們----熔爐
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.171.79.195
→
05/07 12:49, , 1F
05/07 12:49, 1F
→
05/08 00:03, , 2F
05/08 00:03, 2F
→
05/08 00:06, , 3F
05/08 00:06, 3F
→
05/08 00:08, , 4F
05/08 00:08, 4F
推
05/08 15:10, , 5F
05/08 15:10, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):