gnu编译器,从命令行运行,使用崇高的文本2没有mods。代码看似无关的变化给出了不同的结果
简单的程序显示一个递归函数的运行时间,该函数使用随机数在0和1之间的均匀分布的5000索引数组并添加它们(意味着您应该在2500的球场中获得某个值)。下面的代码一贯正常工作,并产生合理接近预期值的东西。然而,添加一个新的线/选项卡到其中一个cout中,并且所有的事情都会在一个手筐中进入地狱(见下文)。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
double sumOfRandomNumbers(double arrayToFill[], int lengthOfArray){
if(lengthOfArray == 0) return arrayToFill[lengthOfArray];
return arrayToFill[lengthOfArray] + sumOfRandomNumbers(arrayToFill, lengthOfArray - 1);
}
double seconds(){return double(clock())/CLOCKS_PER_SEC;}
int main(){
int sizeOfArray = 5000;
double sum = 0.0, deltaT = 0.0, array[sizeOfArray];
srand(time(NULL));
for(int i = 0; i < sizeOfArray; i++) array[i] = double(rand())/double(RAND_MAX);
cout << "\nRecursive Method\n";
deltaT = seconds();
for (int i = 0; i < 100000; i++){
sum = sumOfRandomNumbers(array, sizeOfArray);
if (i%10000 == 0) cout << i/1000 << " percent complete\n";
}
deltaT = seconds() - deltaT;
cout << "\n\n\t\tRecursive method found sum to be " << sum;
cout << "\n\t\tThis recursive calc took " << deltaT << " seconds to run.\n";
}
输出
Recursive Method
0 percent complete
10 percent complete
20 percent complete
30 percent complete
40 percent complete
50 percent complete
60 percent complete
70 percent complete
80 percent complete
90 percent complete
Recursive method found sum to be 2466.4
This recursive calc took 12.226 seconds to run.
这里是完全更新,更新后的代码为编译。请注意奇怪的输出。我添加了粗体代码。如果不出现或很难看到的,这是改变
从
if (i%10000 == 0) cout << i/1000 << " percent complete\n";
到
if (i%10000 == 0) cout << "\n\t" << i/1000 << " percent complete\n";
............. .................................................. ............
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
double sumOfRandomNumbers(double arrayToFill[], int lengthOfArray){
if(lengthOfArray == 0) return arrayToFill[lengthOfArray];
return arrayToFill[lengthOfArray] + sumOfRandomNumbers(arrayToFill, lengthOfArray - 1);
}
double seconds(){return double(clock())/CLOCKS_PER_SEC;}
int main(){
int sizeOfArray = 5000;
double sum = 0.0, deltaT = 0.0, array[sizeOfArray];
srand(time(NULL));
for(int i = 0; i < sizeOfArray; i++) array[i] = double(rand())/double(RAND_MAX);
cout << "\nRecursive Method\n";
deltaT = seconds();
for (int i = 0; i < 100000; i++){
sum = sumOfRandomNumbers(array, sizeOfArray);
if (i%10000 == 0) cout << "\n\t" << i/1000 << " percent complete\n";
}
deltaT = seconds() - deltaT;
cout << "\n\n\t\tRecursive method found sum to be " << sum;
cout << "\n\t\tThis recursive calc took " << deltaT << " seconds to run.\n";
}
输出
Recursive Method
0 percent complete
10 percent complete
20 percent complete
30 percent complete
40 percent complete
50 percent complete
60 percent complete
70 percent complete
80 percent complete
90 percent complete
Recursive method found sum to be 1.15021e+257
This recursive calc took 12.262 seconds to run.
请注意我们是如何从非常合理的2466.4变为完全荒谬的1.15 x 10^257。没有做任何其他更改,即使经过几十次运行后,这些数字也是非常典型的,您上面看到的代码是编译和运行的确切代码。
您知道'arrayToFill [lengthOfArray];'正在访问一个超过数组末尾的元素,因为索引从'0'开始。 – 2013-03-08 23:24:49
帖子标题应与问题相关。另外,请只发布相关代码。没有人想读你的整个解决方案。当一个问题有一段代码时,我只需要寻找另一个答案。 – evanmcdonnal 2013-03-08 23:25:02
这是一件好事,你标记了这个* sublimetext2 *,因为当代码不能按预期工作时,应该总是怀疑文本编辑器! – Praetorian 2013-03-08 23:27:14