Как использовать структуру в нескольких функциях - PullRequest
0 голосов
/ 03 июня 2011

Я использую такую ​​структуру, как

  struct IF_ID {
   int PC;
   string instruction;
   };

, а затем в

    int main()
    {
     IF_ID stage1;
     stage1.PC=0;
     FETCH(stage1);
     DECODE(&stage1);
     return 0;
     }

Когда я передаю stage1 в функции FETCH(stage1), она работает нормально, вещьявляется то, что мне нужно, чтобы значения, вычисленные в FETCH(stage1), использовались снова во второй функции DECODE(stage1), поэтому, если stage1.PC равен 5, например, мне нужно повторно использовать его в функции DECODE(stage1), какя могу это сделать ??

Ответы [ 5 ]

3 голосов
/ 03 июня 2011

Вы передаете структуру в FETCH () по значению.
Это означает, что оно скопировано для функции.

Если вы хотите передать фактическую структуру, вам нужен метод, чтобы получить ее указатель или ссылку:

По ссылке:

void FETCH(IF_ID& ref_stage);

указатель на структуру:

void FETCH(IF_ID* ref_stage);

Если вы используете ссылку, семантика внутренней функции не изменится.

0 голосов
/ 03 июня 2011

Yochai Timmer и некоторые другие ответы верны, но также подумайте о том, чтобы превратить вашу структуру в класс и сделать эти функции членами класса, так как они в основном работают с ним.Тогда код будет выглядеть примерно так:

int main()
{
  IF_ID stage1;
  stage1.PC=0;
  stage1.FETCH();
  stage1.DECODE();
}

Однако, если FETCH не использует ни одно из значений IF_ID, кроме ПК, и в зависимости от того, как организован ваш код, может быть еще понятнее заставить FETCH построить объектвместо того, чтобы передавать пустой объект. Например, что-то вроде:

struct IF_ID {int PC;строковая инструкция;IF_ID (): PC (0) {} // Убедитесь, что по умолчанию PC = 0};

IF_ID Fetch () {IF_ID stage1;// делать выборки и помещать их в stage1 return stage1;// Если IF_ID - большой класс, дорогой для копирования, // убедитесь, что ваш компилятор поддерживает "именованную возвращаемую // оптимизацию значения", т.е.не создает // лишнюю копию между переменной-членом // и возвращаемым значением.}

int main () {IF_ID stage1 = Fetch ();Декодирование (stage1);} * +1010 *

0 голосов
/ 03 июня 2011

Не совсем уверен, что вы пытаетесь сделать, но позвольте мне догадаться.

У вас есть тип и две функции (FETCH и DECODE), которые работают с входным параметром этого типа.Первая функция изменяет входной параметр, и вы хотите, чтобы измененные значения использовались в качестве входных данных для второй функции.

Возможно, вам следует объявить функции как (давайте назовем ваш тип T, поскольку это, вероятно, применимо к любомутип или класс).

void FETCH(T &x);

Таким образом, параметр x типа T передается по ссылке.Изменения, выполненные в теле функции, будут влиять на результат вне функции.

Тогда вы можете объявить вторую функцию как:

void DECODE(const T &y);

Здесь вывы снова передаете сложный тип по ссылке, но на этот раз вы обещаете, что не собираетесь его модифицировать (const).

0 голосов
/ 03 июня 2011

Решение состоит в том, чтобы передать stage1 в качестве ссылки на функцию FETCH().Сигнатура функции должна выглядеть так:

void FETCH(IF_ID& stage);

или примерно так:

void FETCH(IF_ID* stage);

, в последнем случае вызов функции также требует знака амперсанда перед параметром:

FETCH(&stage1);
0 голосов
/ 03 июня 2011

Если вы хотите, чтобы FETCH изменил значение параметра, он должен принять либо ссылку, либо указатель на вашу структуру в качестве параметра. Или он может вернуть экземпляр IF_ID.

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