2013-09-16 41 views
1

我正在處理一個向量,它是我的代碼的最終輸出。我發現的是,我將它傳遞給一個函數之前和之後,矢量大小是不同的,即使我沒有添加任何元素。我通過引用傳遞向量。有問題的功能是NM_sim,我無法調試爲什麼會發生這種情況。感謝您的時間和幫助!我將它傳遞給函數NM_sim之前和之後跟蹤矢量的大小。在調用NM_sim之後,矢量的大小會發生變化。這裏是我的代碼部分:傳遞給函數後的矢量更改大小

爲state_type被描述爲標準::向量

random_select(gene_ind, n_ka_temp, n_kd_temp, kavec_pert, kdvec_pert, kaval_pert, kdval_pert); 
      state_type param_pert; 
      param_pert.push_back(param[0]); 
      param_pert.push_back(param[1]); 
      param_pert.push_back(param[2]); 
      param_pert.insert(param_pert.end(),kaval_pert.begin(),kaval_pert.end()); 
      param_pert.insert(param_pert.end(),kdval_pert.begin(),kdval_pert.end()); 
      transform(param_pert.begin(),param_pert.end(),param_pert.begin(),powof10()); 
      cout << "########## Value of param size is: " << param.size() << " ################" << endl; 
      MC_sim (x_d, t_d, mean_xd, fex_nm, jex_nm, gene_ind, n_ka_temp, n_kd_temp, error_pert, param_pert); 
      for (int i = 0; i < param.size(); i++)cout << "########## Value of param from MC is: " << param[i] << " ################" << endl; 
      cout << "########## Value of param size is: " << param.size() << " ################" << endl; 
      cout << "The optimized value of error from MC calculation is: " << error_pert << endl; 
      NM_sim(x_d, t_d, mean_xd, fex_nm, jex_nm, gene_ind, n_ka_temp, n_kd_temp, error_pert, param_pert); 
      cout << "The optimized value of error from NM calculation is: " << error_pert << endl; 

內NM_sim:

void NM_sim(const state_type &x_d, const state_type &t_d, const state_type &mean_xd, myFex_single &fex_nm, myJex_single &jex_nm, const int &gene_ind, const int nka, const int nkd, double &error_ode, state_type &param) 
{ 
    const int param_size = 3 + nka + nkd; 
    cout << "########## Value of error from MC is: " << error_ode << " ################" << endl; 
    cout << "########## Value of param size is: " << param.size() << " ################" << endl; 
    for (int i = 0; i < param.size(); i++)cout << "########## Value of param from MC is: " << param[i] << " ################" << endl; 
.... 
} 

我得到的輸出是:

########## Value of param from MC is: 0.789519 ################ 
########## Value of param from MC is: -0.47315 ################ 
########## Value of param from MC is: -0.693194 ################ 
########## Value of param from MC is: 0.368322 ################ 
########## Value of param from MC is: 0.298118 ################ 
########## Value of param from MC is: 0.883191 ################ 
########## Value of param size is: 6 ################ 
The optimized value of error from MC calculation is: 0.000329494 
########## Value of error from MC is: 0.000329494 ################ 
########## Value of param size is: 13 ################ 
########## Value of param from MC is: 0.789519 ################ 
########## Value of param from MC is: -0.47315 ################ 
########## Value of param from MC is: -0.693194 ################ 
########## Value of param from MC is: 0.368322 ################ 
########## Value of param from MC is: 0.298118 ################ 
########## Value of param from MC is: 0 ################ 
########## Value of param from MC is: 0 ################ 
########## Value of param from MC is: 0.883191 ################ 
########## Value of param from MC is: 0 ################ 
########## Value of param from MC is: 0 ################ 
########## Value of param from MC is: 0 ################ 
########## Value of param from MC is: 0 ################ 
########## Value of param from MC is: 0 ################ 

的在將其傳遞給NM_sim後,矢量大小從MC_sim後的6變爲13。任何關於如何解決它的想法或意見,我們感激不盡!謝謝!

+4

將該向量作爲'const'引用傳遞,並且該bug可能會變得很明顯。 (在你沒有顯示的代碼中,最有可能調用'operator []'的值過高,從而在向量中創建一個新元素。) –

回答

1

您的比較尺寸爲param_pertparam。這兩個不是同一個向量。

cout << "..." << param.size() << "..." << endl; 
MC_sim (x_d, t_d, mean_xd, fex_nm, jex_nm, gene_ind, n_ka_temp, n_kd_temp, error_pert, param_pert) 

嘗試:

cout << "########## Value of param size is: " << param_pert.size() << " ################" << endl; 
+0

感謝您發現它。 random_selec函數有一個問題。我需要進一步分析。 – rtmi

+0

代碼的前面部分存在一個錯誤,導致向量大小發生最終錯誤。我的錯字導致分析代碼的錯誤部分。我修復了錯誤,並感謝您發現錯誤。 – rtmi

0

步驟一:消除所有的代碼,除了來回傳遞。你還有問題嗎?如果沒有,那麼問題出現在你的功能代碼中。如果問題依然存在,那麼至少你知道這是導致你問題的傳球。