[問題] 二維陣列 指標傳遞
開發平台(Platform): (Ex: Win10, Linux, ...)
win 7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
code blocks
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
兩種情況,第一種正常,第二種有問題,不懂為什麼。
1.
void test(unsigned char img[640][480])
{
unsigned char *img_r; //用一維指標接二維陣列(不懂目的,有甚麼好處嗎?)
imgr = &img[0][0];
執行運算..
}
main()
{
unsigned char img[640][480];
...
test(img);
}
2. 其實這是我改的,compile出錯,有時卻會順利執行到結束
void test(unsigned char **img)
{
unsigned char *img_r; //用一維指標接二維陣列(不懂目的,有甚麼好處嗎?)
img_r = img;
執行運算..
}
main()
{
unsigned char **img;
unsigned long i;
img=(unsigned char**)malloc(512*sizeof(unsigned char*));
for(i=0; i<512; i++)
img[i]=(unsigned char*)malloc(640*sizeof(unsigned char));
test(img);
}
餵入的資料(Input):
image raw data
預期的正確結果(Expected Output):
我是不知道為何原本的程式要把二維位址傳到一維,
但不論目的,我覺得我改這樣跟原本沒甚麼差吧?
除了在記憶體內 可能排列不太一樣之外(?
錯誤結果(Wrong Output):
有時程式執行到一半直接當掉,檢查是在test副程式內運算一維陣列時出錯
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
1.我不知道為何要丟給一維去處理,這樣有甚麼好處嗎? 比較快?
(那乾脆讀圖就用一維接阿@@?)
2.我這兩種寫法有甚麼具體的差別嗎? 我是不是想錯甚麼了?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.54.15
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1478655008.A.D1A.html
→
11/09 09:36, , 1F
11/09 09:36, 1F
謝謝,我等等看一下
推
11/09 09:39, , 2F
11/09 09:39, 2F
→
11/09 09:40, , 3F
11/09 09:40, 3F
1不是我寫的阿,所以文中我有說,我也不知道為什麼,也不懂目的...
→
11/09 09:49, , 4F
11/09 09:49, 4F
我也覺得...可是目前程式碼就是硬要丟到一維,我不確定目的之前還不想改他
因為目前是沒有bug狀態
※ 編輯: DirKai (118.163.54.15), 11/09/2016 09:54:12
→
11/09 10:10, , 5F
11/09 10:10, 5F
→
11/09 10:11, , 6F
11/09 10:11, 6F
→
11/09 12:17, , 7F
11/09 12:17, 7F
→
11/09 12:18, , 8F
11/09 12:18, 8F
→
11/09 12:20, , 9F
11/09 12:20, 9F
其實我主要是想問,2到底做錯了甚麼,為什麼1程式執行正常,
2.的程式執行會當掉?
我自己之前寫的img都是二維動態陣列,讀很大的圖檔也都沒事
可是,現在傳給一維就出錯,是因為連不連續的問題嗎?
※ 編輯: DirKai (118.163.54.15), 11/09/2016 13:36:03
推
11/09 13:53, , 10F
11/09 13:53, 10F
推
11/09 13:59, , 11F
11/09 13:59, 11F
→
11/09 13:59, , 12F
11/09 13:59, 12F
→
11/09 14:00, , 13F
11/09 14:00, 13F
所以1.的 img[512][640]傳過去 test(img); 是算pointer 非double pointer嗎?
2.我的確compile過耶...到執行階段程式才當掉。
※ 編輯: DirKai (118.163.54.15), 11/09/2016 14:03:34
→
11/09 14:01, , 14F
11/09 14:01, 14F
→
11/09 14:02, , 15F
11/09 14:02, 15F
→
11/09 14:02, , 16F
11/09 14:02, 16F
→
11/09 14:02, , 17F
11/09 14:02, 17F
→
11/09 14:03, , 18F
11/09 14:03, 18F
了解 謝謝steve,我上面誤會你的推文了,抱歉。
程式碼的確常常用一維的array去指2d array,
然後一維的pointer 一直加陣列寬去找自己要的column,
這樣對於執行速度有比較快嗎? 還是只是為了整齊??
因為我個人覺得反而難閱讀就是了啦(也可能單純我菜@@)
想特別請教一下steve
1.的 img[512][640]傳過去 test(img); 是算pointer 非double pointer嗎?
※ 編輯: DirKai (118.163.54.15), 11/09/2016 14:10:31
推
11/09 14:17, , 19F
11/09 14:17, 19F
推
11/09 14:19, , 20F
11/09 14:19, 20F
那如果我用2.的方式改成 img_r = &img[0][0]; 會有甚麼問題嗎?
這樣子改也是給他一個位址,只是資料不連續。
※ 編輯: DirKai (118.163.54.15), 11/09/2016 14:26:15
→
11/09 14:28, , 21F
11/09 14:28, 21F
算有,原程式碼都是又宣告另外的一維指標
unsigned char *img1, *img2....;
img1 = img_r + width;
img2 = img1 + width;
...
然後對 img1[N]、img2[N] 去做運算 N=0 ~ width-1
應該就是你寫的那樣。 所以有你推文寫的那個,
→
11/09 14:29, , 22F
11/09 14:29, 22F
→
11/09 14:31, , 23F
11/09 14:31, 23F
對 那個for我打錯了,我程式裡面沒打錯,抱歉>"<
※ 編輯: DirKai (118.163.54.15), 11/09/2016 14:36:12
→
11/09 14:48, , 24F
11/09 14:48, 24F
→
11/09 14:51, , 25F
11/09 14:51, 25F
為什麼?? ai大是指2.的寫法嗎? 還是兩種都會?
越界是指動態陣列不連續 所以會越界嗎
※ 編輯: DirKai (118.163.54.15), 11/09/2016 14:54:52
→
11/09 14:56, , 26F
11/09 14:56, 26F
→
11/09 14:57, , 27F
11/09 14:57, 27F
→
11/09 15:01, , 28F
11/09 15:01, 28F
了解,所以是記憶體配置的問題。 如果不要用這種寫法應該就ok
謝謝以上替我解答的各位。
※ 編輯: DirKai (118.163.54.15), 11/09/2016 15:31:11
→
11/09 16:57, , 29F
11/09 16:57, 29F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
問題
5
29