這兩周配合同事徐軍搞了個FPGA測試軟件。在測試過程中出現了幾個問題,現在終于解決了,現在總結如下:
1、char *pTemp=new char[800];
然后是一些關于pTemp的操作,例如
for(int i=0;i<800;i++)
{
......;
pTemp++;
}
然后我用delete pTemp;程序運行就出現錯誤了,經過調試發現,應該char *pBuf; pBuf=pTemp;然后delete pBuf;就可以了。這樣既不會產生內存泄漏,又不會刪除空的內存。
2、軟件定時刷新顯示,我將從單片機要來的數據顯示在CRichEditCtrl控件上面,代碼如下:
CHARFORMAT CTestView::GetCharFormat(DWORD dwMask)
{
CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = dwMask;
m_richEdit.GetSelectionCharFormat(cf);
return cf;
}
void CTestView::showData(CString szData,COLORREF crColorData)
{
int len;
CHARFORMAT cf = GetCharFormat(1); //初始化
if (cf.dwEffects & CFE_AUTOCOLOR)
cf.dwEffects -= CFE_AUTOCOLOR;
cf.dwMask= CFM_COLOR;
//寫入數據太多時,richedit控件不能正確顯示顏色,所以分段顯示
int count = szData.GetLength()/5000;
long Base = 0;
for(int i=0;i<count;i++)
{
cf.crTextColor = crColorData;
m_richEdit.SetSelectionCharFormat(cf);
len = m_richEdit.GetWindowTextLength();
m_richEdit.SetSel(len,len);
m_richEdit.ReplaceSel(szData.Mid(Base,szData.GetLength()/count));
Base += szData.GetLength()/count;
}
cf.crTextColor = crColorData;
m_richEdit.SetSelectionCharFormat(cf);
len = m_richEdit.GetWindowTextLength();
m_richEdit.SetSel(len,len);
m_richEdit.ReplaceSel(szData.Mid(Base));
//m_richEdit.LineScroll(m_richEdit.GetLineCount());
m_richEdit.SetModify(FALSE);
}
void CTestView::showString(CString szTitle,COLORREF crColorTitle,
CString szData,COLORREF crColorData)
{
CString szText="";
CHARFORMAT cf= GetCharFormat(1);
if (cf.dwEffects & CFE_AUTOCOLOR)
cf.dwEffects -= CFE_AUTOCOLOR;
cf.dwMask = CFM_COLOR;
cf.crTextColor = crColorTitle;
m_richEdit.SetSelectionCharFormat(cf);
int len = m_richEdit.GetWindowTextLength();
m_richEdit.SetSel(len,len);
m_richEdit.ReplaceSel(szTitle);
m_richEdit.LineScroll(1);
m_richEdit.SetModify(FALSE);
cf.crTextColor = crColorData;
m_richEdit.SetSelectionCharFormat(cf);
len = m_richEdit.GetWindowTextLength();
m_richEdit.SetSel(len,len);
m_richEdit.ReplaceSel(szData);
m_richEdit.LineScroll(1);
m_richEdit.SetModify(FALSE);
cf.crTextColor = RGB(0,0,255);
m_richEdit.SetSelectionCharFormat(cf);
len = m_richEdit.GetWindowTextLength();
m_richEdit.SetSel(len,len);
m_richEdit.ReplaceSel(szText);
m_richEdit.LineScroll(1);
m_richEdit.SetModify(FALSE);
}
在OnInitialUpdate()函數中,我初始化m_richEdit如下:
//初始化m_richEdit
m_richEdit.Create(WS_VSCROLL|WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN,
CRect(10,34,486,380), this, 1);
m_richEdit.ModifyStyleEx(1, WS_EX_CLIENTEDGE);
m_richEdit.SetReadOnly();
在定時顯示里面,我調用showData()函數:
row=absoluteAddr;
while(*pTemp!='\0')
{
strtemp=pTemp;
for(i=0;i<48;i++)
pTemp++;
//顯示行號
str.Format("%04x",row);
row += 0x10;
str += " ";
showData(str,RGB(128,128,0));
//顯示前八個字節
str=strtemp.Left(24);
str += " ";
showData(str,RGB(0,0,255));
//顯示后八個字節
str=strtemp.Mid(24,24);
showData(str,RGB(0,0,255));
//換行
str="\r\n";
showData(str,RGB(0,0,255));
}
后來發現一個問題,當顯示行號為000f時候,即最后一行的時候總是回比前面的多往前縮進一個空格,考慮到最后一行還多加了一個回車換行,我把代碼該成如下:
for(row=absoluteAddr;row<absoluteAddr+0x0F*0x10;row += 0x10)
{
strtemp=pTemp;
for(i=0;i<48;i++)
pTemp++;
//顯示行號
str.Format("%04x",row);
str += " ";
showData(str,RGB(128,128,0));
//顯示前八個字節
str=strtemp.Left(24);
str += " ";
showData(str,RGB(0,0,255));
//顯示后八個字節
str=strtemp.Mid(24,24);
showData(str,RGB(0,0,255));
//換行
str="\r\n";
showData(str,RGB(0,0,255));
}
str.Format("%04x",row);
str += " ";
showData(str,RGB(128,128,0));
strtemp=pTemp;
//顯示前八個字節
str=strtemp.Left(24);
str += " ";
showData(str,RGB(0,0,255));
//顯示后八個字節
str=strtemp.Mid(24,24);
showData(str,RGB(0,0,255));