如何在多个函数中使用结构

时间:2011-06-03 15:25:28

标签: c++ function struct

我使用的结构如

  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 个答案:

答案 0 :(得分:3)

您正在通过值将结构传递给FETCH() 这意味着该函数已被复制。

如果希望传递实际的结构,则需要该方法来接收其指针或引用:

参考:

void FETCH(IF_ID& ref_stage);

指向struct的指针:

void FETCH(IF_ID* ref_stage);

如果通过引用使用,则内部函数语义不会改变。

答案 1 :(得分:0)

如果希望FETCH更改参数值,它应该接受引用或指向结构的指针作为参数。或者它可以返回实例IF_ID

答案 2 :(得分:0)

解决方案是将stage1作为对FETCH()函数的引用。函数签名应如下所示:

void FETCH(IF_ID& stage);

或者像这样:

void FETCH(IF_ID* stage);

在后一种情况下,函数调用还需要在参数前面加上符号符号:

FETCH(&stage1);

答案 3 :(得分:0)

不完全确定你要做什么,但让我猜。

您有一个类型和两个函数(FETCH和DECODE),它们对该类型的输入参数进行操作。第一个函数修改输入参数,您希望修改后的值用作第二个函数的输入。

可能你应该将函数声明为(让我们调用你的类型T,因为这可能适用于任何复杂的类型或类)。

void FETCH(T &x);

这样,类型T的参数x通过引用传递。在函数体内执行的修改将影响函数的外部

然后你可以将第二个函数声明为:

void DECODE(const T &y);

这里你再次通过引用传递复杂类型,但这次你承诺你不会修改它(const)。

答案 4 :(得分:0)

Yochai Timmer和其他几个人的回答是正确的,但也考虑将你的结构化成一个类,并使这些函数成为类的成员,因为它们主要是在它上面运行。然后代码看起来像:

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

但是,如果FETCH不使用除PC之外的IF_ID值,并且取决于代码的组织方式,那么使FETCH构造对象可能更加清晰,而不是传入“空”对象。例如,像:

struct IF_ID {     int PC;     字符串指令;     IF_ID():PC(0){} //确保默认值为PC = 0   };

IF_ID Fetch(){     IF_ID stage1;     //取东西并把它放在stage1中     返回阶段1; //如果IF_ID是要复制的大类,                    //确保您的编译器支持“命名返回                    //值优化“,即不产生                    //成员变量之间的多余副本                    //和返回值。   }

int main(){     IF_ID stage1 = Fetch();     解码(stage1的);   }