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

請幫忙看看這支程式的問題在哪

尚未結案
pork
一般會員


發表:15
回覆:13
積分:5
註冊:2003-10-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-17 19:29:45 IP:220.141.xxx.xxx 未訂閱
大家好 這支程式的 主要作用是要把一張圖的灰階像素值取出後 取前四碼再將後四碼補0後還原回去 可是試驗時 如果是只有一個PIXEL的圖時就沒問題 可是如果跑2*2的圖就會在這一行出現問題 Edit2->Text=AnsiString::StringOfChar('0',8-Edit2->Text.Length())+Edit2->Text; 訊息是 Access violation at address 32657D07 in module‘CC3260MT.DLL’.Write of address 00000000    可否請大家幫忙看看問題在那兒 謝謝 pork 上    void __fastcall TForm1::GetClick(TObject *Sender) {         Graphics::TBitmap *Bmp1=new Graphics::TBitmap();         Graphics::TBitmap *Bmp2=new Graphics::TBitmap();            Bmp1->Assign(Image1->Picture->Bitmap);            int n,temp,a[8],answer;            for(int i=0;iWidth;i ) for(int j=0;jHeight;j ) { pixel_value[i][j]=GetBValue(Bmp1->Canvas->Pixels[i][j]); temp=pixel_value[i][j]; for (n=0 ; temp>0 ; n ) { a[n] = temp % 2 ; //取餘數 temp = temp / 2 ; //除以二 } for (int p=n-1 ; p>=0 ; p--) { Edit2->Text = Edit2->Text a[p] ; } Edit2->Text=AnsiString::StringOfChar('0',8-Edit2-Text.Length()) Edit2->Text; AnsiString b=Edit2->Text; Edit3->Text= b.SubString(0,4); //取前四位元 //Edit4->Text=b.SubString(5,4); //取後四位元 Edit5->Text=Edit3->Text "0000"; //取原前四位元後面補0到八位元 answer=Edit5->Text[8]*1 Edit5->Text[7]*2 Edit5->Text[6]*4 Edit5->Text[5]*8 Edit5->Text[4]*16 Edit5->Text[3]*32 Edit5->Text[2]*64 Edit5->Text[1]*128-12240;//算出pixel值 Bmp2->Canvas->Pixels[i][j]=answer 0x01000000; } Image2->Picture->Bitmap->Assign(Bmp2); 發表人 - pork 於 2004/10/17 20:48:16
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-17 20:17:25 IP:211.76.xxx.xxx 未訂閱
SubString(index,length) 中的 index 應該是 1 為底的,也就是,如果 AnsiString as="12345"; as.SubString(2,2)  結果是 "23" 所以,如果要取前 4 碼,應該是 SubString(1,4) 另外,AnsiString 使用 [] 同樣是 1 為底,不過很容易 Exception,需要很小心使用,例如: AnsiString as="12345"; as[1]='1' as[2]='2' as[3]='3' as[4]='4' as[5]='5' 而如果您使用 as[0], 或 as[6] 則會發生 exception。    您此部分的程式碼: answer=Edit5->Text[8]*1+Edit5->Text[7]*2+Edit5->Text[6]*4+Edit5->Text[5]*8 +Edit5->Text[4]*16+Edit5->Text[3]*32+Edit5->Text[2]*64+Edit5->Text[1]*128-12240;//算出pixel值 應該只是把文字轉數字吧... 使用 StrToInt(Edit5->Text)-12240 或是 StrToIntDef(Edit5->Text,0)-12240 StrToInt("0x" Edit5->Text)-12240 或是 StrToIntDef("0x" Edit5->Text,0)-12240 應該是比較快的吧...(當然,我是看不懂為什麼要 -12240 啦) 吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ SoftKing VMASK - ViewMove Automation Software Kernel 發表人 - dllee 於 2004/10/17 20:21:07
------
http://www.ViewMove.com
pork
一般會員


發表:15
回覆:13
積分:5
註冊:2003-10-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-17 21:12:10 IP:220.141.xxx.xxx 未訂閱
dllee兄您好 感謝您的回覆 只是我是初學者 經過修改之後 問題還是存在 每次都是在下列這行出錯 Edit2->Text=AnsiString::StringOfChar('0',8-Edit2->Text.Length()) Edit2->Text; 訊息是 Access violation at address 32657D07 in module‘CC3260MT.DLL’.Write of address 00000000 真是搞不清楚問題所在 另外經過中斷點的測試 我的temp值很大 我想應該是在255以內(pixel_value[i][j]的值都在255以內) 但是卻是高達2568748....一大串的數字 會不會是這個原因
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-17 21:43:08 IP:219.80.xxx.xxx 未訂閱
Hello pork,    先讓你程式裡的temp值是否都在<=255的範圍內吧. 否則Edit2->Text如果大於8個字的話,那要做
Edit2->Text=AnsiString::StringOfChar('0',8-Edit2->Text.Length()) Edit2->Text;
一定會出問題.
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-18 00:13:04 IP:221.169.xxx.xxx 未訂閱
pork:
可是如果跑2*2的圖就會在這一行出現問題
Edit2->Text=AnsiString::StringOfChar('0',8-Edit2->Text.Length()) Edit2->Text;
訊息是
Access violation at address 32657D07 in module‘CC3260MT.DLL’.Write of address 00000000
可否檢查Edit2->Text.Length()是否大於八?
int r=Edit2->Text.Length();
if (r < 0 ) r=0;
Edit2->Text=AnsiString::StringOfChar('0',8-r) Edit2->Text;
另外:
for (int p=n-1 ; p>=0 ; p--)  {
  Edit2->Text = Edit2->Text   a[p] ; //a[p]是整數型態
}
執行難到不出問題?請改為:
  Edit2->Text = Edit2->Text   IntToStr(a[p]);    請參考!    
Andy Chang 發表人 - andychang1690 於 2004/10/18 00:20:16
------
Andy Chang
系統時間:2024-05-21 5:29:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!