在C++中处理指向位集的指针

vaqhlq81  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(679)

我有一堆位集<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;
j2qf4p5b

j2qf4p5b1#

函数LUI本身没有意义。我想它只是作为一个使用下标运算符和位集的例子提供的。不过,您可以通过引用向函数传递位集,而不是通过指针传递它们

void LUI(bitset<32> &rd, int imm);

至于你的问题

*rd[i]=temp[i];

*rd[i]=0;

你必须写

( *rd )[i]=temp[i];

( *rd )[i]=0;

rd->operator []( i ) = temp[i];
rd->operator []( i ) = 0;

代码的问题在于下标运算符的优先级高于解引用运算符。

tp5buhyn

tp5buhyn2#

只是详细说明一下评论和问题的另一个答案。
要直接解决您的问题而不做其他更改,您需要像这样将取消引用 Package 在括号中:(*rd)[i]。至于为什么你需要这样做,它归结为cpp中的运算符优先级(https://en.cppreference.com/w/cpp/language/operator_precedence),[](下标)在 * 间接(解引用)之前求值,因为这种情况,你需要显式地告诉编译器你想先做什么,因为否则你直接在一个整数指针上调用下标运算符。
在评论中提出的一个建议是不要使用<bits/stdc++.h>。如果你正在做一些像竞争性编程这样的事情,你才真正想使用它,因为它不是CPP标准的一部分;当你使用它的时候,你不能保证它能在除了gcc之外的所有或任何编译器上工作。
另一个问题是,包含不必要的头文件会降低编译速度。
一个个人建议(在另一个答案中提到)是不要使用指针,而是考虑使用引用而不是指针,这将消除任何运算符优先级问题,同时仍然获得不复制内存的能力。下面是带有引用的函数:

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; 
    }
}

相关问题