[討論] 2維陣列 使用迴圈的方式

作者: dragon229 (Fuzzy)   2014-11-30 20:21:28
小弟在寫程式時常會用到如下程式
for (int rows = 0; rows < arrayHeight; ++rows)
{
for (int cols = 0; cols < arrayWidth; ++cols)
{
// do something
}
}
利用兩個迴圈來處理二維陣列的所有元素
但有時在處理某個元素時
會需要該元素周圍的元素來計算
就會變成下面的情況
for (int rows = 0; rows < arrayHeight; ++rows)
{
for (int cols = 0; cols < arrayWidth; ++cols)
{
for (int rows2 = rows - 1; rows2 < rows + 2; ++rows2)
{
for (int col2 = col - 1; col2 < col + 2; ++col2)
{
// 邊界判定
// do something
}
}
//dosomething
}
}
在這個情況下層數就會變得很多
使用function或許是其中一種方式,如
for (int rows = 0; rows < arrayHeight; ++rows)
{
for (int cols = 0; cols < arrayWidth; ++cols)
{
function1();
//do something
}
}
後來我想我明明只是要遍歷所有元素
為何不能只寫一個for就處理完
於是試著用define的寫法來處理
#define RANGE(VALUE, BEGIN, END) \
int VALUE = BEGIN; VALUE < END; ++VALUE
#define FOR_2D(CONDITION_1, CONDITION_2) \
for (CONDITION_1) \
for (CONDITION_2)
於是我就能使用
FOR_2D(RANGE(rows, 0, arrayHeight), RANGE(cols, 0, arrayWidth))
{
// do something
}
來處理
對於上面需要再取某元素周圍元素的計算也能用
FOR_2D(RANGE(rows, 0, arrayHeight), RANGE(cols, 0, arrayWidth))
{
FOR_2D(RANGE(row2, rows - 1, rows + 2), RANGE(col2, cols - 1, cols + 2))
{
//邊界判定
//do something
}
// do something
}
我想討論的問題如下
1.使用define的這種寫法到底好還是不好 (或者該說優點跟缺點是?)
2.是否還有其它更好的方式可以處理這種雙迴圈的問題(就是要遍歷2維陣列中所有元素)
以上煩請大大們開示
作者: iloveyouever (佚名)   2014-11-30 20:45:00
define 不是也是一樣會展開嗎?我覺得一般寫就好
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-11-30 22:05:00
你跑步都一次跑兩步嗎
作者: dragon229 (Fuzzy)   2014-11-30 22:09:00
跑兩步是指? 執行的順序就是 cols = 0 rows = 0
作者: lunasdejavu (我的頭上長香菇了)   2014-11-30 22:09:00
程式可讀性會變差吧 要給別人的話最好還是不要
作者: dragon229 (Fuzzy)   2014-11-30 22:10:00
cols = 1 rows = 0, ... cols = 0 rows = 1...類推可讀性變差是指? 因為不是語法的一部份嗎?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-11-30 22:17:00
不要在跑步這種最簡單的事情上面變花樣。
作者: dragon229 (Fuzzy)   2014-11-30 22:46:00
我可能沒有表達好問題如果今天要用成4個迴圈的情況,不會覺得縮排太多造成程式碼不好看嗎?
作者: CaptainH (Cannon)   2014-11-30 23:43:00
美或醜很主觀,但你這個很難改是肯定的想改個step value或在某層迴圈裡加一行都難真有太多層縮排而看不清楚的情形,應該是拉出去寫成函式,或用遞迴處理
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-11-30 23:51:00
幹嘛一直盯著看後人怨聲載道 只因為你現在想要好看你確定以後不會有人看到就隨便你
作者: xvid (DivX)   2014-12-01 03:55:00
做好code format(縮排等) 加上易讀的變數命名和充分的註解多層迴圈並不代表不好阿 或者do something的部份看是否能寫函式呼叫 怎麼修改自己考量
作者: shadow0326 (非議)   2014-12-01 10:58:00
還不如用func call就好
作者: lmr3796 (Toro)   2014-12-01 14:01:00
function call是比較佳的寫法
作者: dirkc (3781615)   2014-12-01 14:15:00
inline+1,寫或不寫inline func.看那一段之後會不會常改或者重複call,以上例也可直接化為算式放在第二層內array[i-1~i+1][j-1~j+1] 如果情況許可,我自己是會思考是不是有類似dynamic programming或一些資料結構可以來加速個人經驗,我想還是看設計師的喜好吧

Links booklink

Contact Us: admin [ a t ] ucptt.com