全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1164
推到 Plurk!
推到 Facebook!

動態指標傳遞的問題

尚未結案
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-02 22:22:20 IP:61.230.xxx.xxx 未訂閱
今天小弟寫了一個程式 這個小程式很簡單: 目的:只是要將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;iCanvas->Pixels[i][j]);
      if(color<128)//圖形黑色部分
       pic[i][j]=0;//<--error:為什麼上面行這裡不行
    }
}
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-02 23:14:52 IP:140.135.xxx.xxx 未訂閱
plihui您好: 我試了您的程式,並不會有access error的錯誤訊息耶? 請您再確認一下 
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-02 23:41:09 IP:61.230.xxx.xxx 未訂閱
真的嗎?    
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-02 23:42:27 IP:61.230.xxx.xxx 未訂閱
附註: 過了complier... run time還是有error ??
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-03 00:15:32 IP:140.135.xxx.xxx 未訂閱
plihui您好: 抱歉,由於第一次所測試的圖片不符合您程式的條件所以沒有錯誤訊息 請將您的程式改成這樣
void TForm1::ImgToPic(TImage *Img,bool **pic,int width,int height)
{
  int color;
  pic= new bool *[width];
  for(int i=0;iCanvas->Pixels[i][j]);
      if(color<128)//圖形黑色部分
        pic[i][j]=0;//<--error:為什麼上面行這裡不行
    }
}
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-03 01:05:40 IP:61.230.xxx.xxx 未訂閱
^_^...該說什麼呢? 謝謝大大回答: 其實我想保留pic這一塊的資訊, 假設我要利用剛剛讀進圖檔的資訊(一定要是pic這個2D動態陣列) 宣告一個函式做一個反白的動作 即:    
void TForm1::InvertToPic(bool **pic,int width,int height)
{
  int color;-
  for(int i=0;i
還是有access error的問題ㄚ!!(T_T)     
        
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-03 01:10:17 IP:140.135.xxx.xxx 未訂閱
plihui您好: 會出現access error是因為您是對指標的指標(**pic)做運算 而不是對由pic所動態產生的二維陣列做運算    順心 發表人 -
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-03 01:20:16 IP:61.230.xxx.xxx 未訂閱
還是不懂... 那我要怎麼"re use" pic這個動態指標?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-03 01:33:51 IP:140.135.xxx.xxx 未訂閱
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;iCanvas->Pixels[i][j]);
      if(color>128)//圖形黑色部分
      {
        pic[i][j]=0;
        Memo1->Lines->Add(IntToStr(i) " " IntToStr(j));
        Img->Canvas->Pixels[i][j]=clRed;
      }
    }
}
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-03-03 01:51:03 IP:61.230.xxx.xxx 未訂閱
原來是這樣ㄚ...感激不禁 承你所言: 離開Function,動態陣列就會消失 那麼動態陣列的data structure不適用於 recursive囉?! 比如: region growing的程式囉?? 如果說pic[i][j]=true/false 是表達已經處理過/未處理的點的話,那每次recursive pic都會歸零 然後記憶體大玩爆爆樂?!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-03-03 01:57:46 IP:140.135.xxx.xxx 未訂閱
plihui您好: 抱歉,您說的情況我沒試過 您可以在 >
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-03-03 14:02:43 IP:218.166.xxx.xxx 未訂閱
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;ireturn pic;//您原本的程式一離開NewPic(),pic就沒有了; } ...
這樣把指標傳出去,真的就可以用嗎? 因為傳回的是指標,不是記憶體本身喔!所以當 pic 在 NewPic() 中被「動態配置」,要離開 NewPic() 前,記憶體不是「應該」要被歸還嗎?怎麼還能傳指標出去呢? 理論上,傳出去的指標還是指著當初被配置的 pic,但是因為離開函數,該塊記憶體應該「遺失」了,所以傳出去的指標沒用了吧~若對其存取,應該會發生不可預期之錯誤。小弟曾經發生過這樣的事,所以解決的方式是:將該動態配置的記憶體拷貝到函數外的變數去。 希望有些幫助,如果說錯了,還請多多指教~~
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-03-03 14:28:16 IP:140.135.xxx.xxx 未訂閱
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-03-04 00:45:33 IP:61.230.xxx.xxx 未訂閱
就實作上來說 taishyang大大是可行的 我想請問1下 arisaka_matsuri所說的 將該動態配置的記憶體拷貝到函數外的變數去。 這點我不太懂,可否針對本問題做一範例 由於非資工本科系出身寫程式很辛苦, 也有很多概念上有所不清的地方,還請 諸位多多指導
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-03-04 23:46:50 IP:218.166.xxx.xxx 未訂閱
plihui 你好: 我翻了些資料,taishyang版大的作法應該是沒問題的。之前我的問題也因為這樣而得到了合理的解答,是我自己用錯了~呵呵~~不過,釐清我的觀念,也學到東西囉! 至於我用的方法,現在不提也罷,因為沒有比較好。有興趣去看看
系統時間:2024-04-28 10:49:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!