相同的程序适用于macos但在Windows上失败

时间:2014-09-03 00:48:46

标签: c++ qt-creator

好的,所以我正在研究qt上的接口,我使用qtcreator作为IDE。问题是该算法在mac上正常工作,但在Windows上,同一程序会出错。   error that I get

唯一的区别是编译器。我在windows上使用的编译器是visual c ++,而mac是clang(我认为)。 是否有可能相同的算法在Mac上工作但在Windows上不起作用?如果是这样,那会是什么问题?

编辑:我看到我被投票了。我不知道为什么。我已经知道错误意味着什么,矢量订阅超出范围。问题是我不想浪费时间试图找出错误的位置,因为它实际上在mac上工作正常。 pc也比mac好。

编辑2:确实看起来相同的代码在Windows上的工作方式与在mac上的工作方式不同。明天我将在mac上测试它以试图理解这一点,但改变的代码就是这个:

vector<double> create_timeVector(double simulationTime, double step) {
        vector<double> time;
        time.push_back(0);
        double i = 0;
        do {
            ++i;
            time.push_back(time[i-1] + step);
        } while (time[i] < simulationTime);
        return time;
    }

返回的向量大小在窗口上比在mac上大一个。问题是我没有对代码进行任何更改。

2 个答案:

答案 0 :(得分:1)

它工作方式不同的可能原因是你使用浮点计算来确定循环何时停止(或继续,取决于你如何看待它)。

time.push_back(time[i-1] + step);
        } while (time[i] < simulationTime);

您有step doublesimulationTime为双,vector<double>被称为time。这是在编译器,编译器优化等方面不一致地运行循环的方法。

浮点不准确。使循环一致的方法是在循环条件下不使用任何浮点计算。

换句话说,通过hook或crook,使用整数运算来计算所需的计算次数。如果你需要步骤100次,那么它是100,而不是从浮点运算算出的值:

例如:

for (float i = 0.01F; i <= 1.0F; i+=0.01F) 
{ 
  // use i in some sort of calculation
}

循环执行的次数可以是99次,也可以是100次。这取决于编译器和可能适用的任何浮点优化。解决这个问题:

for (int i = 1; i <= 100; ++i ) 
{ 
  float dI = static_cast<float>(i) / 100.0F;
  // use dI instead of i some sort of calculation
}

只要i在循环中没有改变,循环就可以保证总是进行100次迭代,无论硬件,编译器优化等等。

请参阅:Any risk of using float variables as loop counters and their fractional increment/decrement for non "==" conditions?

答案 1 :(得分:0)

vector subscript out of range表示您在向量上使用了[n]n小于0或大于或等于向量中的元素数。

这会导致未定义的行为,因此不同的编译器可能会以不同的方式做出反应。

要在这种情况下获得可靠的行为,一种方法是使用.at(n)而不是[],并确保捕获异常。另一种方法是在应用它们之前检查你的索引值,这样你就不会在第一时间访问越界。