作者xflash96 (Will)
看板b97902HW
標題Re: [計程] 陣列簡介 III (微甲爆了心情不好發文害 …
時間Sat Nov 15 09:48:19 2008
我以前的英文老師說過:「語言最要的地方就是能完整的傳達意思,對方聽得懂就好」
傳遞陣列(以其為引數),函式要知道一些事情才能處理:
1. 引數類型
2. 陣列的offset位移
程式在對二維變數存取時
int a[2][3];
a[1][2] = *(*(a+3*1)+2)
a[0][1] = *(*(a+3*0)+1)
如同sa之前的實驗
int b[2];
b[1] = 1[b] = *(1+b)
應該只是單純的代換
所以處理二維變數的時候需要知道至少最後一維的值
處理 n維 n-1維
所以宣告函數
void func(int a[][]);
傳入時函數把a當作pointer處理,自然不知a陣列的大小(函式說:蝦米?沙西米?)
實際上,sizeof(a)在函式裡==sizeof(pointer)
(sizeof 的值其實在compile時就決定了!所以他不知你執行時會傳多大的陣列)
所以要宣告void func(int a[][3])
才能作陣列存取
*那麼,我宣告void func(int b[2]), 就可以sizeof了嗎?
A: X. 那只是寫好玩的。陣列和pointer不同,陣列是const pointer,所以大小有保證。
pointer可以接不同的陣列,就像是函數引數可以接不同的變數,大小沒保證
以我的經驗,在openCV裡傳2維變數,其實要傳
void func(int width, int height, int depth, char *array);
depth滿像變數型態
即話為一維變數,存取時用
*(*(array+depth*width*i)+height*j)
另在我寫embedded時的經驗,有人用
struct array
{
int a[3][3];
};
直接傳struct
另學長joseph給的解法:
用c++ vector
另學長的學長給的解法:
比賽時就用global就好了嘛!
只不過真的寫程式時最好不要global滿天飛
以上
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.124.83.64
推 anfranion:第一次看你發教學文XD 11/15 17:54
推 dennis2030:推 原PO是隱強者XD 11/16 20:39
→ anfranion:原PO可是真‧隱強者XD 11/17 19:48