可以在此函数中使用未初始化[-Wyybe-uninitialized]

时间:2016-11-14 14:44:31

标签: c++

我需要有关此消息的帮助:“警告:'f_0'可能在此函数中未初始化使用[-Wyybe-uninitialized]”

我有一个文件名:“shen_test_38_30_60__78_26_38_b_100_ch1-683.0-mhz-8000.0-ksps-2016-06-20-17.24.19-utc.dat”;

我希望通过使用扫描并将字符串转换为数字来获取值:“683”和“8000”,例如:

void split(const string& s, char c, vector<string>& v) {
   string::size_type i = 0;
   string::size_type j = s.find(c);

   while (j != string::npos) {
      v.push_back(s.substr(i, j-i));
      i = ++j;
      j = s.find(c, j);

      if (j == string::npos){
         v.push_back(s.substr(i, s.length()));
      }
   }
}
int main()
{
     string input_file_name1 = "shen_test_38_30_60__78_26_38_b_100_ch1-683.0-mhz-8000.0-ksps-2016-06-20-17.24.19-utc.dat";
     split(input_file_name1, '-', v);

            for(double i=1; i < v.size(); i++)
            {
                if(v[i] == "mhz"){
                    f_0 = atoi(v[i-1].c_str())*1e6;                 cout <<"***f_0      = " << f_0 << endl;
                }
                if(v[i] == "ksps"){
                    f_s = atoi(v[i-1].c_str()) * 1e3;               cout << "***f_s         = " <<f_s <<endl ;
                }

            }
}

double t1 = f_s + 10000; double t2 = f_0 + 53000000;

它确实给了我一个实数,但是当我尝试做一些计算时,它显示了错误信息:“警告:'f_0'可能在此函数中未初始化使用[-Wyybe-uninitialized]”

任何理想,请帮助!

谢谢。

2 个答案:

答案 0 :(得分:1)

如果没有看到你如何宣布f_0和v,我不能保证这是你的问题。但是,警告可能未初始化来自编译器在使用之前无法确保变量具有有效数据。这意味着即使你将f_0设置为if语句中的实际值,编译器也无法保证if语句将被命中,并且该变量将被定义为“maybe”。

可以从有效数据中跳过f_0的两个可能位置是:

1.    for(double i=1; i < v.size(); i++)
2.    if(v[i] == "mhz")

在第一种情况下,不能保证i = 1实际上小于v.size()。

在第二种情况下,这不能保证编译器v [i]最终将包含“mhz”。在这两种情况下,编译器都会将其视为可能是单元化的变量。即使您正在对该值进行硬编码,编译器也不会检查您的硬编码变量以确定它们是否会保证它会被命中。

为了避免此警告,您必须将f_0初始化为一个值。基于:

f_0 = atoi(v[i-1].c_str())

我将假设它是一个整数,所以只要你定义了它,你就可以将声明改为:

int f_0 = -1;

这应删除该警告,但我强烈建议您在尝试使用之前使用值作为默认值进行错误检查。

有关警告的补充说明: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

答案 1 :(得分:0)

这是你在找什么?

#include <vector>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void split(const string& s, char c, vector<string>& v) {
   string::size_type i = 0;
   string::size_type j = s.find(c);

   while (j != string::npos) {
      v.push_back(s.substr(i, j-i));
      i = ++j;
      j = s.find(c, j);

      if (j == string::npos){
         v.push_back(s.substr(i, s.length()));
      }
   }
}
int main()
{
     string input_file_name1 = "shen_test_38_30_60__78_26_38_b_100_ch1-683.0-mhz-8000.0-ksps-2016-06-20-17.24.19-utc.dat";
     std::vector<std::string> v;
     split(input_file_name1, '-', v);

    for(double i=1; i < v.size(); i++)
    {
        if(v[i] == "mhz"){
            int f_0 = atoi(v[i-1].c_str())*1e6;                 cout <<"***f_0      = " << f_0 << endl;
        }
        if(v[i] == "ksps"){
            int f_s = atoi(v[i-1].c_str()) * 1e3;               cout << "***f_s         = " <<f_s <<endl ;
        }

    }
}