问题描述
- c++怎么在view里的一个函数引用的函数里再引用一个函数?
-
下面第一个函数就是我想要在第二个函数里面用的,而第二个函数是第一个引用的
void CZHANGMIN1View::InsertSort(unsigned char pArray, int iLength)
{
unsigned char tmp;
int i, j;
for(i = 1; i < iLength; i++)
{
j = i-1;
tmp = pArray[i];
while(j >= 0 && pArray[j] >= tmp)
{
pArray[j+1] = pArray[j];
j--;
}
pArray[j+1] = tmp;
}//end for i
}
HDIB Mfa(HDIB hDIB,int n)
{
BYTE temp=(BYTE)malloc(n*n*sizeof(BYTE));
//指向图像起始位置的指针
BYTE *lpDIB=(BYTE)::GlobalLock((HGLOBAL) hDIB);//指向象素起始位置的指针
BYTE pScrBuff =(BYTE)::FindDIBBits((char*)lpDIB);//获取图像的颜色信息
int numColors=(int) ::DIBNumColors((char *)lpDIB);//如果图像不是256色返回
if (numColors!=256)
{//解除锁定
::GlobalUnlock((HGLOBAL) hDIB);//返回 return(hDIB);
}
//将指向图像象素起始位置的指针,赋值给指针变量
BYTE* oldbuf = pScrBuff;int w, h, dw;
//获取图像的宽度
w = (int) ::DIBWidth((char *)lpDIB);//获取图像的高度
h = (int) ::DIBHeight((char *)lpDIB);//计算图像每行的字节数
dw = (w+3)/4*4;//建立一个和原图像大小相同的25色灰度位图
HDIB newhDIB=NewDIB(w,h,8);//指向新的位图的指针
BYTE newlpDIB=(BYTE)::GlobalLock((HGLOBAL) newhDIB);//指向新的位图的象素起始位置的指针
BYTE destBuf = (BYTE)FindDIBBits((char *)newlpDIB);
//将指向新图像象素起始位置的指针,赋值给指针变量
BYTE *newbuf=destBuf;
WORD wBitCount;
int m_nBitCount=wBitCount;
if(oldbuf != NULL)
{
delete[] oldbuf;
oldbuf = NULL;
}
int nLineByteOut = (w*m_nBitCount/8 + 3)/4*4;
oldbuf = new unsigned char[nLineByteOut*h];
//滤波窗口的最大值,例如滤波窗口大小从3->5->7->9->11->.......
int iFilterSizeMax = n;int i, j;
int k;
//给滤波窗口的数组申请空间
unsigned char* pArray = new unsigned char[iFilterSizeMax*iFilterSizeMax];int Zmin, Zmax, Zmed, Zxy;
int A1, A2, B1, B2;
int iFilterSize;
int W, H;
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
for(iFilterSize = 3; iFilterSize <= iFilterSizeMax; iFilterSize += 2)
{
k = 0;
for(H = 0; H < iFilterSize; H++)
{
for(W = 0; W < iFilterSize; W++)
{
if((i-iFilterSize/2+H) >= 0 && (i-iFilterSize/2+H) <= h-1 &&
(j-iFilterSize/2+W) >= 0 && (j-iFilterSize/2+W) <= w-1)
{
pArray[k] = *(oldbuf + (i-iFilterSize/2+H)*nLineByteOut + (j-iFilterSize/2+W));
k++;
}} } //对滤波窗口中的像素排序pDoc->m_hDIB =Mfa(pDoc->m_hDIB,3); InsertSort(pArray, k); Zmin = pArray[0]; Zmax = pArray[k-1]; Zmed = pArray[(k-1)/2]; Zxy = *(oldbuf + nLineByteOut*i + j); A1 = Zmed - Zmin; A2 = Zmed - Zmax; //这个if是来判断滤波窗口里的像素是否合格来完成滤波,合格则继续 //不合格就扩大滤波窗口,防止噪声太密集影响滤波 if(A1 > 0 && A2 < 0) { B1 = Zxy - Zmin; B2 = Zxy - Zmax; //这个if是来判断Zxy这点是不是噪声点的,是噪声点才要中值替换 if(B1 > 0 && B2 < 0) { //不是噪声点,直接跳出循环 *(oldbuf + nLineByteOut*i + j) = Zxy; break; } else { *(oldbuf + nLineByteOut*i + j) = Zmed; break; } } }//end for iFilterSize }//end for j
}//end for i
delete[] pArray;
//解除锁定
::GlobalUnlock((HGLOBAL)hDIB);//返回新的位图的句柄
return(newhDIB);
}
void CZHANGMIN1View::OnMfadaptive()
{
//自适应中值滤波
CZHANGMIN1Doc* pDoc = GetDocument();
pDoc->m_hDIB =Mfa(pDoc->m_hDIB,3);
Invalidate(TRUE);
}
每次调试都说Insertsort没有定义
error C2065: 'InsertSort' : undeclared identifier
解决方案
Mfa不是 CZHANGMIN1View类的成员函数,不能直接使用InsertSort
可以把Mfa函数改为CZHANGMIN1View类的成员函数
void CZHANGMIN1View::InsertSort(unsigned char *pArray, int iLength)
{
...
}
HDIB Mfa(HDIB hDIB,int n)
{
...
InsertSort(pArray, k);//不能直接使用InsertSort
...
return(newhDIB);
}
void CZHANGMIN1View::OnMfadaptive()
{
//自适应中值滤波
CZHANGMIN1Doc* pDoc = GetDocument();
pDoc->m_hDIB =Mfa(pDoc->m_hDIB,3);
Invalidate(TRUE);
}
解决方案二:
对一个C++函数的效率优化(好)
一个HexToInt的C/C++函数
解决方案三:
类型不一致
void CZHANGMIN1View::InsertSort(unsigned char *pArray, int iLength)//修改
unsigned char* pArray = new unsigned char[iFilterSizeMax*iFilterSizeMax];
InsertSort(pArray, k);
解决方案四:
void CZHANGMIN1View::InsertSort(unsigned char *pArray, int iLength)
{
unsigned char tmp;
int i, j;
for(i = 1; i < iLength; i++)
{
j = i-1;
tmp = pArray[i];
while(j >= 0 && pArray[j] >= tmp)
{
pArray[j+1] = pArray[j];
j--;
}
pArray[j+1] = tmp;
}//end for i
}
HDIB Mfa(HDIB hDIB,int n)
{
BYTE temp=(BYTE)malloc(n*n*sizeof(BYTE));
//指向图像起始位置的指针
BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) hDIB);
//指向象素起始位置的指针
BYTE *pScrBuff =(BYTE*)::FindDIBBits((char*)lpDIB);
//获取图像的颜色信息
int numColors=(int) ::DIBNumColors((char *)lpDIB);
//如果图像不是256色返回
if (numColors!=256)
{
//解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
//返回
return(hDIB);
}
//将指向图像象素起始位置的指针,赋值给指针变量
BYTE* oldbuf = pScrBuff;
int w, h, dw;
//获取图像的宽度
w = (int) ::DIBWidth((char *)lpDIB);
//获取图像的高度
h = (int) ::DIBHeight((char *)lpDIB);
//计算图像每行的字节数
dw = (w+3)/4*4;
//建立一个和原图像大小相同的25色灰度位图
HDIB newhDIB=NewDIB(w,h,8);
//指向新的位图的指针
BYTE *newlpDIB=(BYTE*)::GlobalLock((HGLOBAL) newhDIB);
//指向新的位图的象素起始位置的指针
BYTE *destBuf = (BYTE*)FindDIBBits((char *)newlpDIB);
//将指向新图像象素起始位置的指针,赋值给指针变量
BYTE *newbuf=destBuf;
WORD wBitCount;
int m_nBitCount=wBitCount;
if(oldbuf != NULL)
{
delete[] oldbuf;
oldbuf = NULL;
}
int nLineByteOut = (w*m_nBitCount/8 + 3)/4*4;
oldbuf = new unsigned char[nLineByteOut*h];
//滤波窗口的最大值,例如滤波窗口大小从3->5->7->9->11->.......
int iFilterSizeMax = n;
int i, j;
int k;
//给滤波窗口的数组申请空间
unsigned char* pArray = new unsigned char[iFilterSizeMax*iFilterSizeMax];
int Zmin, Zmax, Zmed, Zxy;
int A1, A2, B1, B2;
int iFilterSize;
int W, H;
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
for(iFilterSize = 3; iFilterSize <= iFilterSizeMax; iFilterSize += 2)
{
k = 0;
for(H = 0; H < iFilterSize; H++)
{
for(W = 0; W < iFilterSize; W++)
{
if((i-iFilterSize/2+H) >= 0 && (i-iFilterSize/2+H) <= h-1 &&
(j-iFilterSize/2+W) >= 0 && (j-iFilterSize/2+W) <= w-1)
{
pArray[k] = *(oldbuf + (i-iFilterSize/2+H)*nLineByteOut + (j-iFilterSize/2+W));
k++;
}
}
}
//对滤波窗口中的像素排序pDoc->m_hDIB =Mfa(pDoc->m_hDIB,3);
InsertSort(pArray, k);
Zmin = pArray[0];
Zmax = pArray[k-1];
Zmed = pArray[(k-1)/2];
Zxy = *(oldbuf + nLineByteOut*i + j);
A1 = Zmed - Zmin;
A2 = Zmed - Zmax;
//这个if是来判断滤波窗口里的像素是否合格来完成滤波,合格则继续
//不合格就扩大滤波窗口,防止噪声太密集影响滤波
if(A1 > 0 && A2 < 0)
{
B1 = Zxy - Zmin;
B2 = Zxy - Zmax;
//这个if是来判断Zxy这点是不是噪声点的,是噪声点才要中值替换
if(B1 > 0 && B2 < 0)
{
//不是噪声点,直接跳出循环
*(oldbuf + nLineByteOut*i + j) = Zxy;
break;
}
else
{
*(oldbuf + nLineByteOut*i + j) = Zmed;
break;
}
}
}//end for iFilterSize
}//end for j
}//end for i
delete[] pArray;
//解除锁定
::GlobalUnlock((HGLOBAL)hDIB);
//返回新的位图的句柄
return(newhDIB);
}
void CZHANGMIN1View::OnMfadaptive()
{
//自适应中值滤波
CZHANGMIN1Doc* pDoc = GetDocument();
pDoc->m_hDIB =Mfa(pDoc->m_hDIB,3);
Invalidate(TRUE);
}
解决方案五:
也可以声明为友元函数:
class CZHANGMIN1View
{
public:
friend HDIB Mfa(HDIB hDIB,int n);
}