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

看板C_and_CPP作者 (Fuzzy)時間11年前 (2014/11/30 20:21), 編輯推噓5(5023)
留言28則, 9人參與, 最新討論串1/2 (看更多)
小弟在寫程式時常會用到如下程式 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

11/30 20:45, , 1F
define 不是也是一樣會展開嗎?
11/30 20:45, 1F

11/30 20:46, , 2F
我覺得一般寫就好
11/30 20:46, 2F

11/30 22:05, , 3F
你跑步都一次跑兩步嗎
11/30 22:05, 3F

11/30 22:09, , 4F
跑兩步是指? 執行的順序就是 cols = 0 rows = 0
11/30 22:09, 4F

11/30 22:09, , 5F
程式可讀性會變差吧 要給別人的話最好還是不要
11/30 22:09, 5F

11/30 22:10, , 6F
cols = 1 rows = 0, ... cols = 0 rows = 1...類推
11/30 22:10, 6F

11/30 22:11, , 7F
可讀性變差是指? 因為不是語法的一部份嗎?
11/30 22:11, 7F

11/30 22:17, , 8F
不要在跑步這種最簡單的事情上面變花樣。
11/30 22:17, 8F

11/30 22:46, , 9F
我可能沒有表達好問題
11/30 22:46, 9F

11/30 22:47, , 10F
如果今天要用成4個迴圈的情況,不會覺得縮排太多
11/30 22:47, 10F

11/30 22:47, , 11F
造成程式碼不好看嗎?
11/30 22:47, 11F

11/30 23:43, , 12F
美或醜很主觀,但你這個很難改是肯定的
11/30 23:43, 12F

11/30 23:44, , 13F
想改個step value或在某層迴圈裡加一行都難
11/30 23:44, 13F

11/30 23:48, , 14F
真有太多層縮排而看不清楚的情形,應該是拉出去寫成函
11/30 23:48, 14F

11/30 23:48, , 15F
式,或用遞迴處理
11/30 23:48, 15F

11/30 23:51, , 16F
幹嘛一直盯著看
11/30 23:51, 16F

11/30 23:53, , 17F
後人怨聲載道 只因為你現在想要好看
11/30 23:53, 17F

11/30 23:53, , 18F
你確定以後不會有人看到就隨便你
11/30 23:53, 18F

12/01 03:55, , 19F
做好code format(縮排等) 加上易讀的變數命名和充分的註解
12/01 03:55, 19F

12/01 03:57, , 20F
多層迴圈並不代表不好阿 或者do something的部份看是否能寫
12/01 03:57, 20F

12/01 03:57, , 21F
函式呼叫 怎麼修改自己考量
12/01 03:57, 21F

12/01 10:58, , 22F
還不如用func call就好
12/01 10:58, 22F

12/01 14:01, , 23F
function call是比較佳的寫法
12/01 14:01, 23F

12/01 14:15, , 24F
inline+1,寫或不寫inline func.看那一段之後會不會常改或者
12/01 14:15, 24F

12/01 14:15, , 25F
重複call,以上例也可直接化為算式放在第二層內
12/01 14:15, 25F

12/01 14:16, , 26F
array[i-1~i+1][j-1~j+1] 如果情況許可,我自己是會思考是
12/01 14:16, 26F

12/01 14:16, , 27F
不是有類似dynamic programming或一些資料結構可以來加速
12/01 14:16, 27F

12/01 14:17, , 28F
個人經驗,我想還是看設計師的喜好吧
12/01 14:17, 28F
文章代碼(AID): #1KUmlBje (C_and_CPP)
文章代碼(AID): #1KUmlBje (C_and_CPP)