r2100

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  8 Posts :: 9 Stories :: 2 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

2015年12月21日 #

ld在链接的时候找不到所需的动态库
1、安装所需的动态库
2、修改链接查找路径配置文件 二选一
   a)、在有root权限情况下:
      echo "usr/local/lib >> /etc/ld.so.conf"
   b)、在没有root权限的情况下:
      $ echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" >> ~/.bashrc


ps:查找库的方法
$ locate libiconv.so.2
$ whereis libiconv.so.2
$ find /usr /lib -name libiconv.so.2
$ find / -name libiconv.so.2 2>/dev/null





posted @ 2015-12-21 11:53 r2100 阅读(38) | 评论 (0)编辑 收藏

2015年12月20日 #

cat -A 能看到符号
Windows: ^M$     CR LF
Linux:   $          LF

对于文本问题,可以使用 UNIX2dox、dos2UNIX 转换
posted @ 2015-12-20 23:02 r2100 阅读(45) | 评论 (0)编辑 收藏

2011年4月6日 #

 

// 把一个wstring转化为string
std::string& to_string(std::string& dest, std::wstring const & src)
{
   std::setlocale(LC_CTYPE, 
"");

   size_t 
const mbs_len = wcstombs(NULL, src.c_str(), 0);
   std::vector
<char> tmp(mbs_len + 1);
   wcstombs(
&tmp[0], src.c_str(), tmp.size());

   dest.assign(tmp.begin(), tmp.end() 
- 1);

   
return dest;
}

// 把一个string转化为wstring
std::wstring& to_wstring(std::wstring& dest, std::string const & src)
{
   std::setlocale(LC_CTYPE, 
"");

   size_t 
const wcs_len = mbstowcs(NULL, src.c_str(), 0);
   std::vector
<wchar_t> tmp(wcs_len + 1);
   mbstowcs(
&tmp[0], src.c_str(), src.size());

   dest.assign(tmp.begin(), tmp.end() 
- 1);

   
return dest;

posted @ 2011-04-06 17:58 r2100 阅读(1752) | 评论 (0)编辑 收藏


对于C++类:显示地写出拷贝构造函数,重载赋值操作符和析构函数是良好的习惯,但在写构造函数时需要注意一些容易的错误,如下面的代码:

 

#include <iostream>

using namespace std;

 

class M{

public:

    M()
{}

    M(
const M &m){

       cout
<<"copy construtor"<<endl;

       
operator =(m);

    }


    M 
operator =(const M &m){   //问题出在此处

       cout
<<"operator ="<<endl;

       
return *this;

    }


}
;

 

int main() {

    M m1;

    M m2;

    m2
=m1;

    
return 0;

}

 

在下面三种情况下会调用拷贝构造函数:

(1)用一个已经实例化了的该类对象,去实例化该类的另外一个对象;

(2)用该类的对象传值的方式作为一个函数的参数;

(3)一个函数返回值为该类的一个对象。

特别地,对于语句 M m;  M mm=m; 属于(1)情况,即语句M mm=m;调用的是拷贝构造函数,而不是构造函数。

 

但在重载=操作符时,返回值不是引用类型将导致程序运行出现严重问题。即如果出现上面会调用拷贝构造函数的三种情况之一,或者使用=操作符时,拷贝构造函数和operator =将循环递归调用,导致程序出现死循环。原因是拷贝构造函数和operator =之间不断地重复调用。

解决办法:将operator =的返回类型改为引用类型M&,此时调用operator =时不会去调用拷贝构造函数。

 

还有,若要写clone时,若通过下面的方式:

 

    M clone(){

       cout
<<"clone"<<endl;

       
return *this;

    }


前提是拷贝构造函数不能调用clone来完成拷贝,否则出现上面同样的问题,下面的代码就会出现这样的问题

   

M(const M &m){

       cout
<<"copy construtor"<<endl;

       clone();

    }


总之,在写这些函数时,要特别留意彼此的调用关系。

以下是我的惯用写法:

(A)对于拷贝构造函数和重载=操作符

  

  M(const M &m){

       cout
<<"copy construtor"<<endl;

       
operator =(m);

    }


    M
& operator =(const M &m){  //问题出在此处

       cout
<<"operator ="<<endl;

       
/* 此处写上成员数据的拷贝 */

       
return *this;

    }


这里写成了inline函数,只是方便说明问题,其实不必非要这么写,可以采取先声明,后定义的常规方法。

(B)对于clone函数

声明:  virtual M clone();   //考虑继承时的多态

定义:  

M M::clone(){

       cout
<<"clone"<<endl;

       
//将在调用处直接调用构造函数,效率高,避免返回局部变量,更安全

       
return M();

    }



 

posted @ 2011-04-06 13:18 r2100 阅读(497) | 评论 (0)编辑 收藏

2008年9月12日 #


老板要求重用SQLHSTMT句柄,找到一些资料
1、使用SQLExecDirect执行了查询语句,记录集会存放在hstmt中,
2、通过SQLBindCol把记录集和变量绑定。
3、SQLFreeStmt(hstmt, SQL_UNBIND);释放由先前对此语句句柄进行的 SQLBindCol() 调用绑定的所有列(应用程序变量或文件引用与结果集列之间的关联将断开)。
4、SQLCloseCursor(hstmt);将关闭任何与语句句柄相关联的游标并废弃任何暂挂结果

如果不需要使用返回的结果集
1、使用SQLExecDirect执行了查询语句,记录集会存放在hstmt中,
2、SQLCloseCursor(hstmt)或者SQLFreeStmt(hstmt,SQL_CLOSE )将关闭任何与语句句柄相关联的游标并废弃任何暂挂结果





posted @ 2008-09-12 16:04 r2100 阅读(117) | 评论 (0)编辑 收藏

2008年9月11日 #

SQLExecDirect函数源代码
static SQLRETURN
ODBCExecDirect(ODBCStmt 
*stmt, SQLCHAR *szSqlStr, SQLINTEGER nSqlStr)
{
    
char *query;
    MapiMsg ret;
    MapiHdl hdl;

    hdl 
= stmt->hdl;

    
if (stmt->State >= EXECUTED1 || (stmt->State == EXECUTED0 && mapi_more_results(hdl))) {
        
/* Invalid cursor state */
        addStmtError(stmt, 
"24000", NULL, 0);
        
return SQL_ERROR;
    }

    
/* TODO: convert ODBC escape sequences ( {d 'value'} or {t 'value'} or
       {ts 'value'} or {escape 'e-char'} or {oj outer-join} or
       {fn scalar-function} etc. ) to MonetDB SQL syntax 
*/
    query 
= ODBCTranslateSQL(szSqlStr, (size_t) nSqlStr, stmt->noScan);

    ODBCResetStmt(stmt);

#ifdef ODBCDEBUG
    ODBCLOG(
"SQLExecDirect: \"%s\"\n", query);
#endif

    ret 
= mapi_query_handle(hdl, query);
    free(query);
    
switch (ret) {
    
case MOK:
        
break;
    
case MTIMEOUT:
        
/* Communication link failure */
        addStmtError(stmt, 
"08S01", mapi_error_str(stmt->Dbc->mid), 0);
        
return SQL_ERROR;
    
default:
        
/* General error */
        addStmtError(stmt, 
"HY000", mapi_error_str(stmt->Dbc->mid), 0);
        
return SQL_ERROR;
    }

    
/* now get the result data and store it to our internal data structure */

    
return ODBCInitResult(stmt);
}

As mentioned earlier, it is more efficient to reuse statements than to drop them and allocate new ones. Before executing a new SQL statement on a statement, applications should be sure that the current statement settings are appropriate. These include statement attributes, parameter bindings, and result set bindings. Generally, parameters and result sets for the old SQL statement need to be unbound (by calling SQLFreeStmt with the SQL_RESET_PARAMS and SQL_UNBIND options) and rebound for the new SQL statement.

When the application has finished using the statement, it calls SQLFreeHandle to free the statement. After freeing the statement, it is an application programming error to use the statement's handle in a call to an ODBC function; doing so has undefined but probably fatal consequences.

When SQLFreeHandle is called, the driver releases the structure used to store information about the statement.

SQLDisconnect automatically frees all statements on a connection.


         
/**********************************************
 * ODBCStmt.c
 *
 * Description:
 * This file contains the functions which operate on
 * ODBC statement structures/objects (see ODBCStmt.h).
 *
 * Author: Martin van Dinther
 * Date  : 30 aug 2002
 *
 *********************************************
*/

#include 
"ODBCGlobal.h"
#include 
"ODBCStmt.h"

#define ODBC_STMT_MAGIC_NR  5461    /* for internal sanity check only */


/*
 * Creates a new allocated ODBCStmt object and initializes it.
 *
 * Precondition: none
 * Postcondition: returns a new ODBCStmt object
 
*/
ODBCStmt 
*
newODBCStmt(ODBCDbc 
*dbc)
{
    ODBCStmt 
*stmt = (ODBCStmt *) malloc(sizeof(ODBCStmt));
    assert(stmt);

    assert(dbc);
    assert(dbc
->mid);

    
if (stmt == NULL) {
        
/* Memory allocation error */
        addDbcError(dbc, 
"HY001", NULL, 0);
        
return NULL;
    }

    stmt
->Dbc = dbc;
    stmt
->Error = NULL;
    stmt
->RetrievedErrors = 0;

    stmt
->State = INITED;
    stmt
->hdl = mapi_new_handle(dbc->mid);
    
if (stmt->hdl == NULL) {
        
/* Memory allocation error */
        addDbcError(dbc, 
"HY001", NULL, 0);
        free(stmt);
        
return NULL;
    }
    assert(stmt
->hdl);

    stmt
->currentRow = 0;
    stmt
->startRow = 0;
    stmt
->rowSetSize = 0;
    stmt
->queryid = -1;
    stmt
->nparams = 0;
    stmt
->querytype = -1;
    stmt
->rowcount = 0;

    
/* add this stmt to the administrative linked stmt list */
    stmt
->next = dbc->FirstStmt;
    dbc
->FirstStmt = stmt;

    stmt
->cursorType = SQL_CURSOR_FORWARD_ONLY;
    stmt
->cursorScrollable = SQL_NONSCROLLABLE;
    stmt
->retrieveData = SQL_RD_ON;
    stmt
->noScan = SQL_NOSCAN_OFF;

    stmt
->ApplRowDescr = newODBCDesc(dbc);
    stmt
->ApplParamDescr = newODBCDesc(dbc);
    stmt
->ImplRowDescr = newODBCDesc(dbc);
    stmt
->ImplParamDescr = newODBCDesc(dbc);
    stmt
->AutoApplRowDescr = stmt->ApplRowDescr;
    stmt
->AutoApplParamDescr = stmt->ApplParamDescr;

    
if (stmt->ApplRowDescr == NULL || stmt->ApplParamDescr == NULL || stmt->ImplRowDescr == NULL || stmt->ImplParamDescr == NULL) {
        destroyODBCStmt(stmt);
        
return NULL;
    }

    stmt
->ApplRowDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ApplParamDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ImplRowDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ImplParamDescr->sql_desc_alloc_type = SQL_DESC_ALLOC_AUTO;
    stmt
->ImplRowDescr->Stmt = stmt;
    stmt
->ImplParamDescr->Stmt = stmt;

    stmt
->Type = ODBC_STMT_MAGIC_NR;    /* set it valid */

    
return stmt;
}

SQLFreeHandle
ODBCFreeStmt_(ODBCStmt 
*stmt)
{
    
/* check if statement is not active */
    
if (stmt->State >= EXECUTED0) {
        
/* should be closed first */
        
if (SQLFreeStmt_(stmt, SQL_CLOSE) == SQL_ERROR)
            
return SQL_ERROR;
    }

    
/* Ready to destroy the stmt handle */
    destroyODBCStmt(stmt);
    
return SQL_SUCCESS;
}


SQLFreeStmt

SQLFreeStmt_(ODBCStmt 
*stmt, SQLUSMALLINT option)
{
    
switch (option) {
    
case SQL_CLOSE:
        
/* Note: this option is also called from SQLCancel() and
           SQLCloseCursor(), so be careful when changing the code 
*/
        
/* close cursor, discard result set, set to prepared */
        setODBCDescRecCount(stmt
->ImplRowDescr, 0);
        stmt
->currentRow = 0;
        stmt
->startRow = 0;
        stmt
->rowSetSize = 0;

        
if (stmt->State == EXECUTED0)
            stmt
->State = stmt->queryid >= 0 ? PREPARED0 : INITED;
        
else if (stmt->State >= EXECUTED1)
            stmt
->State = stmt->queryid >= 0 ? PREPARED1 : INITED;

        
/* Important: do not destroy the bind parameters and columns! */
        
return SQL_SUCCESS;
    
case SQL_DROP:
        
return ODBCFreeStmt_(stmt);
    
case SQL_UNBIND:
        setODBCDescRecCount(stmt
->ApplRowDescr, 0);
        
return SQL_SUCCESS;
    
case SQL_RESET_PARAMS:
        setODBCDescRecCount(stmt
->ApplParamDescr, 0);
        setODBCDescRecCount(stmt
->ImplParamDescr, 0);
        mapi_clear_params(stmt
->hdl);
        
return SQL_SUCCESS;
    
default:
        
/* Invalid attribute/option identifier */
        addStmtError(stmt, 
"HY092", NULL, 0);
        
return SQL_ERROR;
    }

    
/* not reached */
}

SQLHSTMT的结构
typedef 
struct tODBCDRIVERSTMT {
    
/* Stmt properties */
    
int Type;        /* structure type, used for handle validy test */
    ODBCError 
*Error;    /* pointer to an Error object or NULL */
    
int RetrievedErrors;    /* # of errors already retrieved by SQLError */
    ODBCDbc 
*Dbc;        /* Connection context */
    
struct tODBCDRIVERSTMT *next;    /* the linked list of stmt's in this Dbc */
    
enum StatementState State;    /* needed to detect invalid cursor state */
    MapiHdl hdl;

    unsigned 
int rowcount;    /* # affected rows */

    
/* startRow is the row number of first row in the result
       set (0 based); rowSetSize is the number of rows in the
       current result set; currentRow is the row number of the
       current row within the current result set 
*/
    unsigned 
int currentRow;
    unsigned 
int startRow;
    unsigned 
int rowSetSize;

    unsigned 
int currentCol; /* used by SQLGetData() */
    SQLINTEGER retrieved;    
/* amount of data retrieved */
    
int queryid;        /* the query to be executed */
    
int nparams;        /* the number of parameters expected */

    
int querytype;        /* query type as returned by server */

    SQLUINTEGER cursorType;
    SQLUINTEGER cursorScrollable;
    SQLUINTEGER retrieveData;
    SQLUINTEGER noScan;

    ODBCDesc 
*ApplRowDescr;    /* Application Row Descriptor (ARD) */
    ODBCDesc 
*ApplParamDescr; /* Application Parameter Descriptor (APD) */
    ODBCDesc 
*ImplRowDescr;    /* Implementation Row Descriptor (IRD) */
    ODBCDesc 
*ImplParamDescr; /* Implementation Parameter Descriptor (IPD) */

    ODBCDesc 
*AutoApplRowDescr; /* Auto-allocated ARD */
    ODBCDesc 
*AutoApplParamDescr; /* Auto-allocated APD */

    
/* Stmt children: none yet */
} ODBCStmt;






posted @ 2008-09-11 11:31 r2100 阅读(953) | 评论 (2)编辑 收藏

2008年2月26日 #

Dom Programming Guid: (Apache)http://www.slac.stanford.edu/exp/glast/ground/software/extDoc/xerces/2_6_0/doc/program-dom.html#validation-dynamic

Java与XML联合编程之DOM篇:http://kimmyzhang.zhmy.com/archives/2006/9579.shtml

DOM初步及jdom的介绍http://www.xml.org.cn/dispbbs.asp?boardID=11&ID=37000

DOM的一些介绍http://blog.sina.com.cn/u/57db2a730100037i

用Xerces操作XML文档:http://blog.sina.com.cn/u/57db2a73010002p5

使用 Xerces-C++ 缓存和序列化 XML 模式:http://www-128.ibm.com/developerworks/cn/xml/x-xsdxerc.html

充分利用 Xerces-C++,第 1 部分:http://www-128.ibm.com/developerworks/cn/xml/x-xercc/

充分利用 Xerces-C++,第 1 部分http://www-128.ibm.com/developerworks/cn/xml/x-xercc2/


技巧: 如何利用Xerces C++正确处理XML文档中的WhiteSpaceL:http://www-128.ibm.com/developerworks/cn/xml/tips/x-xercesc2/

浅谈利用Xerces C++解析XML文档
http://hi.baidu.com/fx0517/blog/item/258f12d53c32c6c451da4bb3.html


apache xerces c++ windows 下编译与vc6实例 

http://blog.csdn.net/smq65/archive/2006/09/04/1174368.aspx

posted @ 2008-02-26 21:12 r2100 阅读(204) | 评论 (0)编辑 收藏

2008年1月31日 #

低级错误:在头文件中定义全局变量
posted @ 2008-01-31 09:52 r2100| 编辑 收藏