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

时间:2012-02-10 06:21:48

标签: c++

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

    #define ROWS 10

    SQLINTEGER 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("query producing a result-set")

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

的签名

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

3 个答案:

答案 0 :(得分:1)

std::vector上使用fdata

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);可能会有效。

答案 1 :(得分:0)

使用指针。

如你所说,从命令行接受ROWS参数。使用malloc / new分配你声明的所有变量,如idata,cdata1等,使用动态内存分配来分配所需大小的内存(你获得的ROWS参数)。就是这样!

答案 2 :(得分:0)

我还没有设法使用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 "\0"

    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;

}