如何重构C++代码以支持动态数组大小

How to refactor the C++ code to support the dynamic array size

本文关键字:支持 动态 数组 代码 C++ 何重构 重构      更新时间:2023-10-16

我需要去掉C++/ODBC应用程序中的固定数组大小。相反,我想将硬编码的数组大小(下面的ROWS=10)作为命令行参数传递给ROWS。我知道如何解析命令行。但是如何调整以下代码?

#定义ROWS 10SQLINTEGER idata[ROWS]SQLCHAR cdata1[ROWS][256]SQLFLOAT fdata[ROWS]SQL_TIMESTAMP_STRUCT ts[ROWS]SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE,ROWS)SQLBindCol(1,&idata)SQLBindCol(2,cdata1)SQLBindCol(3,fdata)SQLBindCol(4,&ts)SQLExecDirect("生成结果集的查询")

更新:我无法修改SQLBindCol(..)的签名

假设我将创建std::vector而不是SQLFLOAT fdata[ROWS],但如何将其传递到不期望std::vector的SQLBindCol()中?

fdata:上使用std::vector

size_t rowCount = /* ... */;
std::vector<SQLFLOAT> fdata(rowCount);
// ...
SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE, rowCount);
// ...
SQLBindCol(3, &fdata[0]);
// ...

对于cdata1std::vector<SQLCHAR> cdata1(250 * rowCount);可能起作用。

使用指针。

正如你所说,接受来自命令行的ROWS论点。通过使用malloc/new为您声明的所有变量(如idata、cdata1等)分配动态内存分配,来分配所需大小的内存(您得到的ROWS参数)。就这样!

我还没能让它与2d动态数组一起工作。但这里有一个使用1d阵列的动态2d阵列的解决方案

std::set<std::string> getResults(int columnIndex, HSTMT stmt) {
    std::set<std::string> results;
    RETCODE rc = 0;
    int rows = 250;
    int colsize = 500 + 1; //Need to increment colunm size by 1 because SQLBindCol add the terminator character ""
    SQLLEN *indicator1 = new SQLLEN[rows];
    char *buff = new char[rows*colsize];
    SQLSetStmtAttr(stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)rows, 0);
    SQLUINTEGER     NumRowsFetched;
    SQLSetStmtAttr(stmt, SQL_ATTR_ROWS_FETCHED_PTR, &NumRowsFetched, 0);
    SQLBindCol(stmt, columnIndex, SQL_C_CHAR, buff, colsize, indicator1);
    while (rc = SQLFetch(stmt) == SQL_SUCCESS) {
        for (int i = 0; (SQLUINTEGER)i < NumRowsFetched; i++) {
            results.insert(&buff[i * colsize]);
        }
    }
    delete[] buff;
    return results;
}