2012-02-21 17 views
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 

給出了一個不同的結果,即使我給它一個恆定的種子,並且如果我多次運行代碼而不改變任何東西,它會給出相同的序列。如果我留下重要的事情,我會提前道歉。

+6

在'valgrind'或類似的工具下運行你的代碼。您可能正在訪問數組或其他對象以外的邊界。 – 2012-02-21 17:10:12

+0

InitializeStuffAbove,初始化Dist和Near Rate? – EvilTeach 2012-02-21 17:16:45

+0

這句話「我是一位物理學家寫一個模擬......」給了我一個閃回。 (而且你的用戶名顯示出了令人驚訝的數量,但是不用擔心。)無論如何,如果你沒有足夠的時間來重現錯誤,我們很難提供幫助。我的建議:*簡化*。儘可能多地刪減代碼,並在每個步驟中驗證奇怪的行爲持續存在;擺脫'CalcRates'和'Particle.h',將'GaussianDisorder'減少到幾個'rnd',等等。在某個時候,或者原因會跳到你身上,或者你會得到足夠小的東西來發布整個。 – Beta 2012-02-21 17:22:43

回答

相關問題