3
只是爲了提醒人們,我是一位物理學家寫一個模擬,可能是從專業程序員的角度來看玩具代碼,所以我的編程知識並不是很好。無論如何,改寫700行,我的代碼看起來像下面這樣:一個函數中的局部變量變化導致一個不相關的函數,C++
#define _USE_MATH_DEFINES
#include "MersenneTwister.h" //Random number generator
#include "Particle.h" //Class that just keeps track of coordinates
#include <algorithm>
#include <vector>
using namespace std;
const double SomeGlobalParameters;
//Filling an array with gaussian random numbers
void GaussianDisorder(double EnergyArray[Nx][Ny][Nz], double Sigma)
{
for (int i=0; i<Nx; i++){
for (int j=0; j<Ny; j++){
for (int k=0; k<Nz; k++){
EnergyArray[i][j][k] = rnd.randNorm(0, Sigma);
}
}
}
}
//Using the above array (read only) to do some calculations
void CalcRates(Particle &charge1, const double (&EnergyArray)[Nx][Ny][Nz], double (&RateArray)[12])
{
int X1 = charge1.xPosition();
double NearRate, MagSqr, Dist, OldDist, OldEnergy, NewEnergy; //Declaring stuff for later
const double Parity=1.0;
InitializeStuffAbove(SomeGlobalParameters); // Give stuff values based on parameters
if (Dist == 0)
RateArray[0] = NearRate;
else
NewEnergy = Parity*EnergyArray2[X1+1][Y1][Z1] - Efield[0] + Coulomb/(Dist);
int main()
{
double EnergyArray[Nx][Ny][Nz];
double RateArray[12];
GaussianDisorder(EnergyArray);
CalcRates(charge1, EnergyArray, RateArray);
return 0;
}
我的問題是,當我改變
const double Parity=1.0;
,這是一個局部變量,以
const double Parity=-1.0;
我隨機數發生器
void GaussianDisorder
給出了一個不同的結果,即使我給它一個恆定的種子,並且如果我多次運行代碼而不改變任何東西,它會給出相同的序列。如果我留下重要的事情,我會提前道歉。
在'valgrind'或類似的工具下運行你的代碼。您可能正在訪問數組或其他對象以外的邊界。 – 2012-02-21 17:10:12
InitializeStuffAbove,初始化Dist和Near Rate? – EvilTeach 2012-02-21 17:16:45
這句話「我是一位物理學家寫一個模擬......」給了我一個閃回。 (而且你的用戶名顯示出了令人驚訝的數量,但是不用擔心。)無論如何,如果你沒有足夠的時間來重現錯誤,我們很難提供幫助。我的建議:*簡化*。儘可能多地刪減代碼,並在每個步驟中驗證奇怪的行爲持續存在;擺脫'CalcRates'和'Particle.h',將'GaussianDisorder'減少到幾個'rnd',等等。在某個時候,或者原因會跳到你身上,或者你會得到足夠小的東西來發布整個。 – Beta 2012-02-21 17:22:43