作者NoobImage (老人家)
看板C_and_CPP
標題[問題] 看不懂得C++ 求高手幫忙解讀
時間Thu Jul 1 17:09:37 2010
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
( 未必需要依照此格式,文章條理清楚即可 )
遇到的問題: (題意請描述清楚)
C語法無法了解
希望得到的正確結果:
何種C語言
紅色標示箭頭處語法的解釋
程式跑出來的錯誤結果:
無
有問題的code: (請善用置底文標色功能)
補充說明:
此為快速傅利葉轉換程式碼
數學式處理可以忽略 主因內容很多函式筆者不懂
希望可以了解 並了解此為何種語言
//--------------------------分隔線-----------------------//
//-------------------------------------------------------//
BOOL CFilterFFT::Execute(
CBmp *pImage)<---何謂CBmp沒看過的類型
{
if(pImage == NULL)
{
return FALSE;
}
ASSERT(pImage->GetBitCount() == 8); <---看了解釋不懂
程式跑true沒事 跑false會跳error
// 循環控制變量
int x;
int y;
// 圖像的高度和寬度
int nWidth = pImage->GetWidth();
int nHeight = pImage->GetHeight();
//實際內存中的寬度
int nWidthMemory = pImage->GetWidthMemory();
//圖像數據
LPBYTE pImageData = pImage->GetBits();<--LP???沒看過的格式
// 臨時變量
double dTemp;
// 傅立葉變換高度,2的冪數
int nHeightFFT;
// 傅立葉變換寬度,2的冪數
int nWidthFFT;
/*------------計算傅立葉變換的寬度和高度,是2的冪數------開始---*/
dTemp = log(nWidth)/log(2);
dTemp = ceil(dTemp);
dTemp = pow(2,dTemp);
nWidthFFT = (int) dTemp;
dTemp = log(nHeight)/log(2);
dTemp = ceil(dTemp);
dTemp = pow(2,dTemp);
nHeightFFT = (int) dTemp;
/*------------計算傅立葉變換的寬度和高度,是2的冪數------結束---*/
// 指向圖像數據的指針
LPBYTE lpSrc;
// 指向空間域數據的指針
complex<double> * pSpaceData;
// 指向頻域數據的指針
complex<double> * pFrequencyData;
// 分配內存
pSpaceData = new complex<double>[nWidthFFT * nHeightFFT];
pFrequencyData = new complex<double>[nWidthFFT * nHeightFFT];
if ((pSpaceData == NULL) || (pFrequencyData == NULL))
{
return FALSE;
}
/*-------------- 初始化空間域數據-----------開始----------*/
/*
* 圖像數據的寬和高不一定是2的整數次冪,
* pSpaceData有一部分數據需要補0
*/
for(y=0; y<nHeightFFT; ++y)
{
for(x=0; x<nWidthFFT; ++x)
{
pSpaceData[y*nWidthFFT+x] = complex<double>(0, 0);
}
}
// 把圖像數據傳給pSpaceData
for(y=0; y<nHeight; ++y)
{
for(x=0; x<nWidth; ++x)
{
lpSrc = (LPBYTE) (pImageData + y * nWidthMemory + x) ;
//空間域乘以pow(-1, x+y),頻譜移至中心
pSpaceData[y*nWidthFFT+x] = complex<double>((*lpSrc) * pow(-1, x+y),0);
}
}
/*-------------- 初始化空間域數據-----------結束----------*/
//快速傅立葉變換
FFT_2D(pSpaceData, nWidthFFT, nHeightFFT, pFrequencyData) ;
for(y=0; y<nHeight; ++y)
{
for(x=0; x<nWidth; ++x)
{
//取模
dTemp = pFrequencyData[y * nWidthFFT + x].real()
* pFrequencyData[y * nWidthFFT + x].real()
+ pFrequencyData[y * nWidthFFT + x].imag()
* pFrequencyData[y * nWidthFFT + x].imag();
dTemp = sqrt(dTemp) / (double) nWidth; //除以因子N
// 圖像數據值小於255
if(dTemp > 255)
{
dTemp = 255;
}
pImageData[y*nWidth+x] = (BYTE) dTemp;
}
}
// 釋放內存
delete []pSpaceData;
delete []pFrequencyData;
pSpaceData = NULL; <---為何要清除後給NULL
pFrequencyData = NULL;
return TRUE;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.64.100.1
推 VictorTom:開發環境是什麼?? VC可以對它按右鍵選goto defination試 07/01 18:02
→ VictorTom:試; 簡單的說, 那是引用來/或者作者在其他地方自己寫/定 07/01 18:03
→ VictorTom:義的struct或class, 用途與使用方式如果沒有手冊/說明檔 07/01 18:03
→ VictorTom:/註解, 你就只能自己想辦法猜. 07/01 18:03
→ VictorTom:assert的用法請去google看就有, 在本板search也有些討論 07/01 18:05
→ VictorTom:delete後把指標變數清成NULL可能是一種習慣, 也可能是其 07/01 18:06
→ VictorTom:它地方會用該變數是否為NULL來做某些判斷. 07/01 18:06
→ VictorTom:我1F的推文指的是 CBmp , 包含你後面所有基於pImage提出 07/01 18:07
→ VictorTom:的問題都一樣.... 07/01 18:07
→ x000032001:delete後給NULL 防止再次存取 就是這樣 07/01 18:13
→ NoobImage:謝謝V大喔 這樣我大致了解了 可是還要猜想函式內容 07/01 18:28