#c #vector #hex
#c #вектор #шестнадцатеричный
Вопрос:
У меня есть проект, который я пытаюсь решить
И проблема, с которой я сталкиваюсь, заключается в том, что вывод продолжает получаться немного неправильным, вместо того, чтобы последние два были E1, это E4, а в середине нулей должно быть 11F, вместо этого это что-то вроде 12D или что-то в этом роде. это подразумевает, что он делает в основном правильные вещи, но я не понимаю.не понимаю, что не так. Это сводит меня с ума.
#include <vector>
#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;
//int count = 0;
//GOOD
int hexToInt(vector<char>amp; c);
vector<char> intToHex(int n);
int hexToInt(char c){
if(c>='A')return c-'A' 10;
else return c-'0';
}
void execute(vector<char>amp; memory){
// cout << "bebn";
char A = '0';
char B = '0';
if ((B>'9'amp;amp;B<'A')||(B<'0')||(B>'F')) cout << B << endl;
for( size_t i = 0; i<memory.size();i ){
// cout << i << " "<< memory[i] <<endl;
// if(count<100){
// cout << i << " " << memory[i]<<" "<< A << " "<< B <<endl;
// count ;
// cout << A << endl;
// cout << "I: "<< i<< " memory value: "<<memory[i]<<endl;
//}
vector<char> c;
if(memory[i]-'0' == 0){
c.push_back(memory[i 1]);
c.push_back(memory[i 2]);
A = memory[hexToInt(c)];
i =2;
}
else if(memory[i] -'0' == 1){
c.push_back(memory[i 1]);
c.push_back(memory[i 2]);
memory[hexToInt(c)] = A;
i =2;
}
else if(memory[i] -'0' == 2){
char temp = A;
A = B;
B = temp;
}
else if(memory[i] -'0' == 3){
int tempy = hexToInt(A) hexToInt(B);
// if (count<100) cout << tempy<< "aaa"<<endl;
c = intToHex(tempy);
// cout << "LOOK " <<tempy<< temp[0] << " "<<temp[1]<< " "<<A << " "<< B << endl;
//Questionable****
A = c[1];
B = c[0];
}
else if(memory[i] -'0' == 4){
if(A == 'F') A='0';
else A =1;
}
else if(memory[i] -'0' == 5){
if(A == '0') A='F';
else A -=1;
}
else if(memory[i] -'0' == 6){
if(A=='0'){
c.push_back(memory[i 1]);
c.push_back(memory[i 2]);
if(hexToInt(c)>=240) i =2;
else i = hexToInt(c)-1;
}
else i =2;
}
else if(memory[i] -'0' == 7){
c.push_back(memory[i 1]);
c.push_back(memory[i 2]);
if(hexToInt(c)>=240) i =2;
else i = hexToInt(c)-1;
// i =2;
}
else /*if(memory[i] -'0' == 8)*/{
if(i!=0) {
for(size_t b = 0; b<memory.size();b ) cout << memory[b];
}
i = memory.size();
// cout <<"yayyyy";
}
if(memory[254]=='E'amp;amp; memory[64]=='1'amp;amp; memory[65]=='1'amp;amp; memory[66]=='F'amp;amp;memory[255]=='1')cout <<"fuuuu";
// cout << memory[255]<<endl;
}
cout << endl;
}
int hexToInt(vector<char>amp; c){
int ret = 0;
int place = 1;
for (int i = c.size()-1; i>=0; i--){
if(c[i]>='A') ret= ret place*(c[i]-'A' 10);
else ret= ret place*(c[i]-'0');
place*=16;
}
return ret;
}
//GOOD
vector<char> intToHex(int n){
vector<char> ret;
int place = 16;
while (!(place/16>n)){
int curr = n%place/(place/16);
// if(count<100) cout<<n <<"bbb"<< curr << endl;
if(curr<10) ret.push_back('0' curr);
else ret.push_back('A' (curr-10));
n-=curr;
place*=16;
}
while(ret.size()<2) ret.push_back('0');
// if(count<100)cout << ret[0]<<ret[1]<<endl;
int low = 0;
int high = ret.size()-1;
while(low<high){
char temp = ret[low];
ret[low]=ret[high];
ret[high]=temp;
high--;
low ;
}
return ret;
}
int main () {
// int a = 7;
// vector<char> b = intToHex(a);
// for(int i = 0; i<b.size();i ){
// cout << b[i];
// }
// cout <<" " << hexToInt(b) << hexToInt('F')<< " "<< hexToInt('0') << endl;
//GOOD
ifstream ifs("test.txt");
if(!ifs) cout << "wahhn";
vector<char> memory(256);
while(ifs>>memory[0]){
// cout << "wehn";
for (size_t i = 1; i<memory.size();i ){
ifs>>memory[i];
cout<<memory[i];
// cout << memory[i];
}
cout<<endl;
// cout << endl;
execute(memory);
}
// vector<int> wtf(256);
// for(int i = 0; i<wtf.size();i ){
// cout << i << " ";
// vector<char> temp = intToHex(i);
// for(int d = 0; d<temp.size(); d ){
// cout <<temp[d];
// }
// cout <<" "<< hexToInt(temp);
// if(i<16) cout<< " "<<hexToInt(intToHex(i)[1]);
// if(i!=hexToInt(intToHex(i)[1])) cout <<" HIOOOOOOOOOOOOOOOOOOOO";
// cout << endl;
//
// }
char c = 'A' 1;
cout << c;
system("PAUSE");
}
Комментарии:
1. Не могли бы вы попробовать отредактировать все отладочные материалы и объяснить свой алгоритм? Вы рассматривали возможность проведения небольшого рефакторинга?
2. Что вы подразумеваете под рефакторингом?
3. Это не работает. Вы имеете в виду сделать его аккуратнее?
Ответ №1:
Ваши коды операций INC и DEC неверны. Если вы посмотрите на ASCII-таблицу, вы увидите, что «A» не следует за «9», поэтому вам нужно «перепрыгнуть» этот пробел.
Лучший способ сделать это — просто преобразовать шестнадцатеричные цифры в целое число, увеличить / уменьшить целое число и преобразовать его обратно. Например, ваш DEC-код операции может выглядеть так:
int temp = hexToInt(A);
if(temp == 0)
temp = 0xf;
else
temp -= 1;
vector<char> tempHex = intToHex(temp);
A = tempHex.back();
Комментарии:
1. Было бы неплохо, если бы это было так, но нет, после ‘9’ следует ‘:’ так
('9' 1) == ':'
и('A' - 1) == '@'
. Между ними целая куча символов.2. Я не вижу этой ошибки, хотя, возможно, мы смотрим на что-то другое? В шестнадцатеричном A идет после 9