[讨论] Loop的次数与array有关时, 大家都怎么写

楼主: 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
作者: azureblaze (AzureBlaze)   2015-07-03 10:31:00
for(auto e : arr){}
作者: kwpn (ITSST)   2015-07-03 10:36:00
case1比case2好,arr在宣告时可以不用指定arrElementNum,因为编译器会自动帮你算出{...}里元素的数量,这样就可以移除arrElementNum,少维护一个变量. 若有C++11的话range for最好没C++11的话,但case1又太长,可以定义宏#define ARRAY_SIZE(sizeof(arr) / sizeof(arr[0]))
作者: MOONRAKER (㊣牛鹤鳗毛人)   2015-07-03 10:44:00
case1进入函数立刻破功破得一干二净。
作者: 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
作者: MOONRAKER (㊣牛鹤鳗毛人)   2015-07-03 12:11:00
case1有传size进去吗 你哪只眼睛看到的
作者: kwpn (ITSST)   2015-07-03 12:25:00
他是写在main(),当你提到函式,我当然是认为其他函式了若你指的是main(),请问case1在main()里要被破什么功?
作者: MOONRAKER (㊣牛鹤鳗毛人)   2015-07-03 13:04:00
case1是一个烂的pattern 因为写在函数里一定破功你要帮他掰main()也是函数那是你家的事 不要牵拖我我爱用什么方式传阵列长度到函数也跟你k某没关系就算我爱用念力传进去也是我家的事 你k某可以不用猜
作者: kwpn (ITSST)   2015-07-03 13:13:00
脑羞不用这样,就事论事,case1写在非main函式确实会破功,但原po写很清楚是main函式,他要设计其他函式可多加一个参数size我就不清楚你哪一只眼看到原po有写其他函式使用case1而且我干嘛要帮他掰main(),是他自己写的,难到你有只眼看到原po的id是我?
作者: Ebergies (火神)   2015-07-03 14:43:00
楼上两位, 两个愿望一次满足 https://coderwall.com/p//nb9ngq/better-getting-array-size-in-c楼上去掉最前面的 /
作者: kwpn (ITSST)   2015-07-03 14:52:00
楼上的方法其实是基于case1,但跟我一开始提的宏一样,都是为了避免太冗长,也避免名称出现两次,的改善方法
作者: stupid0319 (征女友)   2015-07-03 16:00:00
写了5,6年的程式,我都没想过这么复杂的问题
作者: LiloHuang (十年一刻)   2015-07-03 22:03:00
#include <boost/range.hpp> 然后 boost::size(array);
楼主: MaxHaru (懂得放手..才是王道)   2015-07-05 10:26:00
sorry, 我再说明一下,阵列是全域变量为前题,所以不考虑当参数传到函数的情况所以, 两个方法都各有优点, 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大..

Links booklink

Contact Us: admin [ a t ] ucptt.com