動態指標傳遞的問題 |
尚未結案
|
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
今天小弟寫了一個程式
這個小程式很簡單:
目的:只是要將Image1的黑白圖片資訊讀入我所宣告動態二維陣列中
卻出現access error的問題 請問前輩們,我的觀念有錯嗎?
要如何修改動態2D arrayㄚ? 主程式碼:
void __fastcall TForm1::OpenFileClick(TObject *Sender) { ClearImage(Image1); if (OpenPictureDialog1->Execute()) { Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName); } int w=Image1->Width; int h=Image1->Height; NewPic(pic,w,h);//宣告一個動態陣列長寬為圖的長寬 ImgToPic(Image1,pic,w,h);// }副程式: //產生動態2D array void TForm1::NewPic(bool **pic,int width,int height) { pic= new bool *[width]; for(int i=0;i |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
plihui您好:
抱歉,由於第一次所測試的圖片不符合您程式的條件所以沒有錯誤訊息
請將您的程式改成這樣
void TForm1::ImgToPic(TImage *Img,bool **pic,int width,int height) { int color; pic= new bool *[width]; for(int i=0;i順心 |
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
plihui您好:
試試下面的code
void __fastcall TForm1::Button1Click(TObject *Sender) { //ClearImage(Image1); //不知道您程式的定義為何, 所以省略 if (OpenPictureDialog1->Execute()) { Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName); } int w=Image1->Width; int h=Image1->Height; bool** pic,**reUsePic;//利用**reUsePic來接您NewPic()的結果 reUsePic=NewPic(pic,w,h); ImgToPic(Image1,reUsePic,w,h); } //--------------------------------------------------------------------------- bool** TForm1::NewPic(bool **pic,int width,int height) { pic= new bool *[width]; for(int i=0;i順心 |
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
arisaka_matsuri
高階會員 ![]() ![]() ![]() ![]() 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
taishyang 你好:
引言: ... bool** pic,**reUsePic;//利用**reUsePic來接您NewPic()的結果 reUsePic=NewPic(pic,w,h); ImgToPic(Image1,reUsePic,w,h); } //--------------------------------------------------------------------------- bool** TForm1::NewPic(bool **pic,int width,int height) { pic= new bool *[width]; for(int i=0;i這樣把指標傳出去,真的就可以用嗎? 因為傳回的是指標,不是記憶體本身喔!所以當 pic 在 NewPic() 中被「動態配置」,要離開 NewPic() 前,記憶體不是「應該」要被歸還嗎?怎麼還能傳指標出去呢? 理論上,傳出去的指標還是指著當初被配置的 pic,但是因為離開函數,該塊記憶體應該「遺失」了,所以傳出去的指標沒用了吧~若對其存取,應該會發生不可預期之錯誤。小弟曾經發生過這樣的事,所以解決的方式是:將該動態配置的記憶體拷貝到函數外的變數去。 希望有些幫助,如果說錯了,還請多多指教~~ |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
arisaka_matsuri您好:
我是以下面這段code做測試的
int* __fastcall TForm1:: test(int* In) { In = new int[5]; In[0]=0; In[1]=1; In[2]=2; In[3]=3; In[4]=4; return In ; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int* P,*Q; P=test(Q); for (int i=0; i<5; i ) { Memo1->Lines->Add(P[i]); } delete []P; } //---------------------------------------------------------------------------若觀念錯誤煩請指導,小弟經驗尚嫩,若有錯誤請多多包含 |
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
arisaka_matsuri
高階會員 ![]() ![]() ![]() ![]() 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |