引用函数-c++怎么在view里的一个函数引用的函数里再引用一个函数?

问题描述

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);
}
时间: 2024-10-30 21:18:34

引用函数-c++怎么在view里的一个函数引用的函数里再引用一个函数?的相关文章

eclipse-问一下,,我eclisp关联了一个第三方库,我想再关联一个,或者将另一个移到工程里,怎么弄

问题描述 问一下,,我eclisp关联了一个第三方库,我想再关联一个,或者将另一个移到工程里,怎么弄 问一下,,我eclisp关联了一个第三方库,我想再关联一个,或者将另一个移到工程里,怎么弄?而且在我给libs放入jar包.clean不生成gen目录,没有R文件.报错 解决方案 如果是jar直接放在libs下面就好了,没有R一般是布局文件问题,仔细找找,如果是源码直接导入工程,在属性里面设置其Is Library前面打勾保存 在想要应用的工程属性里面添加一下就好了 解决方案二: http://

jquery-JQuery 语句,easyui里面的,能不能给解释下什么意思? 函数如何调用的,谢谢了

问题描述 JQuery 语句,easyui里面的,能不能给解释下什么意思? 函数如何调用的,谢谢了 function saveUser(){ $('#fm').form('submit',{//当提交表单时候,会发生submit事件 url: url, onSubmit: function(){ return $(this).form('validate'); }, success: function(result){ var result = eval('('+result+')'); if

一个通用的Datagrid导出Excel打印的源函数

datagrid|excel|打印|导出excel|函数 一个通用的Datagrid导出Excel打印的源函数闲暇之余,写成函数,供新人研究学习 'Power by:Landlordh '列宽默认为datagird的tablestyles(0)列宽的五分之一 'G2E(dg1) Public Function G2E(ByVal dg As DataGrid) Dim dt As New DataTable Try dt = CType(dg.DataSource, DataTable) Cat

网易新闻选择列表里面的cell移动怎么做,自己找了一个方法,但是不怎么会用, 求各位大神帮忙。

问题描述 网易新闻选择列表里面的cell移动怎么做,自己找了一个方法,但是不怎么会用, 求各位大神帮忙. -collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{} 解决方案 看下帮助文档,有函数参数的

spring 配置文件-spring 一个配置文件如何被多个项目引用

问题描述 spring 一个配置文件如何被多个项目引用 项目是依赖maven管理的,现在需求是这样的 app-parent下的app-core.app-web1.app-web2为module,其中app-core是公用的代码实现,app-web1和app-web2是两个web网站项目,spring配置,其中applicationContext.xml需要引用SpringHibernate.xml文件, 但我想把SpringHibernate.xml放在app-core里公用,想被多个web项目

winform-C# Winform: using.工程文件夹.所有窗口???每一个窗口都需要做一次引用???

问题描述 C# Winform: using.工程文件夹.所有窗口???每一个窗口都需要做一次引用??? 我在一个窗口的cs里,想用到工程SQL所有文件夹(FI.F2....)下的winform窗口:每一个都得引用吗?? 如using SQL.F1.winform1; using SQL.F2.winform2; .........public winform1 win1; public winform2 win2; winform1和winform2都来自SQL,using时候可以统一引用么,

vs mfc 保存数据到txt-vs2005,mfc下,想把编辑框里的数据保存到txt文件里,怎么实现啊

问题描述 vs2005,mfc下,想把编辑框里的数据保存到txt文件里,怎么实现啊 vs2005,mfc下,想把编辑框里的数据保存到txt文件里,怎么实现啊 解决方案 响应事件 比如你定义一个按钮,当点击这个按钮保存文件 你对这个按钮绑定点击事件函数 在函数里面取得编辑框的内容,然后写入到一个文件里面! 解决方案二: 用GetWindowText来获得编辑框中的内容,用FILE结构体来读写文件就可以 解决方案三: 想要自动保存的话,就加一个判断编辑框内容是否改变的消息处理,如果改变了,那么再写入

请问怎么把textbox里的字模数据依次放在数组里

问题描述 请问怎么把textbox里的字模数据依次放在数组里 解决方案 解决方案二:将字符串按逗号分割,再存放在数组里面解决方案三:具体怎么弄,希望给个例子!谢谢解决方案四:引用1楼Liekkas的回复: 将字符串按逗号分割,再存放在数组里面 具体怎么弄,希望给个例子!谢谢解决方案五:strings="abc,deab,cde,a,bcde";string[]sArray=s.Split('c');foreach(stringiinsArray)Console.WriteLine(i.

ibatis2.0如何在配置文件里判断id是否已经在result里

问题描述 xml配置文件里如何判断,比如表里某行数据否存在,如果存在不添加进result里,就是去掉重复数据的意思? 解决方案 要去掉重复记录,直接在SQL语句中添加distinct关键词:select distinct name, id from table解决方案二:关键词 DISTINCT 用于返回唯一不同的值.语法:SELECT DISTINCT 列名称 FROM 表名称解决方案三:引用表里某行数据否存在,如果存在不添加进result里,就是去掉重复数据的意思?没咋看明白呢.表里不存在数