看板 C_and_CPP 關於我們 聯絡資訊
( *[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