線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2362
推到 Plurk!
推到 Facebook!

二維陣列函數傳入及傳出問題

答題得分者是:daldal
hipig
高階會員


發表:31
回覆:75
積分:111
註冊:2007-01-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-22 18:57:31 IP:140.126.xxx.xxx 未訂閱
首先
因為特殊的需求我所宣告和作業的陣列大小為動態的

[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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-22 23:24:03 IP:140.115.xxx.xxx 未訂閱
理論上 應該不是 變數型態的問題
我猜 應該是
[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 已經在某個地方失去了主體
傳進去的也許 只有不知道指到那邊的指標
編輯記錄
FancyWing 重新編輯於 2008-05-22 23:27:30, 註解 無‧
FancyWing 重新編輯於 2008-05-22 23:44:47, 註解 無‧
FancyWing 重新編輯於 2008-05-22 23:47:49, 註解 無‧
FancyWing 重新編輯於 2008-05-22 23:49:14, 註解 無‧
FancyWing 重新編輯於 2008-05-22 23:51:14, 註解 無‧
FancyWing 重新編輯於 2008-05-22 23:58:47, 註解 無‧
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-05-23 00:59:57 IP:61.219.xxx.xxx 未訂閱
我覺得可能是記憶體操作產生的問題
你的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-05-23 22:28:08 IP:140.126.xxx.xxx 未訂閱

編輯記錄
hipig 重新編輯於 2008-05-25 18:20:00, 註解 無‧
系統時間:2024-04-27 4:54:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!