Функции с картой в качестве параметра не работают - PullRequest
0 голосов
/ 15 ноября 2018

По какой-то причине все функции в моей программе с картой в качестве параметра не работают. Эта функция вызывает их все (pageAndTimestamp - это struct btw):

void fifo(int framesize, int numref, int* pagestream)
{
  double hit = 0, size = numref;

  map<int, pageAndTimestamp> frames = frameMaker(framesize);

  for (int time = 0; time < numref; time++)
  {
    if (pageLoaded(pagestream[time], frames))
    {
      hit++;
      output(time, pagestream[time], size, hit, frames);
    }
    else
    {
      int loc = findPageToReplace(frames);
      replacePage(loc, pagestream[time], time, frames);
      output(time, pagestream[time], size, hit, frames);
    }
  }
}

Это функции, которые не работают должным образом:

bool pageLoaded(int page, map<int, pageAndTimestamp> m)
{
  for (const auto& it : m)
  {
    if (it.second.a[0] == page)
    return true;
  }
  return false;
} 

int findPageToReplace(map<int, pageAndTimestamp> m)
{
  int timestamp = INT_MAX;
  int replaceLoc = 0;
  for (const auto& it : m)
  {
    if (it.second.a[1] == -1)
    return it.first;
    else
    {
      if (it.second.a[1] < timestamp)
      {
        timestamp = it.second.a[1];
        replaceLoc = it.first;
      }
    }
  }
  return replaceLoc;
}

void replacePage(int loc, int page, int time, map<int, pageAndTimestamp> m)
{
  m.at(loc).a[0] = page;
  m.at(loc).a[1] = time;
} 

void output(int t, int p, double s, double h, map<int, pageAndTimestamp> m)
{
  cout << "Time: " << t << endl << "Page: " << p << endl;
  for(const auto& it : m)
    cout << "Frame" << it.first << ": " << it.second.a[0] << endl;
  cout << "Hit ratio: " << h << " / " << s << " (" << h / s << ")" << endl 
 << endl << endl;
}

Когда я запускаю программу в отладчике Visual Studio 2017, когда я вхожу в любую из вышеперечисленных функций, отладчик переносит меня к заголовку этой функции в стандартном заголовке карты:

map(const map& _Right)
    : _Mybase(_Right, _Alnode_traits::select_on_container_copy_construction(_Right._Getal()))
    {   // construct map by copying _Right
    }

Я не знаю, в чем проблема или почему отладчик выводит меня на этот заголовок функции. Как мне это исправить?

1 Ответ

0 голосов
/ 15 ноября 2018

Функция replacePage, например, определяется как:

void replacePage(int loc, int page, int time, map<int, pageAndTimestamp> m)

Эта функция принимает карту как значение , а не как ссылку или указатель.Таким образом, когда вы вызываете его следующим образом:

replacePage(loc, pagestream[time], time, frames);

, тогда карта frames копируется в переменную m в вашей функции.Вот почему, например, отладчик переносит вас в конструктор копирования для карты.

Кроме того, это означает, что код replacePage

  m.at(loc).a[0] = page;
  m.at(loc).a[1] = time;

вносит изменения в копию из frames, а не frames.

Возможно, вам нужны функции с сигнатурами вида:

bool pageLoaded(int page, const map<int, pageAndTimestamp>& m)
int findPageToReplace(const map<int, pageAndTimestamp>& m)
void replacePage(int loc, int page, int time, map<int, pageAndTimestamp>& m)
void output(int t, int p, double s, double h, const map<int, pageAndTimestamp>& m)

, в которых большинство функций принимают постоянную ссылку, тогда как replacePage требует (неконстантную) ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...