2016-11-08 1 views
0

私は混乱させる質問をしたいと思います。私はそのように文字列をスキャンし、それを実数に変換しようとしています。その数値を使って価値を計算する。ここに私のコードは次のとおりです。"はこの関数で初期化されていないかもしれません[-Waybe-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)); "

この問題を解決するのに役立つ理想はありますか?

ありがとうございました。 v[i]は「MHzの」も「kspsの」でもない場合、その後、f_sに何かを代入するコードが実行されていないため、初期化されていないf_sを残して決してしていることを意味

答えて

3

あなたはこのように、たとえば、この警告を防ぐことができます。

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を初期化していない場合、同じ問題が発生します。

関連する問題