Моя проблема проста:
uint32_t memory::read_word1 (uint32_t address) {
if(address>(maxWord)){
return 0;
}
uint32_t temp = 10;
return temp;}
uint32_t memory::read_word2 (uint32_t address) {
if(address>(maxWord)){
return 0;
}
return mem[address];
}
void memory::show_address (uint32_t address) {
int temp=read_word(address);
printf("%08jx\n", (uintmax_t)temp);
}
// Write a word of data to an address, mask contains 1s for bytes to be updated
void memory::write_word (uint32_t address, uint32_t data, uint32_t mask) {
if(address>(maxWord)){
int newMax = ceil(address/1024)*1024;
for(int i=maxWord+1;i<=newMax;i++){
mem.push_back(0);
}
maxWord=newMax;
}
data=data&mask;
mem[address]=data&~mask;
mem[address]=mem[address]|data;
}
read_word1 и 2 возвращают значение, которое будет напечатано через show_address. read_word2 — это функция, которую мы хотим. Однако проблема, которую мы находим в том, что когда мы возвращаемся из вектора, используя mem[address]
; read_word1 напечатает 0000000a
пока read_word2 печатает 00000010
когда мы устанавливаем элемент в 10 (через write_word).
Чтобы решить эту проблему, я попытался использовать mem.at (адрес), приведение типов и даже преобразование в строку, но все безрезультатно. Вектор mem
определяется как
std::vector<uint32_t> mem=decltype(mem)(1024,0);
в заголовочном файле класса.
Кажется, это основная проблема с вектором — что можно сделать?
РЕДАКТИРОВАТЬ:
Спасибо всем за вашу помощь. Чувствую, что тема была развенчана немного больше. Я не мог заставить его работать так, как я думал, но если вы передадите число в шестнадцатеричном виде, например. 000000aa в write_address, кажется, все работает! Все немного странно, но спасибо.
Задача ещё не решена.
Других решений пока нет …