断言失败与remquo功能

时间:2014-11-16 12:46:22

标签: qt assertion

我正在处理的代码片段旨在创建一个包含104列和行的电子表格。您可以猜测列标题会增加字母表。在Z字母之后,你有AA到AZ等等。

现在我测试的事实是,在Z之后,代码从A到Z循环,直到填充104列标题。

以下是代码:

#include "spreadhall.h"
#include <cmath>

SpreadWnd::SpreadWnd()
{
    formulaInput = new QLineEdit;

    table = new QTableWidget;
    table->setRowCount(104); // int row = table->rowCount();
    table->setColumnCount(104); int col = table->columnCount();
    table->setSizeAdjustPolicy(QTableWidget::AdjustToContents);

    QString s[26] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
                     "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};

    QString str = "";
    for(int i = 0; i < col; i++)
    {
        //int r = (i + 1) % 26;
        if(i > 25)
        {
            int q;
            int r = remquo(i, 25, &q);
            if(r == 0) r = 25;
            str = s[r - 1];
        }
        else
            str = s[i];
        table->setHorizontalHeaderItem(i, new QTableWidgetItem(str));
    }

    vLay = new QVBoxLayout;
    vLay->addWidget(formulaInput);
    vLay->addWidget(table);

    this->setLayout(vLay);
}

For循环是编写标题的代码段。当我在 For循环的第一行使用注释中的代码时,一切正常,标题从A循环回Z.但是当我使用 remquo 函数时,我在运行时遇到断言失败。我不明白为什么。

有人知道出了什么问题吗?

N.B:

我没有使用余数函数,因为我需要商在Z之后设计AA等等。

我在Win8平台上的64位Acer笔记本电脑上使用Qt5.3和MSVC2013。

谢谢!

1 个答案:

答案 0 :(得分:2)

您遇到的问题是remquo()计算余数的方式的结果。如果您查看docs,您会看到:

  

除法运算的IEEE浮点余数x / y   通过这个函数计算的恰好是值x - n * y,其中   值n是最接近精确值x / y

的积分值

因此,对于某些值,商将向上四舍五入到下一个整数,从而得到余数的负值,即s数组的负索引。

考虑例如remquo(13, 25, x)。你明白了:

13 / 25 = 0.52

商数向上舍入为1,结果为:

13 - 1 * 25 = -12

您可以使用div代替remquo(),它会返回预期值:

div_t d = div(13, 25);
qDebug() << d.quot;    // x / y  --> 0
qDebug() << d.rem;     // x % y  --> 13