2013-08-23 3 views
0

Я пытаюсь написать функцию, которая просит пользователя ввести несколько шестнадцатеричных строк в консоль, а затем преобразовать эти строки в биты. Я хочу, чтобы функция использовала указатели на биты, чтобы биты сохранялись в родительской функции. Из-за того, что я не использовал C++ 11, я разбил 64-битный бит на две операции с шестнадцатеричным преобразованием.нет соответствия для оператора

void consoleDataInput(bitset<1> verbose, bitset<32>* addr, bitset<64>* wdata, bitset<8>* wdata_mask, bitset<1>* rdnwr) 
{ 
    cout << "enter 1 for read 0 for write : "; 
    cin >> *rdnwr; 

    string  tempStr; 
    unsigned long tempVal; 
    istringstream tempIss; 

    // Input the addr in hex and convert to a bitset 

    cout << "enter addr in hex : "; 
    cin >> tempStr; 
    tempIss.str(tempStr); 
    tempIss >> hex >> tempVal; 
    *addr = tempVal; 

    // enter wdata and wdata_mask in hex and convert to bitsets 

    if (rdnwr[0] == 1) 
    { 
     *wdata = 0; 
     *wdata_mask = 0; 
    } 
    else 
    { 
     // wdata 

     bitset<32> tempBitset; 
     cout << "enter wdata in hex : "; 
     cin >> tempStr; 
     if (tempStr.length() > 8) 
     { 
      tempIss.str(tempStr.substr(0,tempStr.length()-8)); 
      tempIss >> hex >> tempVal; 
      tempBitset = tempVal; 
      for (int i=31; i>=0; i--) 
      { 
       wdata[i+32] = tempBitset[i]; 
      } 

      tempIss.str(tempStr.substr(tempStr.length()-8,tempStr.length())); 
      tempIss >> hex >> tempVal; 
      tempBitset = tempVal; 
      for (int i=32; i>=0; i--) 
      { 
       wdata[i] = tempBitset[i]; 
      } 
     } 
     else 
     { 
      tempIss.str(tempStr); 
      tempIss >> hex >> tempVal; 
      tempBitset = tempVal; 
      for (int i=32; i>=0; i--) 
      { 
       wdata[i] = tempBitset[i]; 
      } 
     } 

     // wdata_mask 

     cout << "enter wdata_mask in hex : "; 
     cin >> tempStr; 
     tempIss.str(tempStr); 
     tempIss >> hex >> tempVal; 
     *wdata_mask = tempVal; 
    } 

Когда я пытаюсь скомпилировать с помощью GCC в коде :: блоков я получаю ошибку

C:\Diolan\DLN\demo\ApolloSPI\main.cpp|202|error: no match for 'operator=' in '*(wdata + ((((sizetype)i) + 32u) * 8u)) = std::bitset<_Nb>::operator[](std::size_t) [with unsigned int _Nb = 32u; std::size_t = unsigned int](((std::size_t)i))'| 

Что выдвигает на первый план линию

wdata[i+32] = tempBitset[i]; 

Как я понимаю, я не» t необходимо использовать оператор * до wdata[i+32], потому что [i+32] служит индикатором того, что это указатель.

Я не уверен, как двигаться вперед. Оператор = является допустимым для использования с битетом, поэтому я не понимаю ошибку.

Спасибо.

+0

Я бы использовал ссылки, а не указатели. – chris

ответ

0

Ваш wdata действительно является указателем, поэтому wdata [i + 32] фактически эквивалентен * (wdata + i + 32), указывая на биты < 64>. Вы назначаете этот биттете tempBitset [i], который, если я не ошибаюсь, является одним битом.

То есть вы пытаетесь присвоить значение одного бита всему битовому набору.

Я подозреваю, что Вы желаете, чтобы установить один бит в одном BitSet к значению бита в другой, в этом случае я думаю, что вы сделать хотите «*»:

(*wdata)[i+32] = tempBitset[i]; 

Смысл, грубо говоря, взять Bitset < 64>, на который указывает wdata, и установить бит [i + 32] на то же значение, что бит [i] битового набора в tempBitset.