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

請個位高手幫我debug程式

尚未結案
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-28 17:50:54 IP:163.28.xxx.xxx 未訂閱
小弟寫一個程式,雖然編譯可以執行可是Message欄位會出現下列訊息:    [C++ Warning] Unit1.cpp(419): W8060 Possibly incorrect assignment    程式主要功能是取Image3一半高度的像素,並找出像素之間兩點紅色的距離    程式碼如下:
 int D[2];
 int ss;
 Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Bmp->Height=Image3->Height;
 Bmp->Width=Image3->Width;
 int dim=Bmp->Height/2;
 Byte *ptr;
 ptr = (Byte *)Bmp->ScanLine[dim];
 for(int w=0; wWidth; w  )
   {
     if (ptr[w*3]=clRed)    //-----------程式碼第419行
       {
         int i=0;
         D[i]=w;
         i  ;
       }
   }
  ss=D[0]-D[1];
  float dd= ss*(0.104058/2);
  Edit3->Text=FormatFloat("###0.000",dd);
  delete Bmp;
請各位高手幫幫忙,謝謝!
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-28 18:14:44 IP:221.169.xxx.xxx 未訂閱
偶猜想你是要只取紅色的點吧,如果是那應該改成下面(如紅色程式碼)     
int D[2];
 int ss;
 Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Bmp->Height=Image3->Height;
 Bmp->Width=Image3->Width;
 int dim=Bmp->Height/2;
 Byte *ptr;
 ptr = (Byte *)Bmp->ScanLine[dim];
 for(int w=0; wWidth; w  )
   {
     if (ptr[w*3]==clRed)    //-----------程式碼第419行
       {
         int i=0;
         D[i]=w;
         i  ;
       }
   }
  ss=D[0]-D[1];
  float dd= ss*(0.104058/2);
  Edit3->Text=FormatFloat("###0.000",dd);
  delete Bmp;
 
========================= 大家一起快樂寫程式
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-28 22:05:25 IP:163.28.xxx.xxx 未訂閱
lu您好: 謝謝您的答覆 我用不同
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-29 04:56:58 IP:211.74.xxx.xxx 未訂閱
您好:修改如下     
int D[2];
 int ss;
 Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Bmp->Height=Image3->Height;
 Bmp->Width=Image3->Width;
 int dim=Bmp->Height/2;
 Byte *ptr;
 ptr = (Byte *)Bmp->ScanLine[dim];
int i=0;
 for(int w=0; wWidth; w  )
   {
     if (ptr[w*3]==clRed)    //-----------程式碼第419行
       {
         //int i=0;//宣告跟設定應該放在迴圈外
         D[i]=w;
         i  ;
       }
   }
  ss=D[0]-D[1];
  float dd= ss*(0.104058/2);
  Edit3->Text=FormatFloat("###0.000",dd);
  delete Bmp;
 
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-29 12:35:21 IP:163.28.xxx.xxx 未訂閱
StrongLemon您好: 我用您的方法測試會出現錯誤 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=21286204&CC=476056">
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-29 13:09:17 IP:220.130.xxx.xxx 未訂閱
首先想反問您,您的一個紅點是一個pixel還是很多pixel合成的? 如果是一個pixel的話,您在D[i]的部份才不會出現over access 而您的scanline似乎只能抓到一行,如果是一個斜線的二點,可能就抓不到 所以您的功能是抓在同一行上二紅點的距離嗎? 加油!
------
加油!
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-29 22:43:02 IP:203.73.xxx.xxx 未訂閱
您好:我先釐清觀念, 兩點紅色距離是指最相近兩點的距離嗎?還是最遠距離? 會發生AV錯誤代表說這條線中不只兩點紅色,這時該如何處理? 又如果只有一點?或者根本沒有點時該如何處理?
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-30 13:40:07 IP:163.28.xxx.xxx 未訂閱
如上圖所示,我想求得AB兩點的距離 我先找出180個pixel點再用 BMP->Canvas->MoveTo() BMP->Canvas->LineTo() 畫出紅色輪廓 所以當初我直覺上的想法是認為只有一點,所以程式碼僅能處理2單點 可能正如 > 可否提供意見以供參考,謝謝!
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-30 21:10:18 IP:211.74.xxx.xxx 未訂閱
您好:我再問清楚您的需求.. 猜測如下: 就圖上而言,是要將圖的紅色不規則多邊形範圍選取出來嗎? 還是使用者選取AB兩點之後計算之間距離?
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-31 15:54:58 IP:163.28.xxx.xxx 未訂閱
StrongLemon您好: 不好意思造成您的渾淆 紅色輪廓是已知條件,我只是希望能按個
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-31 16:31:23 IP:220.130.xxx.xxx 未訂閱
如果是在同一條線上找二點  D[0]=0;  for(int w=0; wWidth; w ) { if (ptr[w*3]==clRed) //-----------程式碼第419行 { if(D[0]==0) D[0]=w; //抓第一點 else if(w-D[0]!=1) D[1]=w; //抓非相鄰的第一點 } } 這樣不知道對你有沒有幫助,很久沒有寫c code了,如果語法有誤,就修一下吧 加油!
------
加油!
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-03-31 17:51:40 IP:220.135.xxx.xxx 未訂閱
williams8807你好: 針對你的標題,我想你應該有得到答案,如果你還有別的問題 可另開主題再作討論,請勿一題多問,謝謝合作 發表人 - jerrykuo 於 2005/03/31 17:57:43
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-04-01 11:28:50 IP:221.169.xxx.xxx 未訂閱
您好:我測試出來的Code..問題點在於你紅色點是B:0;G:0;R:254,       不是255,另外點陣圖的顏色數16bit or 24bit還必須多加判斷。       可以在K.Top搜尋ScanLine相信你會得到更多資訊。    
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Graphics::TBitmap *pBitBmp = new Graphics::TBitmap();
  TMemoryStream *pMemoryStream =new TMemoryStream;
  try
  {
    Image1->Picture->Bitmap->SaveToStream(pMemoryStream);
    pMemoryStream->Position=0;
    pBitBmp->LoadFromStream(pMemoryStream);
    int PixelFormatBytes;
    if (pBitBmp->PixelFormat==pf16bit)
      PixelFormatBytes=2;
    else
    if (pBitBmp->PixelFormat==pf24bit)
      PixelFormatBytes=3;
    //PixelFormatBytes=3;
    pBitBmp->Height=Image1->Height;
    pBitBmp->Width=Image1->Width;
    int dim=pBitBmp->Height/2;
    dim=dim 5;
    Byte *ptr;
    ptr = (Byte *)pBitBmp->ScanLine[dim];
    int wWidth=pBitBmp->Width;
    int MinValue=-1;
    int MaxValue=-1;
    int PointCount=0;
    for(int W=0;WLines->Add("B=" IntToStr(ptr[W*3]) "G=" IntToStr(ptr[W*3 1]) "R=" IntToStr(ptr[W*3 2]));
      if ((ptr[W*3]==0) && (ptr[W*3 1]==0) && (ptr[W*3 2]==254))
      {
       if (MinValue==-1)
       {
         MinValue=W;
         MaxValue=W;
       }
       else
       if (W>MaxValue)
       {
         MaxValue=W;
       }
       PointCount  ;
      }
    }
    int Distance=MaxValue-MinValue;
    Button1->Caption=IntToStr(Distance) ":" IntToStr(PointCount);
  }
  __finally
  {
    FreeAndNil(&pMemoryStream);
    FreeAndNil(&pBitBmp);
  }
}    
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-04-01 22:16:18 IP:163.28.xxx.xxx 未訂閱
以後發問時我會多加留意,造成大家的困擾真是不好意思 也感謝
系統時間:2024-05-02 8:26:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!