我使用的结构如
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)
函数中重用它,我怎么能这样做?
答案 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的); }