同样的代码为什么C和C++得出不同的结果呢。有关问题较复杂,小弟我举例进行了说明
同样的代码为什么C和C++得出不同的结果呢。问题较复杂,我举例进行了说明。
....
unsigned char p1[TEMPLATE_LENGTH];
unsigned char p2[TEMPLATE_LENGTH];
....
//_ThridTestone第三方提供的libLGM.so里的对外接口
//该函数对p1进行了业务操作然后回传给P1
int nSample = _ThridTestone(p, p1);
.....
//_ThridTesttwo第三方提供的SO里的对外接口
//P1就是之前经过 ThridTestone处理过的p1
float result = _ThridTesttwo(p1, p2);
---------------------------------------------------------
我遇到的问题是:
如果我用 C++ 编写以上代码 result=0.85678
如果我用 C 编写以上代码 result=1
------------------------------------------------------
ThridTestone 和 ThridTesttwo是第三方SO提供的,我没办法进去调试,所以我进行了下面的实验
我以为是在C和C++中p1,p2结果不一样造成的,但是通过以下代码我打印,结果发现无论C还是C++
打印出来的结果都是一样的
/*
int i=0;
printf("\n-------------------------\n");
for(i=0;i<TEMPLATE_LENGTH;i++){
printf("%d",p1[i]);
}
printf("\n-------------------------\n");
i=0;
for(i=0;i<TEMPLATE_LENGTH;i++){
printf("%d",p2[i]);
}
printf("\n-------------------------\n");
*/
------解决方案--------------------
------解决方案--------------------
可能调用习惯不一样(调试一下汇编),另外 C++中有函数重载,会对函数名字编码,确保你调用了正确的函数。
------解决方案--------------------
调试一下汇编
另外看一下_ThridTestone 这两个函数的地址。加了划算线__有点像C++链接符号。
_ThridTestone ,two这两个函数的原型是啥,入参要保证正确。
------解决方案--------------------
外部函数声明时前面加上 extern "C"
------解决方案--------------------
C在编译时,直接保存了函数名。但是c++编译时的函数名包括signature信息,目的是为了重载
------解决方案--------------------
%hhu--->unsigned char
------解决方案--------------------
这样看的话,有没有可能是第三方库的问题的呢?
------解决方案--------------------
估计还是哪里写的有错误,要不不应该。
------解决方案--------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行! 写日志到文件参考下面:
....
unsigned char p1[TEMPLATE_LENGTH];
unsigned char p2[TEMPLATE_LENGTH];
....
//_ThridTestone第三方提供的libLGM.so里的对外接口
//该函数对p1进行了业务操作然后回传给P1
int nSample = _ThridTestone(p, p1);
.....
//_ThridTesttwo第三方提供的SO里的对外接口
//P1就是之前经过 ThridTestone处理过的p1
float result = _ThridTesttwo(p1, p2);
---------------------------------------------------------
我遇到的问题是:
如果我用 C++ 编写以上代码 result=0.85678
如果我用 C 编写以上代码 result=1
------------------------------------------------------
ThridTestone 和 ThridTesttwo是第三方SO提供的,我没办法进去调试,所以我进行了下面的实验
我以为是在C和C++中p1,p2结果不一样造成的,但是通过以下代码我打印,结果发现无论C还是C++
打印出来的结果都是一样的
/*
int i=0;
printf("\n-------------------------\n");
for(i=0;i<TEMPLATE_LENGTH;i++){
printf("%d",p1[i]);
}
printf("\n-------------------------\n");
i=0;
for(i=0;i<TEMPLATE_LENGTH;i++){
printf("%d",p2[i]);
}
printf("\n-------------------------\n");
*/
------解决方案--------------------
//printf("%d",p1[i]);
printf("%hhu",p1[i]);
....
printf("%hhu",p2[i]);
------解决方案--------------------
可能调用习惯不一样(调试一下汇编),另外 C++中有函数重载,会对函数名字编码,确保你调用了正确的函数。
------解决方案--------------------
调试一下汇编
另外看一下_ThridTestone 这两个函数的地址。加了划算线__有点像C++链接符号。
_ThridTestone ,two这两个函数的原型是啥,入参要保证正确。
------解决方案--------------------
外部函数声明时前面加上 extern "C"
------解决方案--------------------
C在编译时,直接保存了函数名。但是c++编译时的函数名包括signature信息,目的是为了重载
------解决方案--------------------
%hhu--->unsigned char
------解决方案--------------------
这样看的话,有没有可能是第三方库的问题的呢?
------解决方案--------------------
估计还是哪里写的有错误,要不不应该。
------解决方案--------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。
有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行! 写日志到文件参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#include <io.h>
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define _vsnprintf vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;
if (NULL==pszFmt
------解决方案--------------------
0==pszFmt[0]) return;
_vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);