2016-05-02 4 views
1

я написал парсер, который читает в текстовый файл с текстом в формате следующих типов:Ошибка преобразования десятичной в двоичную в строке

a r3, r2, r1 
ah r8, r5, r6, r7 
ai r10, i10, r127 

число для г может измениться, и начальные символы могут изменение. В основном то, что делает синтаксический анализатор, основано на начальных символах (a, ah и т. Д.), Оно будет определять значение кода операции и затем анализировать номера регистров и преобразовывать их в двоичные. Он объединит все эти значения вместе, чтобы создать 32-битную двоичную командную строку и вывести ее в текстовый файл.

При тестировании я столкнулся с ошибкой.

Вот мой код:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <bitset> 
using namespace std; 

void main() 
{ 
    string instruction, input, OpCode; 
    int i = 0; 
    int format = 0; 
    vector<string> myString; 
    ifstream inFile; 
    inFile.open("myfile.txt"); 

    //format 1 -> input: syntax/rt/ra/rb  output -> opcode/rb/ra/rt 
    //format 2 -> input: syntax/rt/ra/rb/rc output -> opcode/rt/rb/ra/rc 
    //format 3 -> input: syntax/rt/ra  output -> opcode/i7/ra/rt 
    //format 4 -> input: syntax/rt/ra  output -> opcode/i10/ra/rt 
    //format 5 -> input: syntax/rt   output -> opcode/i16/rt 

    if (inFile.is_open()){ 
     cout << "test" << endl; 
     //Read until no more lines in text file to read 
     while (getline(inFile, input)) 
     { 
      istringstream ss(input); 
      string token; 

      //Get the instruction token 
      getline(ss, token, ' '); 
      instruction = token; 

      //ADD WORD 
      if (instruction == "a"){ 
       OpCode = "00011000000"; 
       format = 1; 
      } 

      if (format == 1){ 
       // Seperate the registers 
       //We have RA, RB, AND RT 
       //Convert the values into binary 
       string value; 
       while (getline(ss, token, ',')){ 
        ss.ignore(); 
        token.erase(0, 1); //Remove the "r" or "i" character from each string/register    
        myString.push_back(token); 
       } 

       for (int j = 0; j < myString.size(); j++) 
       { 
        cout << myString[j] << endl; 
        value = bitset<8>(myString[j]).to_string(); 
        cout << value << endl; 
        OpCode = OpCode + value; 
        cout << OpCode << endl; 
       } 
      } 


     } 

    } 
    system("pause"); 
} 

Для простоты я только положить 1, если заявление для команды добавить слово. Вход я использую для того чтобы испытать следующий:

a r3, r1, r2 

Что он должен сделать, это посмотреть инструкцию является a, поэтому OpCode получает значение и это будет продолжаться, чтобы разобрать r3, r2, r1. Он удалит r и преобразует 3, 2 и 1 в его двоичное значение и поместит его в строку, которая объединена с OpCode, чтобы сформировать инструкцию длиной 32 бит. Вопрос, который у меня есть, - value = bitset<8>myString[j]).to_string();. Visual Studio выдает следующее сообщение об ошибке при отладке:

Unhandled exception at 0X7712C52F in Assembler_Parser.exe: Microsoft C++ exception: std::invalid_arguement at memory location 0x0039F110.

Я не уверен, что сделать это. Это дает мне возможность сломаться или продолжить. Если я продолжу, он преобразует 3 в 00000000. На следующей итерации он правильно преобразует 2 в 00000010, но затем он выдает исключение для 1.

Im не уверен, почему это происходит.

ответ

4

Конструктор строк bitset не преобразует значение из десятичного (или шестнадцатеричного) представления в двоичный. Если какой-либо символ, с которым он сталкивается, не равен 0 или 1, он выдает исключение std::invalid_argument. Попробуйте std::stoi:

value = bitset<8>(std::stoi(myString[j])).to_string(); 
+0

'значение = BITSET <8> (Стой (MyString, J)) to_string();' «Ошибка. Не экземпляр перегруженной функции совпадает со списком аргументов типов аргументов: (станд :: Vector. >, int) " – Noobgineer

+0

@Noobgineer Я не видел, что' myString' был фактически вектором. Выберите лучшие имена переменных. – user6280310

+0

И это исправлено! Tyvm !! – Noobgineer

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