2015-02-19 4 views
-1

Я хочу преобразовать бит в строку. Visual Studio 2008 содержит недопустимое исключение нулевого указателя.преобразовать бит в строку C++

Возможно, это имеет какое-то отношение к размеру массива. это должно быть 8, но выход говорит, что это 4, но почему?

class Converter 
{ 
public: 
    string bitfieldToString (bool b_input[]) 
    { 
     string c_conv; 
     int i; 
     for(i = 0; i < sizeof(b_input) ; i++) 
     { 
      if(b_input[i]=false){ 
       c_conv.append("0"); 
      } 
      else if (b_input[i]=true){ 
       c_conv.append("1"); 
      } 
      else c_conv = "Input is not a bitfield";break; 
     } 
     cout<<c_conv<<" "<< sizeof(b_input)<<endl; 
     return (0); 
    } 
}; 
int main(void) 
{ 
    Converter converter; 
    bool b2[8] = {0,1,0,0,1,0,1,1}; 
    converter.bitfieldToString(b2); 
    return (0); 
} 

Спасибо! Теперь все работает по назначению. и извините за этот вопрос. Я новичок в C++.

+1

SizeOf (BOOL []), которые должны быть SizeOf (* BOOL), когда я не укомплектовать неправильно это 4 байта на 32-битной платформе. – user743414

+1

Самый простой способ сделать это - использовать один или несколько 'std :: bitset' и [' std :: bitset :: to_string() ') (http://en.cppreference.com/w/cpp/ utility/bitset/to_string). –

+0

'sizeof (b_input)' Это не работает. Передайте размер массива в качестве параметра или используйте 'std :: vector' –

ответ

2

Исключение составляет то, что вы return (0);. Это интерпретируется как нулевой указатель, используемый для инициализации std::string с помощью конструктора, для которого требуется действительный указатель на строку C-стиля, а не нулевой указатель.

Это должно быть return c_conv;

размер несоответствие объясняется тем, что b_input не является массивом. В качестве параметра функции bool b_input[] является указателем. Вы не можете передать массив функции по значению; и нет способа определить размер массива только из указателя. Итак, sizeof(b_input) дает вам размер указателя, а не массив, и все идет не так.

Есть несколько вариантов. Вы можете передать размер в качестве второго параметра; но это подвержено ошибкам. Можно сделать вывод, размера как аргумент шаблона, взяв массив по ссылке:

template <size_t size> 
string bitfieldToString (bool (&b_input)[size]) 

Вы можете использовать std::array или std::vector, которые имеют удобные size() функций-членов. (Но будьте осторожны с vector<bool>, так как это особый случай, который не всегда ведет себя как стандартный контейнер.) Или вы можете использовать std::bitset, который имеет удобную функцию to_string, которая делает именно то, что вы хотите.

Наконец, включите предупреждения своего компилятора - он должен сказать вам не использовать =, где вы имеете в виду ==.И не так много точек проверки для случая, когда логическое значение не является ни истинным, ни ложным. Вы можете уменьшить тело цикла все в

c_conv.append(b_input[i] ? '1' : '0'); 
2

Номер не правильный код.

Прежде всего, исключение нулевого указателя происходит от return (0); в конце bitfieldToString fuction. Вы определили его для возврата string; когда вы return 0 вместо этого, C++ думает, что 0 - это указатель char* и попытается его преобразовать - указатель NULL - в строку, которая выйдет из строя. Вероятно, вы должны вместо этого вернуть c_conv.

Во-вторых, sizeof(b_input) всегда будет иметь значение bool Указатель. В 32-битной системе это будет 4, в 64-битной системе 8. Вы не можете получить длину массива, переданного как аргумент, с sizeof; вам нужно будет добавить параметр длины к вашей функции.

В-третьих, внутри вашей петли for вы находитесь , назначая вместо b_input[i] вместо сравнения значений. Использовать ==, а не =.

В-четвертых, в последнем else ветке вам не хватает брекетов. По существу, break всегда выйдет из цикла после самой первой итерации.

Смежные вопросы