如何重构C++代码以支持动态数组大小
How to refactor the C++ code to support the dynamic array size
我需要去掉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]);
// ...
对于cdata1
,std::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;
}
相关文章:
- 编译时未启用intel oneApi CUDA支持
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 内联映射初始化的动态atexit析构函数崩溃
- 为什么istream不支持右值提取
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在标准库中静态链接时,如何支持动态插件
- 为什么C++不支持基于范围的动态数组的 for 循环?
- 硬件支持的 Boost 库中动态位集的弹出计数
- 是 Oracle 正式支持的动态记录集
- 抢占模式下不支持 CUDA 动态并行调试.断点将被禁用
- GTX 550 Ti显卡支持动态并行编程
- 如何重构C++代码以支持动态数组大小
- QT是否支持运行时动态UI生成和HTML呈现
- 使用动态链接的zlib支持构建boost
- O'Reilly "Objective-C Pocket Reference"声称C++不支持动态调度,这是真的吗?