二維陣列函數傳入及傳出問題 |
答題得分者是:daldal
|
hipig
高階會員 ![]() ![]() ![]() ![]() 發表:31 回覆:75 積分:111 註冊:2007-01-15 發送簡訊給我 |
首先
因為特殊的需求我所宣告和作業的陣列大小為動態的 [code cpp] unsigned char **Gravel; unsigned char **Sob; Gravel = new unsigned char*[HEIGHT]; Sob = new unsigned char*[HEIGHT]; for(int i = 0 ; i < HEIGHT ; i ) { Gravel[i] = new unsigned char [WIDTH]; Sob[i] = new unsigned char [WIDTH]; } for(int i = 0 ; i < HEIGHT ; i ) for(int j = 0 ; j < WIDTH ; j ) { Gravel[i][j] = 0; Sob[i][j] = 0; } [/code] 另外建立一個函數為 [code cpp] unsigned char **Sobel(const int IMAGE_HEIGHT, const int IMAGE_WIDTH, unsigned char **Graylevel) { unsigned char **Sobelim; Sobelim = new unsigned char *[IMAGE_HEIGHT]; for(int i = 0 ; i < IMAGE_HEIGHT ; i ) Sobelim[i] = new unsigned char [IMAGE_WIDTH]; /*一堆計算式*/ return Sobelim; }; [/code] 呼叫函數 Sob = Sobel(HEIGHT, WIDTH, Gravel); 但是傳入的Gravel在函數內(Graylevel)竟然是錯的 而另外兩個傳入的參數(IMAGE_HEIGHT和IMAGE_WIDTH)卻沒問題 請問是我函數傳入型態寫錯嗎 還是其他問題 |
FancyWing
一般會員 ![]() ![]() 發表:0 回覆:2 積分:5 註冊:2008-05-17 發送簡訊給我 |
理論上 應該不是 變數型態的問題
我猜 應該是 [code cpp] unsigned char **Sobel(...) // 這樣 會被判斷成 unsigned char (*(*Sobel))(...) // function point // 您 改成 unsigned char** Sobel(...) // 我故意空大一點 [/code] 抱歉 上面是錯的 ///////////// 我發現一個問題 我直接使用你的函式 沒有問題 [code cpp] // in file.h unsigned char **Sobel(const int IMAGE_HEIGHT, const int IMAGE_WIDTH, unsigned char **Graylevel) ; // in file.cpp unsigned char **Sobel(const int IMAGE_HEIGHT, const int IMAGE_WIDTH, unsigned char **Graylevel){ unsigned char **Sobelim; Sobelim = new unsigned char *[IMAGE_HEIGHT]; for(int i = 0 ; i < IMAGE_HEIGHT ; i ) Sobelim[i] = new unsigned char [IMAGE_WIDTH]; /*一堆計算式*/ for(int i = 0 ; i < IMAGE_HEIGHT ; i ){ for(int j = 0 ; j < IMAGE_WIDTH ; j ){ Sobelim[i][j] = Graylevel[i][j] ; } } /*一堆計算式*/ return Sobelim; }; [/code] [code cpp] // in main.cpp #define HEIGHT 4 #define WIDTH 3 // and in use unsigned char **Gravel; unsigned char **Sob; Gravel = new unsigned char*[HEIGHT]; Sob = new unsigned char*[HEIGHT]; for(int i = 0 ; i < HEIGHT ; i ) { Gravel[i] = new unsigned char [WIDTH]; Sob[i] = new unsigned char [WIDTH]; } for(int i = 0 ; i < HEIGHT ; i ) for(int j = 0 ; j < WIDTH ; j ){ Gravel[i][j] = 49; Sob[i][j] = 0; } Sob = Sobel(HEIGHT, WIDTH, Gravel); for(int i = 0 ; i < HEIGHT ; i ){ for(int j = 0 ; j < WIDTH ; j ){ ShowMessage(Sob[i][j]) ; } } [/code] 也許 傳進去的 Gravel 已經在某個地方失去了主體 傳進去的也許 只有不知道指到那邊的指標 |
daldal
高階會員 ![]() ![]() ![]() ![]() 發表:6 回覆:102 積分:226 註冊:2007-06-18 發送簡訊給我 |
我覺得可能是記憶體操作產生的問題
你的Sob陣列已經在開始動態分配WIDTH,HEIGHT完畢 後面使用可以直接傳Pointer或是Reference給函式計算 若是照目前的寫法,每次執行Sob = Sobel(HEIGHT, WIDTH, Gravel);這行 都有機會out of memory或是產生memory leak (因為原先的Sob並沒有被釋放,而你又給了他新的指標指向新的動態陣列) 你可以把函式改成如下試試看,函式裡面直接計算Convolution 不用再New, Delete (在家沒BCB,請自己實測囉) [code cpp] void Sobel(const int IMAGE_HEIGHT, const int IMAGE_WIDTH, unsigned char **&In, unsigned char **Out) [/code] 或是用原來的函式,但是把Sobel函式回傳給空的**指標,應該也是可以的。
編輯記錄
daldal 重新編輯於 2008-05-23 08:23:10, 註解 無‧
|
hipig
高階會員 ![]() ![]() ![]() ![]() 發表:31 回覆:75 積分:111 註冊:2007-01-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |