Текст задачи приведён ниже. Задача со степика, ссылку на задачу оставлю ниже, т.к. нужен текстовый файл, чтобы проверять правильность решения, но его размер больше ограничения, поэтому не могу его прикрепить.
Проблема.
На примере приведённом к задаче все работает. Но когда я скачиваю файл данных и проверяю на нём, то как оказалось количество строк "пар" больше , чем указано в первом параметре первой строки. По моему коду получается, что после М*2 идут адреса, которые отдельно считываются в массив, но получается что он продолжает читать эти "пары" и всё работает не так как надо. Еще как я понял ATOI() преобразует в INT, а у меня uint64_t, и мне кажется, что значения "обрезаются"(если это конечно так), что тоже влияет на задачу.
Если будете присылать код решение через контейнер MAP, то, пожалуйста, объясните поподробнее код, т.к. я еще не до конца понимаю как через MAP сделать.
Формат входных данных следующий:
в первой строке вам даны 3 числа m,q,r≥0 , где q - это количество запросов, на которые вам нужно ответить, r - физический адрес корневой таблицы страниц следующих m строках записаны пары paddr и value - описание физической памяти, каждая пара значит, что по физическому адресу paddr хранится 64 битное значение value, при этом гарантируется, что все paddr различны, выровнены на границу 8 байт и помещаются в 64 бита в последних q строках идут целые числа - логические адреса, которые вам нужно преобразовать в физические, для каждого из этих чисел нужно вывести на отдельной строке либо физический адрес, либо слово "fault", если преобразовать логический адрес в физический нельзя. Считайте, что таблица страниц имеет формат 64 битного режима x86 (4 уровня, каждая страница 4 KB, каждая запись 8 байт, формат записи был показан в лекциях), но вы можете игнорировать все поля, кроме бита присутствия (на картинке бит P - нулевой бит) и собственно физического адреса.
Для всех физических адресов, не указанных во входных данных (среди m пар paddr value), считайте, что по этим адресам хранятся нули. все физические адреса, которые хранятся в записях таблицы страниц должны быть выровнены, как минимум, на границу 4096 байт (4Kb), т. е. младшие 12 бит физических адресов всегда равны 0, соответственно, хранить младшие биты нет смысла и в записи таблицы страниц они не хранятся - их место занимают специальные флаги. Пример: Sample Input: 4 4 0 0 4097 4096 8193 8192 12289 12288 16385 0 4096 42 131313
Sample Output: 16384 fault 16426 fault
Пример моего кода (да, да , он ужасен, не кидайте тапки:(). Ссылка на степик в самом низу.
#include <iostream>
#include <fstream>
#include <string>
#include <bitset>
using namespace std;
bitset<64> PLM4(bitset<64>);
bitset<64> NullBIT(bitset<64>);
bitset<64> Smesch(bitset<64>);
bool WordCount(string);
int main()
{
char buff[1000];
//char* str = new char[100];
string str;
uint64_t mas[3];
/* ofstream fout("Las_Vegas.txt");
fout << "4 4 0\n0 4097\n4096 8193\n8192 12289\n12288 16385\n0\n4096\n42\n131313";
fout.close(); */
ifstream file_out(""путь"\\dataset_44327_15.txt");
//ifstream file_out("Las_Vegas.txt");
for (int i = 0; i < 3; i++) {
file_out >> buff;
mas[i] = atoi(buff);
}
uint64_t *mass = new uint64_t[(mas[0] * 2)];
uint64_t *mas3 = new uint64_t[mas[1]];
getline(file_out, str); cout << str;
for (uint64_t i = 0; i < ((mas[0] * 2) + mas[1]); i++) {
if (i < (mas[0] * 2)) {
file_out >> buff;
mass[i] = atoi(buff);
}
//file_out.getline(str, '\n');
getline(file_out, str);
//fgets(str, 100, file_out);
if (i >= (mas[0] * 2)) {
if (!WordCount(str)) {
file_out >> buff;
mas3[i - (mas[0] * 2)] = atoi(buff);
}
}
}
file_out.close();
bitset<64> CR3(mas[2]);
bitset<64> offset;
uint64_t a;
for (int i = 0; i < mas[1]; i++) {
bitset<64> prover(mas3[i]);
bool breakF = false;
//offset = Smesch(prover <<= 36);
for (uint64_t j = 0; j < (mas[0] * 2); j = j + 2) {
if (((CR3 | offset = PLM4(prover)).to_ulong() == mass[j]) || breakF) {
for (int u = 1; u <= 4; j += 2, u++) {
bitset<64> pr(mass[j + 1]);
a = (pr = NullBIT(pr)).to_ulong();
a = ((pr = NullBIT(pr)) | (offset = Smesch(prover <<= (9 * (u - 1))))).to_ulong();
if (u == 4) {
bitset<64> prover(mas3[i]);
a = (offset = Smesch(prover <<= 38)).to_ulong();
cout << (pr.to_ulong() + a);
}
else
if (!(a == mass[j + 2])) {
cout << endl << "!!!" << "fault" << "!!!" << endl; j = j - 2 * (u - 1); breakF = true; break;
}//if SECOND
}
if (!breakF) { j = j - 6; breakF = true; }
break;
}
else { cout << endl << "!!!" << "fault" << "!!!" << endl; }
}
}
system("PAUSE");
return 0;
}
bitset<64> PLM4(bitset<64> bit)
{
bit <<= 15;
bit >>= 53;
return bit;
}
bitset<64> Smesch(bitset<64> bit)
{
bit <<= 15;
bit >>= 53;
return bit;
}
bitset<64> NullBIT(bitset<64> bit)
{
bit >>= 12;
bit <<= 12;
return bit;
}
bool WordCount(string str)
{
int space = 1;
for (int i = 1; i <= str.length(); i++)
{
if (str[i] == ' ')
{
space++;
}
}
if ((space + 1) > 1) { return true; } else
return false;
#include <iostream>
#include <fstream>
#include <string>
#include <bitset>
using namespace std;
bitset<64> PLM4(bitset<64>);
bitset<64> NullBIT(bitset<64>);
bitset<64> Smesch(bitset<64>);
bool WordCount(char []);
int main()
{
char buff[1000];
//char* buff = new char[1000];
char* str = new char[100];
uint64_t mas[3];
/* ofstream fout("Las_Vegas.txt");
fout << "4 4 0\n0 4097\n4096 8193\n8192 12289\n12288 16385\n0\n4096\n42\n131313";
fout.close(); */
ifstream file_out("C:\\Users\\Nikita\\Desktop\\dataset_44327_15.txt");
//ifstream file_out("Las_Vegas.txt");
for (int i = 0; i < 3; i++) {
file_out >> buff;
mas[i] = atoi(buff);
}
uint64_t *mass = new uint64_t[(mas[0] * 2)];
uint64_t *mas3 = new uint64_t[mas[1]];
for (uint64_t i = 0; i < ((mas[0] * 2) + mas[1]); i++) {
if (i < (mas[0] * 2)) {
file_out >> buff;
mass[i] = atoi(buff);
}
//file_out.getline(str, 100, '\n');
//fgets(str, 100, file_out);
if (i >= (mas[0] * 2)){
file_out >> buff;
mas3[i - (mas[0] * 2)] = atoi(buff);
}
}
file_out.close();
bitset<64> CR3(mas[2]);
bitset<64> offset;
uint64_t a;
for (int i = 0; i < mas[1]; i++) {
bitset<64> prover(mas3[i]);
bool breakF = false;
//offset = Smesch(prover <<= 36);
for (uint64_t j = 0; j < (mas[0] * 2); j = j + 2) {
if (((CR3 | offset = PLM4(prover)).to_ulong() == mass[j]) || breakF) {
for (int u = 1; u <= 4; j += 2, u++) {
bitset<64> pr(mass[j + 1]);
a = (pr = NullBIT(pr)).to_ulong();
a = ((pr = NullBIT(pr)) | (offset = Smesch(prover <<= (9 * (u - 1))))).to_ulong();
if (u == 4) {
bitset<64> prover(mas3[i]);
a = (offset = Smesch(prover <<= 38)).to_ulong();
cout << (pr.to_ulong() + a);
}
else
if (!(a == mass[j + 2])) {
cout << endl << "!!!" << "fault" << "!!!" << endl; j = j - 2 * (u - 1); breakF = true; break;
}//if SECOND
}
if (!breakF) { j = j - 6; breakF = true; }
break;
}
else { cout << endl << "!!!" << "fault" << "!!!" << endl; }
}
}
//system("PAUSE");
return 0;
}
bitset<64> PLM4(bitset<64> bit)
{
bit <<= 15;
bit >>= 53;
return bit;
}
bitset<64> Smesch(bitset<64> bit)
{
bit <<= 15;
bit >>= 53;
return bit;
}
bitset<64> NullBIT(bitset<64> bit)
{
bit >>= 12;
bit <<= 12;
return bit;
}
/*
bool WordCount(char str[])
{
int space = 0;
bool DVA = false;
for (int i = 1; i <= strlen(str); i++)
{
if (str[i] == ' ')
{
space++;
}
}
if ((space + 1) >1) { DVA = true; }
return DVA;
}
*/
Ссылка на задачу: https://stepik.org/lesson/44327/step/15?unit=22137
Пишет ошибку, но не пойму как её исправить? Может кто из профи знает?
есть функция, возвращающая string а её результат нужно внести в QListWidget который принимает на вход QSringListна обычный оператор = между string и QString компилятор...