好的,所以我正在研究qt上的接口,我使用qtcreator作为IDE。问题是该算法在mac上正常工作,但在Windows上,同一程序会出错。
唯一的区别是编译器。我在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上大一个。问题是我没有对代码进行任何更改。
答案 0 :(得分:1)
它工作方式不同的可能原因是你使用浮点计算来确定循环何时停止(或继续,取决于你如何看待它)。
time.push_back(time[i-1] + step);
} while (time[i] < simulationTime);
您有step
double
,simulationTime
为双,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次迭代,无论硬件,编译器优化等等。
答案 1 :(得分:0)
vector subscript out of range
表示您在向量上使用了[n]
,n
小于0
或大于或等于向量中的元素数。
这会导致未定义的行为,因此不同的编译器可能会以不同的方式做出反应。
要在这种情况下获得可靠的行为,一种方法是使用.at(n)
而不是[]
,并确保捕获异常。另一种方法是在应用它们之前检查你的索引值,这样你就不会在第一时间访问越界。