c++关于函数输出值保存问题

无法支持的类型 2016-08-24 05:37:15
我有一个函数
函数原型: int __stdcall FP_FeatureExtract(unsigned char cScannerType,unsigned char
cFingerCode,unsigned char * pFingerImgBuf,unsigned char * pFeatureData)。
参数: unsigned char cScannerType 。输入参数。
unsigned char cFingerCode 。输入参数。
unsigned char * pFingerImgBuf 图像数据指针,指纹图像为RAW格式。输入参数。
unsigned char * pFeatureData 图像特征数据指针,存储生成的图像特征数据,由调
用者分配内存空间,输出参数。
返回值: 调用成功,返回1;否则返回错误代码,错误代码值应符合B.4的要求。
我调用以后
nRlt = FP_FeatureExtract(17, 11, imageRAW, pFeatureData);
这个pFeatureData指针就有了值。
现在是一个for循环,每次imageRAW都会变,所以pFeatureData也会变。
我现在要用pFeatureData这个值,for循环3次 我需要3个pFeatureData值。
所以我想问 如何在for循环里面把这个值保存下来。 一直到我整个函数结束。
...全文
484 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
前提是FP_FeatureExtract负责给pFeatureData分配了内存;但这个我猜不可能。
  • 打赏
  • 举报
回复
如果次数,变化可以用vector。 如果次数比较固定,就用赵老师的方法。

vectro<unsigned char *> vecpData;
for(int i=0; i<3; i++) {  // 次数可变
    unsigned char * pFeatureData = NULL;
    nRlt = FP_FeatureExtract(17, 11, imageRAW, pFeatureData);
    vecpData.push_back(pFeatureData);
}
//用完之后清理什么的也很方便。
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
nRlt= FP_FeatureMatch(&pFeatureData[2][0],&pFeatureData[2][1],&pfSimilarity[0]); nRlt= FP_FeatureMatch(&pFeatureData[2][0],&pFeatureData[2][2],&pfSimilarity[1]); nRlt= FP_FeatureMatch(&pFeatureData[2][1],&pFeatureData[2][2],&pfSimilarity[2]);
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
pFeatureData[3][4];是肯定不行的。因为前面定义 static unsigned char pFeatureData[3][512]; 你只能使用 static unsigned char pFeatureData[0..2][0..511]; 否则就是越界。
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
float pfS[3];
...,&pfS[0]);
...,&pfS[1]);
...,&pfS[2]);
TRACE(...,pfS[0]);
TRACE(...,pfS[1]);
TRACE(...,pfS[2]);

和

float pfS0,pfS1,pfS2;
...,&pfS0);
...,&pfS1);
...,&pfS2);
TRACE(...,pfS0);
TRACE(...,pfS1);
TRACE(...,pfS2);

没有本质区别。
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
pfSimilarity[i]是float类型,你要用%f输出: TRACE("%d [%f]\n",i,pfSimilarity[i]);
嗯 最基本的给忘了。那为什么我用[3][4]调试程序的时候没有报错呢? 现在是打印的0.0000 我感觉是不是我参数有问题
  
            nRlt= FP_FeatureMatch(&pFeatureData[3][0],&pFeatureData[3][1],&pfSimilarity[0]);
	    nRlt= FP_FeatureMatch(&pFeatureData[3][0],&pFeatureData[3][2],&pfSimilarity[1]);
	    nRlt= FP_FeatureMatch(&pFeatureData[3][1],&pFeatureData[3][2],&pfSimilarity[2]);
还是我&pfSimilarity[0]直接指向了float pfSimilarity[3]={0.0};这个,所以导致没有值呢
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
pfSimilarity[i]是float类型,你要用%f输出: TRACE("%d [%f]\n",i,pfSimilarity[i]);
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
pFeatureData[3][4];是肯定不行的。因为前面定义 static unsigned char pFeatureData[3][512]; 你只能使用 static unsigned char pFeatureData[0..2][0..511]; 否则就是越界。
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
int regRes = (int)(pFeatureData[2][4]);
好像这样
int regRes = pFeatureData[3][4];
也能编译成功。不知道对不对
  • 打赏
  • 举报
回复
函数原型: int __stdcall FP_FeatureMatch(unsigned char * pFeatureData1,unsigned char * pFeatureData2,float * pfSimilarity)。 参数: unsigned char * pFeatureData1 图像特征数据指针1。输入参数。 unsigned char * pFeatureData2 图像特征数据指针2。输入参数。 float * pfSimilarity 相似度,取值范围为0.00 ~ 1.00,值0.00表示不匹配,值1.00 表示完全匹配。输出参数。 返回值: 调用成功,返回1; 否则返回错误代码,错误代码值应符合B.4的要求。 说明: 对两个图像特征数据进行比对,得到相似度值。 这个函数就是要调用上面已经保存好的pFeatureData。

	 for (int i=0;i<3;i++){
		 TRACE("%d [%s]\n",i,pFeatureData[i]);
	     static float pfSimilarity[3]={0.0};
	     nRlt= FP_FeatureMatch(pFeatureData[0],pFeatureData[1],&pfSimilarity[0]);
	     nRlt= FP_FeatureMatch(pFeatureData[0],pFeatureData[2],&pfSimilarity[1]);
	     nRlt= FP_FeatureMatch(pFeatureData[1],pFeatureData[2],&pfSimilarity[2]);
	     TRACE("%d [%s]\n",i,pfSimilarity[i]);
}
为什么打印的pfSimilarity为null; 0 [CW] 0 [(null)] 1 [CS] 1 [(null)] 2 [CS] 2 [(null)] 我感觉是不是nRlt= FP_FeatureMatch(pFeatureData[0],pFeatureData[2],&pfSimilarity[1])这里参数传错了
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
int regRes = (int)(pFeatureData[2][4]);
  • 打赏
  • 举报
回复

应该是这样吧 为什么只有两个字符
  • 打赏
  • 举报
回复
还有 ,如果改为上面代码。会报错:unsigned char *的类型的值不能用于初始化int类型的实体
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
static unsigned char pFeatureData[3][512];
do {
    capEnd = GetTickCount() - capStart;
    for(int i=0;i<3;i++) {
        //采集RAW图像
        nRlt = LIVESCAN_GetFPRawData(0, imageRAW);
        fingercount++;
        //获取图像的质量
        unsigned char pnScore[1];
        nRlt = FP_GetQualityScore(imageRAW, pnScore);

        int QualityScore = pnScore[0];
        if(QualityScore<=50) {
            continue;
        }
        str.Format(L"%d",QualityScore);
        if(i==0) {
            text1=str;

        } else if(i==1) {
            text2=str;

        } else {
            text3=str;
        }
        //采集一帧Bmp图像
        nRlt = LIVESCAN_GetFPBmpData(0, imageBMP);

        HBITMAP hbitmap = BufferToHBITMAP(GetDC()->m_hDC,imageBMP);
        DisBMPByHBitmap(GetDlgItem(IDC_BMPF1+i)->m_hWnd,hbitmap,1);
        DeleteObject(hbitmap);



        nRlt = FP_FeatureExtract(17, 11, imageRAW, pFeatureData[i]);

        /*strcpy(p,pFeatureData[i])*/

        if(i==2) {
            m_text = "产生注册结果...";
            UpdateData(false);
        } else {
            m_text = "请再次按压手指...";
            UpdateData(false);
        }
        Sleep(1000);
    }

    //注册结果
    for (int i=0;i<3;i++) TRACE("%d [%s]]n",i,pFeatureData[i]);
    int regRes = pFeatureData[2];
    break;
} while ((capEnd <= sTimeOut * 1000));

注意看TRACE在IDE中输出窗口中都输出了什么。
我能重新定义一个变量吗 这样总是感觉有点怪。
int regRes = pFeatureData[4];
这个4是判断是否注册成功的,就是说如果字节为1那么成功,2代表失败,3代表未注册。
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
将s[]的声明语句挪到循环外面(前面)
  • 打赏
  • 举报
回复

s[0]=QualityScore[0];
s[1]=QualityScore[1];
s[2]=QualityScore[2];
TRACE("%d %d %d\n",s[0],s[1],s[2]);
for循环3次打印的值是、 84 0 0 0 76 0 0 0 80 为啥前面的值都给覆盖了。我想打印 84 0 0 84 76 0 84 76 80 就是不被覆盖。求解啊
  • 打赏
  • 举报
回复
引用 20 楼 zhao4zhong1 的回复:
过早的优化是万恶之源。 听我这个过来人劝,别“优化”。 请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George 前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题: ◆“要保证这个问题不会再出现,我该怎么做?” ◆“要想少出些Bug,我该怎么做?” ◆“要保证Bug容易被修复,我该怎么做?” ◆“要保持对变化的快速响应,我该怎么做?” ◆“要保证我的软件的运行速度,我该怎么做?” 如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。
受教了
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
过早的优化是万恶之源。 听我这个过来人劝,别“优化”。 请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George 前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题: ◆“要保证这个问题不会再出现,我该怎么做?” ◆“要想少出些Bug,我该怎么做?” ◆“要保证Bug容易被修复,我该怎么做?” ◆“要保持对变化的快速响应,我该怎么做?” ◆“要保证我的软件的运行速度,我该怎么做?” 如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。
  • 打赏
  • 举报
回复
	for(int i=0;i<3;i++){
		 TRACE("%d [%s]\n",i,pFeatureData[i]);
	     float pfSimilarity[3]={0.0};
	     nRlt= FP_FeatureMatch(pFeatureData[0],pFeatureData[1],&pfSimilarity[0]);
	     nRlt= FP_FeatureMatch(pFeatureData[0],pFeatureData[2],&pfSimilarity[1]);
	     nRlt= FP_FeatureMatch(pFeatureData[1],pFeatureData[2],&pfSimilarity[2]);
	     TRACE("%d [%f]\n",i,pfSimilarity[i]);
		float avgf= (pfSimilarity[0]+pfSimilarity[1]+pfSimilarity[2])/3;
		if(avgf>0.8){
			int s0=QualityScore[0];
			int s1=QualityScore[1];
			int s2=QualityScore[2];
			if(s0<s1&&s1<s2||s1<s0&&s0<s2){
		         fp.Open(L"Finger.tlp",CFile::modeWrite|CFile::modeCreate,NULL);
	             fp.Write(Templatebuf,512);
	             fp.Close(); 
			}else if(s0<s2&&s2<s1||s2<s0&&s0<s1){
				 fp.Open(L"Finger.tlp",CFile::modeWrite|CFile::modeCreate,NULL);
	             fp.Write(Templatebuf,512);
	             fp.Close(); 
			}else{
				 fp.Open(L"Finger.tlp",CFile::modeWrite|CFile::modeCreate,NULL);
	             fp.Write(Templatebuf,512);
	             fp.Close(); 

			}

		}
		}
我的天 我感觉我这代码太繁琐 能不能优化一下啊
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
前提是FP_FeatureExtract负责给pFeatureData分配了内存;但这个我猜不可能。
unsigned char * pFeatureData 图像特征数据指针,存储生成的指纹特征数据,由调 用者分配内存空间 这个是原函数声明。现在问题都解决的差不多了。 目前问题是 我
 
//获取图像的质量
        unsigned char pnScore[1];
        nRlt = FP_GetQualityScore(imageRAW, pnScore);
 
        int QualityScore = pnScore[0];
这段也得需要保存 ,那么用上面的应该也能行吧
加载更多回复(3)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧