#27936: 二微陣列初始化


910580@mail.pcsh.ntpc.edu.tw (29劉佳翰)

學校 : 新北市立板橋高級中學
編號 : 163586
來源 : [114.24.177.219]
最後登入時間 :
2022-01-08 17:16:18
g276. 2. 魔王迷宮 -- 2021年9月APCS | From: [114.24.231.31] | 發表日期 : 2021-11-06 18:04

想請問二微陣列該如何初始化(除了用迴圈一個個變成0以外的方式),我用arr[n][m]={0}不會成功,如下

 

    int n,m;

    cin >>n>>m;

    int arr[n][m]={0};

    for(int i=0,j=0;i<n&&j<m;(i<n-1)?i++:(i=0,j++)){

        cout<<"i="<<i<<" j="<<j<<" 陣列="<<arr[i][j]<<endl;

   }

這樣輸入3 3 結果為:

3 3

i=0 j=0 陣列=0

i=1 j=0 陣列=0

i=2 j=0 陣列=4206448

i=0 j=1 陣列=0

i=1 j=1 陣列=4206456

i=2 j=1 陣列=0

i=0 j=2 陣列=4200066

i=1 j=2 陣列=0

i=2 j=2 陣列=15603472

把    int arr[n][m]={0};

改成     int arr[n][m]={{0},{0}};

結果也不會成功,如下:

3 3

i=0 j=0 陣列=0

i=1 j=0 陣列=0

i=2 j=0 陣列=4206464

i=0 j=1 陣列=0

i=1 j=1 陣列=4206472

i=2 j=1 陣列=0

i=0 j=2 陣列=4200066

i=1 j=2 陣列=0

 

i=2 j=2 陣列=7214864

另外網路上有寫宣告陣列不能放變數,但似乎也能順利執行,想問其原因?

 

 
#27939: Re:二微陣列初始化


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
g276. 2. 魔王迷宮 -- 2021年9月APCS | From: [180.217.234.235] | 發表日期 : 2021-11-06 18:48

想請問二微陣列該如何初始化(除了用迴圈一個個變成0以外的方式),我用arr[n][m]={0}不會成功,如下

 

    int n,m;

    cin >>n>>m;

    int arr[n][m]={0};

    for(int i=0,j=0;i<n&&j<m;(i<n-1)?i++:(i=0,j++)){

        cout<<"i="<<i<<" j="<<j<<" 陣列="<<arr[i][j]<<endl;

   }

這樣輸入3 3 結果為:

3 3

i=0 j=0 陣列=0

i=1 j=0 陣列=0

i=2 j=0 陣列=4206448

i=0 j=1 陣列=0

i=1 j=1 陣列=4206456

i=2 j=1 陣列=0

i=0 j=2 陣列=4200066

i=1 j=2 陣列=0

i=2 j=2 陣列=15603472

把    int arr[n][m]={0};

改成     int arr[n][m]={{0},{0}};

結果也不會成功,如下:

3 3

i=0 j=0 陣列=0

i=1 j=0 陣列=0

i=2 j=0 陣列=4206464

i=0 j=1 陣列=0

i=1 j=1 陣列=4206472

i=2 j=1 陣列=0

i=0 j=2 陣列=4200066

i=1 j=2 陣列=0

 

i=2 j=2 陣列=7214864

另外網路上有寫宣告陣列不能放變數,但似乎也能順利執行,想問其原因?

 


1.arr[n][m]={0}這種寫法只適用於長度是常數的情況。可以用memset(c與c++皆可使用)或是fill(只有c++)。例如

memset(arr, 0, sizeof(arr));

或是

fill(arr[0], arr[0] + a * b, 0);

 

https://www.cplusplus.com/reference/cstring/memset/

https://www.cplusplus.com/reference/algorithm/fill/

2. 這叫作VLA (variable-length array),不是標準的c++不代表一定會編譯失敗,這是gcc的extension(不過在c語言中是可以的)。

可參考 https://stackoverflow.com/questions/39334435/variable-length-array-vla-in-c-compilers

 

如果你跟我一樣不喜歡用非標準的方式,可以改用vector,我覺得很方便

 
#27940: Re:二微陣列初始化


linlincaleb@gmail.com (臨末之頌)

學校 : 新北市立板橋高級中學
編號 : 132772
來源 : [203.64.161.123]
最後登入時間 :
2024-07-29 10:02:49
g276. 2. 魔王迷宮 -- 2021年9月APCS | From: [111.248.151.77] | 發表日期 : 2021-11-06 19:08

想請問二微陣列該如何初始化(除了用迴圈一個個變成0以外的方式),我用arr[n][m]={0}不會成功,如下

 

    int n,m;

    cin >>n>>m;

    int arr[n][m]={0};

    for(int i=0,j=0;i<n&&j<m;(i<n-1)?i++:(i=0,j++)){

        cout<<"i="<<i<<" j="<<j<<" 陣列="<<arr[i][j]<<endl;

   }

這樣輸入3 3 結果為:

3 3

i=0 j=0 陣列=0

i=1 j=0 陣列=0

i=2 j=0 陣列=4206448

i=0 j=1 陣列=0

i=1 j=1 陣列=4206456

i=2 j=1 陣列=0

i=0 j=2 陣列=4200066

i=1 j=2 陣列=0

i=2 j=2 陣列=15603472

把    int arr[n][m]={0};

改成     int arr[n][m]={{0},{0}};

結果也不會成功,如下:

3 3

i=0 j=0 陣列=0

i=1 j=0 陣列=0

i=2 j=0 陣列=4206464

i=0 j=1 陣列=0

i=1 j=1 陣列=4206472

i=2 j=1 陣列=0

i=0 j=2 陣列=4200066

i=1 j=2 陣列=0

 

i=2 j=2 陣列=7214864

另外網路上有寫宣告陣列不能放變數,但似乎也能順利執行,想問其原因?

 


1.arr[n][m]={0}這種寫法只適用於長度是常數的情況。可以用memset(c與c++皆可使用)或是fill(只有c++)。例如

memset(arr, 0, sizeof(arr));

或是

fill(arr[0], arr[0] + a * b, 0);

 

https://www.cplusplus.com/reference/cstring/memset/

https://www.cplusplus.com/reference/algorithm/fill/

2. 這叫作VLA (variable-length array),不是標準的c++不代表一定會編譯失敗,這是gcc的extension(不過在c語言中是可以的)。

可參考 https://stackoverflow.com/questions/39334435/variable-length-array-vla-in-c-compilers

 

如果你跟我一樣不喜歡用非標準的方式,可以改用vector,我覺得很方便

 

把0去掉,改成 int ar[100][100]={}; 就可以惹

 
ZeroJudge Forum