看板 C_and_CPP 關於我們 聯絡資訊
小弟在寫程式時常會用到如下程式 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維陣列中所有元素) 以上煩請大大們開示 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.184.17.80 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1417350091.A.B68.html
iloveyouever: define 不是也是一樣會展開嗎? 11/30 20:45
iloveyouever: 我覺得一般寫就好 11/30 20:46
MOONRAKER: 你跑步都一次跑兩步嗎 11/30 22:05
dragon229: 跑兩步是指? 執行的順序就是 cols = 0 rows = 0 11/30 22:09
lunasdejavu: 程式可讀性會變差吧 要給別人的話最好還是不要 11/30 22:09
dragon229: cols = 1 rows = 0, ... cols = 0 rows = 1...類推 11/30 22:10
dragon229: 可讀性變差是指? 因為不是語法的一部份嗎? 11/30 22:11
MOONRAKER: 不要在跑步這種最簡單的事情上面變花樣。 11/30 22:17
dragon229: 我可能沒有表達好問題 11/30 22:46
dragon229: 如果今天要用成4個迴圈的情況,不會覺得縮排太多 11/30 22:47
dragon229: 造成程式碼不好看嗎? 11/30 22:47
CaptainH: 美或醜很主觀,但你這個很難改是肯定的 11/30 23:43
CaptainH: 想改個step value或在某層迴圈裡加一行都難 11/30 23:44
CaptainH: 真有太多層縮排而看不清楚的情形,應該是拉出去寫成函 11/30 23:48
CaptainH: 式,或用遞迴處理 11/30 23:48
MOONRAKER: 幹嘛一直盯著看 11/30 23:51
MOONRAKER: 後人怨聲載道 只因為你現在想要好看 11/30 23:53
MOONRAKER: 你確定以後不會有人看到就隨便你 11/30 23:53
xvid: 做好code format(縮排等) 加上易讀的變數命名和充分的註解 12/01 03:55
xvid: 多層迴圈並不代表不好阿 或者do something的部份看是否能寫 12/01 03:57
xvid: 函式呼叫 怎麼修改自己考量 12/01 03:57
shadow0326: 還不如用func call就好 12/01 10:58
lmr3796: function call是比較佳的寫法 12/01 14:01
dirkc: inline+1,寫或不寫inline func.看那一段之後會不會常改或者 12/01 14:15
dirkc: 重複call,以上例也可直接化為算式放在第二層內 12/01 14:15
dirkc: array[i-1~i+1][j-1~j+1] 如果情況許可,我自己是會思考是 12/01 14:16
dirkc: 不是有類似dynamic programming或一些資料結構可以來加速 12/01 14:16
dirkc: 個人經驗,我想還是看設計師的喜好吧 12/01 14:17