[討論] Loop的次數與array有關時, 大家都怎麼寫

看板C_and_CPP作者 (懂得放手..才是王道)時間10年前發表 (2015/07/03 02:08), 10年前編輯推噓8(8038)
留言46則, 8人參與, 最新討論串1/1
有問題想請教, 若在迴圈中要跑的次數與陣列的元素個數有關的時候, 大家都會怎麼寫呢? Ex: #define arrElementNum N unsigned int arr[arrElementNum] = {...}; void main(void) { unsigned int i; for(i=0; i<X; i++) { arr[i] = ...; .. } } 大家這個X會用什麼方法寫.. case1: sizeof(arr)/sizeof(arr[0]) case2: arrElementNum -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.210.106.78 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1435889317.A.C90.html ※ 編輯: MaxHaru (218.210.106.78), 07/03/2015 10:23:03

07/03 10:31, , 1F
for(auto e : arr){}
07/03 10:31, 1F

07/03 10:36, , 2F
case1比case2好,arr在宣告時可以不用指定arrElementNum,因為
07/03 10:36, 2F

07/03 10:38, , 3F
編譯器會自動幫你算出{...}裡元素的數量,這樣就可以移除
07/03 10:38, 3F

07/03 10:40, , 4F
arrElementNum,少維護一個變數. 若有C++11的話range for最好
07/03 10:40, 4F

07/03 10:41, , 5F
沒C++11的話,但case1又太長,可以定義巨集#define ARRAY_SIZE
07/03 10:41, 5F

07/03 10:42, , 6F
(sizeof(arr) / sizeof(arr[0]))
07/03 10:42, 6F

07/03 10:44, , 7F
case1進入函數立刻破功破得一乾二淨。
07/03 10:44, 7F

07/03 10:53, , 8F
我比較建議就乖乖多寫一個 size, 免得以後重構還要煩惱
07/03 10:53, 8F

07/03 10:53, , 9F
請問樓上設計傳陣列的函數,不傳size而用global var/macro?
07/03 10:53, 9F

07/03 10:54, , 10F
如果宣告的大小和 literal 不符反正編譯器也會警告
07/03 10:54, 10F

07/03 10:54, , 11F
我指的是MOONRAKER
07/03 10:54, 11F

07/03 12:11, , 12F
case1有傳size進去嗎 你哪隻眼睛看到的
07/03 12:11, 12F

07/03 12:25, , 13F
他是寫在main(),當你提到函式,我當然是認為其他函式了
07/03 12:25, 13F

07/03 12:29, , 14F
若你指的是main(),請問case1在main()裡要被破什麼功?
07/03 12:29, 14F

07/03 13:04, , 15F
case1是一個爛的pattern 因為寫在函數裡一定破功
07/03 13:04, 15F

07/03 13:05, , 16F
你要幫他掰main()也是函數那是你家的事 不要牽拖我
07/03 13:05, 16F

07/03 13:05, , 17F
我愛用什麼方式傳陣列長度到函數也跟你k某沒關係
07/03 13:05, 17F

07/03 13:06, , 18F
就算我愛用念力傳進去也是我家的事 你k某可以不用猜
07/03 13:06, 18F

07/03 13:13, , 19F
腦羞不用這樣,就事論事,case1寫在非main函式確實會破功,但原
07/03 13:13, 19F

07/03 13:14, , 20F
po寫很清楚是main函式,他要設計其他函式可多加一個參數size
07/03 13:14, 20F

07/03 13:15, , 21F
我就不清楚你哪一隻眼看到原po有寫其他函式使用case1
07/03 13:15, 21F

07/03 13:20, , 22F
而且我幹嘛要幫他掰main(),是他自己寫的,難到你有隻眼看到原
07/03 13:20, 22F

07/03 13:20, , 23F
po的id是我?
07/03 13:20, 23F

07/03 14:43, , 24F
樓上兩位, 兩個願望一次滿足 https://coderwall.com/p/
07/03 14:43, 24F

07/03 14:43, , 25F
/nb9ngq/better-getting-array-size-in-c
07/03 14:43, 25F

07/03 14:44, , 26F
樓上去掉最前面的 /
07/03 14:44, 26F

07/03 14:52, , 27F
樓上的方法其實是基於case1,但跟我一開始提的巨集一樣,都是
07/03 14:52, 27F

07/03 14:54, , 28F
為了避免太冗長,也避免名稱出現兩次,的改善方法
07/03 14:54, 28F

07/03 16:00, , 29F
寫了5,6年的程式,我都沒想過這麼複雜的問題
07/03 16:00, 29F

07/03 22:03, , 30F
#include <boost/range.hpp> 然後 boost::size(array);
07/03 22:03, 30F

07/05 10:26, , 31F
sorry, 我再說明一下,陣列是全域變數為前題,所以不考慮
07/05 10:26, 31F

07/05 10:26, , 32F
當參數傳到函數的情況
07/05 10:26, 32F

07/05 10:37, , 33F
所以, 兩個方法都各有優點, case1的優點如k大說的可以少
07/05 10:37, 33F

07/05 10:40, , 34F
維護一個變數, 這點我很認同, 陣列為全域變數前題下適用
07/05 10:40, 34F

07/05 10:42, , 35F
case2就如M大所提到的, 適用於陣列被當成參數傳入函式的
07/05 10:42, 35F

07/05 10:43, , 36F
情境, 可以節省一個函數參數, 這是我沒想過的問題, 因為
07/05 10:43, 36F

07/05 10:46, , 37F
工作上都直接宣告成全域變數在用,十分感謝K大與M大的說明
07/05 10:46, 37F

07/05 22:29, , 38F
我覺得說這假設不太好,函式設計成要引用global變數,那為何不
07/05 22:29, 38F

07/05 22:30, , 39F
要傳陣列,直接引用global陣列,這樣case1也行的通啊
07/05 22:30, 39F

07/05 22:31, , 40F
但這樣設計,就較沒彈性,因為別的陣列不能用此函式.
07/05 22:31, 40F

07/05 22:32, , 41F
同樣的,你假設可傳陣列,但不傳陣列大小,這樣也一樣少了彈性
07/05 22:32, 41F

07/05 22:33, , 42F
因為呼叫者不能傳不同大小的陣列.
07/05 22:33, 42F

07/05 22:41, , 43F
要嘛就可傳陣列跟大小,要嘛就都不傳直接引用global陣列,
07/05 22:41, 43F

07/05 22:43, , 44F
我自己是優先選擇彈性最好的,這樣以後被重構機率會低很多
07/05 22:43, 44F

07/05 22:44, , 45F
但只傳陣列,又引用global的陣列大小的函式,是最不可取的
07/05 22:44, 45F

07/05 23:46, , 46F
明白, 我本來的疑問也就是在global變數的前提..謝謝K大..
07/05 23:46, 46F
文章代碼(AID): #1LbUwboG (C_and_CPP)