我有一堆位集<32>作为我的程序中的全局变量,我想在将其中一个的指针传递给函数后更新它们。
下面是一个例子:
#include<bits/stdc++.h>
using namespace std;
bitset<32> zero(0);
bitset<32> ra(0);
bitset<32> sp;
bitset<32> gp;
bitset<32> tp(0);
bitset<32> t0(0);
bitset<32> t1(0);
void LUI(bitset<32>*rd, int imm){
bitset<32> temp(imm);
for(int i=31; i>=12; i--){
*rd[i]=temp[i];
}
for(int i=11; i>=0; i--){
*rd[i]=0;
}
}
例如,我如何通过函数LUI()更新t1,因为解引用不起作用?以下是我得到的错误:
error: no match for 'operator*' (operand type is 'std::bitset<32>')
46 | *rd[i]=0;
note: candidate expects 2 arguments, 1 provided
46 | *rd[i]=0;
2条答案
按热度按时间j2qf4p5b1#
函数
LUI
本身没有意义。我想它只是作为一个使用下标运算符和位集的例子提供的。不过,您可以通过引用向函数传递位集,而不是通过指针传递它们至于你的问题
或
你必须写
或
代码的问题在于下标运算符的优先级高于解引用运算符。
tp5buhyn2#
只是详细说明一下评论和问题的另一个答案。
要直接解决您的问题而不做其他更改,您需要像这样将取消引用 Package 在括号中:
(*rd)[i]
。至于为什么你需要这样做,它归结为cpp中的运算符优先级(https://en.cppreference.com/w/cpp/language/operator_precedence),[](下标)在 * 间接(解引用)之前求值,因为这种情况,你需要显式地告诉编译器你想先做什么,因为否则你直接在一个整数指针上调用下标运算符。在评论中提出的一个建议是不要使用<bits/stdc++.h>。如果你正在做一些像竞争性编程这样的事情,你才真正想使用它,因为它不是CPP标准的一部分;当你使用它的时候,你不能保证它能在除了gcc之外的所有或任何编译器上工作。
另一个问题是,包含不必要的头文件会降低编译速度。
一个个人建议(在另一个答案中提到)是不要使用指针,而是考虑使用引用而不是指针,这将消除任何运算符优先级问题,同时仍然获得不复制内存的能力。下面是带有引用的函数: