Board logo

主題: [資訊電機] [問題][C++]2-D array與副程式中有副程式之問題 [打印本頁]

發表人: 老江    時間: 2005-5-30 08:28 PM     主題: [問題][C++]2-D array與副程式中有副程式之問題

#include< stdio.h >
#define max_row 200
#define max_col 200
void ar1(double a[max_row][max_col],int l);
void ar2(void ar1(double a[max_row][max_col],int l),double x[max_row][max_col],int k);
void add(double a[max_row][max_col],double b[max_row][max_col],double c[max_row][max_col],int l);
void had(double a[max_row][max_col],double b[max_row][max_col],double d[max_row][max_col],int l);
int main(void)
{
    double a[max_row][max_col],b[max_row][max_col],c[max_row][max_col],d[max_row][max_col];
    int l,i,j;
    printf("請輸入陣列邊長>");
    scanf("%d",&l);
    printf("請輸入a陣列數字>");
    ar1(a,l);
    printf("請輸入b陣列數字>");
    ar2(ar1,b,l);
    add(a,b,c,l);
    had(a,b,d,l);
    for(i=0;i<l;i=i+1)
    for(j=0;j<l;j=j+1)
    printf("a+b=%lf",c[i][j]);
    for(i=0;i<l;i=i+1)
    for(j=0;j<l;j=j+1)
    printf("a*b=%lf",d[i][j]);
    return 0;
}
void ar1(double a[max_row][max_col],int l)
{
     int i,j;
     for(i=0;j<l;i++)
     for(j=0;j<l;j++)
     scanf("%lf",a[i][j]);
}
void ar2(void ar1(double a[max_row][max_col],int l),double x[max_row][max_col],int k)
{
     ar1(x,k);
}     
void add(double a[max_row][max_col],double b[max_row][max_col],double c[max_row][max_col],int l)
{
     int i,j;
     for(i=0;j<l;i++)
     for(j=0;j<l;j++)
     c[i][j]=a[i][j]+b[i][j];
}
void had(double a[max_row][max_col],double b[max_row][max_col],double d[max_row][max_col],int l)
{
     int i,j;
     for(i=0;j<l;i++)
     for(j=0;j<l;j++)
     d[i][j]=a[i][j]*b[i][j];
}

嗯,我是想做兩個2d的array(正方形的)出來
一開始是自己輸入array邊長大小,再輸入裡面的值
然後print出a array+b array與a array*b array這兩種
很不幸的,在第一行的"請輸入陣列邊長>"
輸入數字之後,程式就關了(我是打整數喔..)
通常這樣都是下一行有問題,不過我看了半天那個printf看起來很正常
我卻連看都還沒看到程式就關了

題目唯一的要求就是要有
(data type)function_1(....,(data type)function_2(...,))
在副程式裡呼叫副程式來用,所以我才會把ar2寫成那樣子
發表人: cji82    時間: 2005-5-31 12:31 AM

這位大大不知道是用哪種platform and compiler?
大大在function中宣告了4個200x200的 double type array
以 windows來說, sizeof(double) = 8,

8x200x200x4 = 1280000 bytes 約等於宣告一個1.2MB的local memory,
不知道大大所處的環境是否可以處理超過64K的memory accessing.
也有可能是stack不夠大,
這樣子的宣告有可能已經超出stack size.
雖然宣告1.2 MB的四個array在之後的幾個int前,
但有可能後面這幾個int的位子已經被compiler放到1.2MB以後, 這塊區域可能是OS在用的,
所以scanf到&l後就破壞了一些東西, 造成程式掛掉.

參考一下吧!
發表人: 老江    時間: 2005-5-31 08:38 PM

已經解決了
果然是那個200x200的問題
改成10x10之後就可以了
這東西書上完全都沒提到
害我怎麼找都找不到

其實當初宣告200x200也是題目說的
被擺了一道
發表人: cji82    時間: 2005-5-31 10:16 PM

我想這個問題本質在於大大所處的platform及所用的compiler
對於local variable and stack size memory management的能力,

大大可以考慮把原來這4個200x200的double array移到main()外面,
用global variable的方法來宣告再試試看, 也許不用reduce size也可以正常執行
當然前題是你的memory夠大, memory addressing可以超過1MB




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0