作者:
MaxHaru (懂得放手..才是王道)
2015-07-03 10:08:35有問題想請教,
若在迴圈中要跑的次數與陣列的元素個數有關的時候,
大家都會怎麼寫呢?
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
作者:
kwpn (ITSST)
2015-07-03 10:36:00case1比case2好,arr在宣告時可以不用指定arrElementNum,因為編譯器會自動幫你算出{...}裡元素的數量,這樣就可以移除arrElementNum,少維護一個變數. 若有C++11的話range for最好沒C++11的話,但case1又太長,可以定義巨集#define ARRAY_SIZE(sizeof(arr) / sizeof(arr[0]))
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2015-07-03 10:53:00我比較建議就乖乖多寫一個 size, 免得以後重構還要煩惱
作者:
kwpn (ITSST)
2015-07-03 10:53:00請問樓上設計傳陣列的函數,不傳size而用global var/macro?
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2015-07-03 10:54:00如果宣告的大小和 literal 不符反正編譯器也會警告
作者:
kwpn (ITSST)
2015-07-03 10:54:00我指的是MOONRAKER
作者:
kwpn (ITSST)
2015-07-03 12:25:00他是寫在main(),當你提到函式,我當然是認為其他函式了若你指的是main(),請問case1在main()裡要被破什麼功?
case1是一個爛的pattern 因為寫在函數裡一定破功你要幫他掰main()也是函數那是你家的事 不要牽拖我我愛用什麼方式傳陣列長度到函數也跟你k某沒關係就算我愛用念力傳進去也是我家的事 你k某可以不用猜
作者:
kwpn (ITSST)
2015-07-03 13:13:00腦羞不用這樣,就事論事,case1寫在非main函式確實會破功,但原po寫很清楚是main函式,他要設計其他函式可多加一個參數size我就不清楚你哪一隻眼看到原po有寫其他函式使用case1而且我幹嘛要幫他掰main(),是他自己寫的,難到你有隻眼看到原po的id是我?
作者:
kwpn (ITSST)
2015-07-03 14:52:00樓上的方法其實是基於case1,但跟我一開始提的巨集一樣,都是為了避免太冗長,也避免名稱出現兩次,的改善方法
作者: LiloHuang (十年一刻) 2015-07-03 22:03:00
#include <boost/range.hpp> 然後 boost::size(array);
作者:
MaxHaru (懂得放手..才是王道)
2015-07-05 10:26:00sorry, 我再說明一下,陣列是全域變數為前題,所以不考慮當參數傳到函數的情況所以, 兩個方法都各有優點, case1的優點如k大說的可以少維護一個變數, 這點我很認同, 陣列為全域變數前題下適用case2就如M大所提到的, 適用於陣列被當成參數傳入函式的情境, 可以節省一個函數參數, 這是我沒想過的問題, 因為工作上都直接宣告成全域變數在用,十分感謝K大與M大的說明
作者:
kwpn (ITSST)
2015-07-05 22:29:00我覺得說這假設不太好,函式設計成要引用global變數,那為何不要傳陣列,直接引用global陣列,這樣case1也行的通啊但這樣設計,就較沒彈性,因為別的陣列不能用此函式.同樣的,你假設可傳陣列,但不傳陣列大小,這樣也一樣少了彈性因為呼叫者不能傳不同大小的陣列.要嘛就可傳陣列跟大小,要嘛就都不傳直接引用global陣列,我自己是優先選擇彈性最好的,這樣以後被重構機率會低很多但只傳陣列,又引用global的陣列大小的函式,是最不可取的
作者:
MaxHaru (懂得放手..才是王道)
2015-07-05 23:46:00明白, 我本來的疑問也就是在global變數的前提..謝謝K大..