2016-11-08 227 views
0

我想問一個讓我混淆的問題。我試圖掃描字符串,並將其轉化爲實數。用這個數字來計算價值。這是我的代碼:」可能在此函數中未初始化使用[-Wmaybe-uninitialized]「

string input_file_name1 = "shen_test_38_30_60__78_26_38_b_100_ch1-533.0-mhz-8000.0-ksps-2016-06-20-17.24.19-utc.dat"; 

string input_file_name2 = "shen_test_38_30_60__78_26_38_b_100_ch2-533.0-mhz-8000.0-ksps-2016-06-20-17.24.19-utc.dat"; 

std::ifstream input1(input_file_name1.c_str() , std::ios::binary | std::ios::in); 
std::ifstream input2(input_file_name2.c_str() , std::ios::binary | std::ios::in); 

split(input_file_name1, '-', v); 

for(unsigned i=1; i < v.size(); i++) 
{ 
    if(v[i] == "mhz"){ 
     f_0 = atoi(v[i-1].c_str())*1e6;     
    } 

    if(v[i] == "ksps"){ 
     f_s = atoi(v[i-1].c_str()) * 1e3;// f_s = 8e6;   
    } 
} 

double nblocks; //f_s = 8e6; 

nblocks = floor(10/(262144/f_s)); 

我編譯時得到了這樣的信息:

「警告: 'F_S' 在這個函數中,可以使用未初始化[-Wmaybe-未初始化] Nblocks屬=(10 /(nsamps/f_s));「

你有什麼理想來幫我解決這個問題嗎?

非常感謝。

回答

3

這意味着如果v[i]既不是「mhz」也不是「ksps」,那麼從不執行爲f_s分配內容的代碼,因此不會對f_s進行初始化。

您可以防止此警告,例如像這樣:

for(unsigned i=1; i < v.size(); i++) 
{ 
    if(v[i] == "mhz"){ 
     f_0 = atoi(v[i-1].c_str())*1e6;     
    } 
    else if(v[i] == "ksps"){ 
     f_s = atoi(v[i-1].c_str()) * 1e3;// f_s = 8e6;   
    } 
    else 
    { 
     // v[i] is none of the expected values 
     f_s = -1; 
     ... take more action 
    } 
} 
+0

注意:出於同樣的原因,可能會出現'f_0'未初始化的情況。 –

+0

此外,如果f_s沒有初始化,那麼它的值可能爲零。在這種情況下,在最後一行('nblocks = floor(10 /(262144/f_s));')將嘗試除零。這可能會或可能不會觸發分段錯誤,但它絕對不是您想要的。 – Striezel

2

的這裏的問題是,if(v[i] == "ksps")可能永遠是正確的。如果不是,那麼f_s永遠不會獲得設置的值。你可以做的是默認初始化f_s具有一定的價值。那麼你至少知道這個變量有一些已知的狀態。

請注意,如果您尚未初始化f_0,您將遇到同樣的問題。

相關問題