[問題] 二維陣列 指標傳遞

作者: DirKai (Dirk_AI(MIX))   2016-11-09 09:30:05
開發平台(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.我這兩種寫法有甚麼具體的差別嗎? 我是不是想錯甚麼了?
作者: theTai (theTai)   2016-11-09 09:36:00
感覺好像是置底十三戒中的第十二條
作者: steve1012 (steve)   2016-11-09 09:39:00
你用一個pointer 接double pointer 不覺得怪嗎都不用derefernce?
作者: pttworld (批踢踢世界)   2016-11-09 09:49:00
2之test不就直接拿二維的img運算了。實務上怕動到可以新寫函數內容小改,要註解捨棄也容易。業界的話因為有版控,改錯了抓history回來覆蓋程式段。
作者: aiwhat   2016-11-09 12:17:00
1裡面資料都是連續,2裡面不一定連續吧?後面的運算如果是把它當成640*480大小的array感覺會炸掉for i = [0, 640*480) do img_r[i] = xxx; end-for 這種
作者: steve1012 (steve)   2016-11-09 13:53:00
一的type 是對的2 根本連compile都不會過 你怎麼讓他跑的?2 你用一個pointer接double start pointer 光type就錯怎麼會對?我上面的推文本來就是講2 1本來就沒有錯寫code有時候為了乾淨 的確可能會把一個2d array的每一個row 都特別用一個pointer去指 看起來比較乾淨不過你給的code片段太少 很難知道為啥他要這樣但1本來就沒錯就是了不是 img[0][0] 是第一個element &img[0][0]是它的位置 跟 *img 指導的地方基本上一樣
作者: aiwhat   2016-11-09 14:28:00
2的後續運算有img_r[i * width + j]這種東西嗎?照main裡面的配置方式應該超過640就會越界了吧而且 main 裡面的 for 應該是 i = [0, 512)不是[0, 640)但是你main裡面那樣配置 img2 = img1 + width可能會越界&img[0] + width == &img[1] 結果應該會是 falseimg[i]裡面只保證img[i][0~639]是連續img[i][639]→img[i+1][0]不一定連續我是指2的寫法14:51那個寫錯 (&img[0][0] + width == &img[1][0])

Links booklink

Contact Us: admin [ a t ] ucptt.com