免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1793 | 回复: 2
打印 上一主题 下一主题

[C] C中数据类型转换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-05 20:29 |只看该作者 |倒序浏览
兄弟姐妹帮个忙,我遇到个问题,想请教大家,先谢谢啦.
下面的程序中我想要把一些不同类型数据连接在一起然后打印出来,但是输出的结果却和实际值有出入,比如int型51输出的结果却是3,应该是强制转换(char *)行不通(红色标出的那几段都是有问题的),不知道怎么解决或是有其它的方法呢?

const std::string& CDBOci:: Dump(int logMask, const char * inSqlStatement, const CDBBindVar * aBindVar)
{
    int    X;
    int    V;
    long    tmpNumber;
    char    numString[20];
    float  tmpFloat;
    std::string  logString;
    std::string  sSQLMsg;

    if (logMask & LOG_MASK_DUMP_ERROR_SQL) {
        SFW_TRACE(logMask, " <SQL Statement - ERROR>");
        //QS_TRACE(LOG_MASK_ERROR,"%d\t%s", SQL_INFO," <SQL Statement - ERROR> test");
    }
    else {
        SFW_TRACE(logMask, " <SQL Statement>");
    }
    SFW_TRACE(logMask, inSqlStatement);
    if (aBindVar != NULL) {
        for (X = 0; X < aBindVar->varNumber; X++) {
            if (aBindVar->varAttr[X].isArray == FALSE) { // Not bind array
                logString = "";
                logString = logString + "  " + aBindVar->varAttr[X].name + " := ";
                // Print out the vaiables by data type
                switch (aBindVar->varAttr[X].type) {
                    case SQLT_INT:  //int型
                        tmpNumber = *(int*)aBindVar->varAttr[X].placeHolder;
                        //itoa(tmpNumber, buffer, 10);
                        QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_INT ",(char*)logString.c_str(),tmpNumber);   
                        sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;   
                        logString += "%d;";
                        SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
                        break;
                    case SQLT_UIN:  // unsigned int 型  
                        tmpNumber = *(unsigned int*)aBindVar->varAttr[X].placeHolder;
                        QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_UIN ",(char*)logString.c_str(),tmpNumber);     //用vfprintf 打印
                        sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
                        logString += "%d;";                        
                        SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
                        break;
                    case SQLT_LNG:  //long 型
                        tmpNumber = *(long*)aBindVar->varAttr[X].placeHolder;
                        QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_LNG ",(char*)logString.c_str(),tmpNumber);  
                        sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;                    
                        logString += "%d;";                        
                        SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
                        break;
                    case SQLT_FLT: //float型
                        tmpFloat += *(float*)aBindVar->varAttr[X].placeHolder;
                        QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%f", SQL_INFO," SQLT_FLT ",(char*)logString.c_str(),tmpFloat);
                        sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;                  
                        logString += "%f;";
                        SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
                        break;
                    case SQLT_CHR:
                    case SQLT_STR: //string 型
                        QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%s", SQL_INFO," SQLT_STR ",(char*)logString.c_str(),(char*)aBindVar->varAttr[X].placeHolder);
                        sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
                        logString += "'%s';";
                        SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)aBindVar->varAttr[X].placeHolder);
                        break;
                }            }
            else {  // Bind array
                //aBindVar->varAttr[X].curTableSize);
                //SFW_TRACE(logMask, "Bind variable is array !!! Skip dump data.");

                for (V=0; V <aBindVar->varAttr[X].curTableSize; V++) {
                    logString = "";
                    sprintf(numString,"%d", V);
                    logString = logString + "  " + aBindVar->varAttr[X].name + " [" + numString + "] := ";
                    // Print out the vaiables by data type
                    switch (aBindVar->varAttr[X].type) {
                        case SQLT_INT:
                            tmpNumber = *(int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
                            QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);         
                            sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;                  
                            logString += "%d;";                           
                            SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
                            break;
                        case SQLT_UIN:
                            tmpNumber = *(unsigned int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
                            QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
                            sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;                          
                            logString += "%d;";                           
                            SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
                            break;
                        case SQLT_LNG:
                            tmpNumber = *(long*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
                            QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);  
                            sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;                        
                            logString += "%d;";                           
                            SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
                            break;
                        case SQLT_FLT:
                            tmpFloat += *(float*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
                            QS_TRACE(LOG_MASK_ERROR,"%d\t%s%f", SQL_INFO,(char*)logString.c_str(),tmpFloat);
                            sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
                            logString += "%f;";                     
                            SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
                            break;
                        case SQLT_CHR:
                        case SQLT_STR:
                            QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s", SQL_INFO,(char*)logString.c_str(),(char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
                            sSQLMsg = sSQLMsg + "  " + (char*)logString.c_str() + (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
                            logString += "'%s';";
                            SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
                            break;
                    }
                }
            }
        }
    }

   QS_TRACE(LOG_MASK_ERROR,"%d\t%s", SQL_INFO,(char*)sSQLMsg.c_str());  //用vfprintf 打印

    return sSQLMsg;
}


输出结果:

154641: 32781 <SQL Statement - ERROR> test
154641: 32781 SQLT_STR  : LotType := C
154641: 32781 SQLT_STR  : LotType := D
154641: 32781 SQLT_STR  : LotType := Y
154641: 32781 SQLT_STR  : LotType := Z
154641: 32781 SQLT_STR  : LotType := V
154641: 32781 SQLT_INT :Count := 51
154641: 32781     : LotType := C    : LotType := D    : LotType := Y    : LotType := Z    : LotType := V    :Count := 3
154641

[ 本帖最后由 qsschance 于 2008-9-8 19:48 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-05 20:31 |只看该作者
原帖由 qsschance 于 2008-9-5 20:29 发表
兄弟姐妹帮个忙,我遇到个问题,想请教大家,先谢谢啦.
下面的程序中我想要把一些不同类型数据连接在一起然后打印出来,但是输出的结果却和实际值有出入,比如int型51输出的结果却是3,应该是强制转换(char *)行不通 ...


1.禁用表情
2.使用代码模板重新编辑

论坛徽章:
0
3 [报告]
发表于 2008-09-15 15:38 |只看该作者

回复 #1 qsschance 的帖子

顶!顶!顶!顶!

[ 本帖最后由 qsschance 于 2008-9-17 19:50 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP