【问题标题】:stackoverflow Exception in C++ incrementing counter in while loopC++中的stackoverflow异常在while循环中递增计数器
【发布时间】:2018-03-17 18:53:12
【问题描述】:

我一直在寻找有关这方面问题的见解,但找不到;这可能是我忽略的一些愚蠢的事情。希望你能看到!

我在 C++ pgm 中有一个 while 循环,我使用 ODBC 将 SQL Server 数据加载到 3 个不同的数组中(每列 1 个)。如果我在 while 循环之外增加数组计数器(在代码上方,已注释掉),当然它不会推进数组条目,但它不会爆炸。如果我将增量​​ (rowNum++) 移动到 while 循环中(如图所示),我会得到一个 stackoverflow 异常。任何人都可以给我一个提示吗?非常感谢!

    else {
        short iptMKTNUM;
        short iptDAYNUM;
        float iptPX;
        int rowNum = 0;
        //rowNum++;
        while (SQLFetch(SQLStatementHandle) == SQL_SUCCESS) {
            SQLGetData(SQLStatementHandle, 1, SQL_C_DEFAULT, &iptMKTNUM, sizeof(iptMKTNUM), NULL);
            SQLGetData(SQLStatementHandle, 2, SQL_C_DEFAULT, &iptDAYNUM, sizeof(iptDAYNUM), NULL);
            SQLGetData(SQLStatementHandle, 3, SQL_C_FLOAT,   &iptPX,     sizeof(iptPX),     NULL);
            MktNum[rowNum] = iptMKTNUM;
            DayNum[rowNum] = iptDAYNUM;
            Price[rowNum] = iptPX;
            cout << "Mkt/Day/Px IS " << iptMKTNUM << " " << iptDAYNUM << " " << iptPX << endl;
            cout << "Mkt/Day/Px IS " << MktNum[rowNum] << " " << DayNum[rowNum] << " " << Price[rowNum] << endl;
            cout << "rowNum is " << rowNum << endl;
            rowNum++;
        }
    }

【问题讨论】:

标签: c++ sql-server exception odbc


【解决方案1】:

你是如何分配数组MktNumDayNumPrice的?您保留了这一重要部分,因为不允许您访问超出其范围的数组。

您可能应该使用vectors 而不是数组,然后使用push_back 附加值。从向量的大小可以得到的行数。

 vector<short> MktNum;
 vector<short> DayNum;
 vector<float> Price;
 while (SQLFetch(SQLStatementHandle) == SQL_SUCCESS) {
        SQLGetData(SQLStatementHandle, 1, SQL_C_DEFAULT, &iptMKTNUM, sizeof(iptMKTNUM), NULL);
        SQLGetData(SQLStatementHandle, 2, SQL_C_DEFAULT, &iptDAYNUM, sizeof(iptDAYNUM), NULL);
        SQLGetData(SQLStatementHandle, 3, SQL_C_FLOAT,   &iptPX,     sizeof(iptPX),     NULL);
        MktNum.push_back(iptMKTNUM);
        DayNum.push_back(iptDAYNUM);
        Price.push_back(iptPX);
        cout << "Mkt/Day/Px IS " << iptMKTNUM << " " << iptDAYNUM << " " << iptPX << endl;
        cout << "Mkt/Day/Px IS " << MktNum.back() << " " << DayNum.back() << " " << Price.back() << endl;
        cout << "rowNum is " << (-1 + MktNum.size()) << endl;
    }

【讨论】:

  • 我终于通过了。问题是我的数组大小。我把它们溢出来了。它们每个大约有 1050 万个条目。我发现一条消息说要么将数组定义为“在文件范围内”,要么只是以“静态”参数开头。我做了后者,它解决了它。负载很快,从 SQL Server 填充可能需要 10 秒。你认为我应该尝试矢量方法,还是继续前进?顺便感谢您的建议!
  • 取决于您的用例。 vectors 是首选方式。stackoverflow.com/questions/381621/… 当有解决方案时,您应该尽量避免使用 new 和 delete 自己处理内存..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
相关资源
最近更新 更多