如何从另一个函数访问布尔数组? C++

Posted

技术标签:

【中文标题】如何从另一个函数访问布尔数组? C++【英文标题】:How do I access boolean array from another function? c++ 【发布时间】:2022-01-18 16:32:11 【问题描述】:

我有问题。我需要创建一个代码,我可以在其中从另一个函数访问 bool 数组信息,编辑数组,然后将其发回。我需要使用一个变量作为数组的大小。

全局变量不是一个选项。

我尝试通过引用传递它并使用结构。

代码示例:

void x(bool (&reserved[sizeOfArray)) 
    if (reserved[1] == true) 
          cout << "it's true";

    

main() 

int sizeOfArray = 6;
bool reserved[sizeOfArray];

x(reserved[sizeOfArray];

编辑:数组的大小在程序已经运行时确定

【问题讨论】:

这不是有效的 C++ 代码。 如果数组大小需要是一个变量,那么你最好的选择是std::vector,C++不支持变长数组 数组的名称是“reserved”,而不是“reserved[sizeOfArray]”。 reserved[sizeOfArray] 将是 bool,如果它存在的话。 如果你想使用最易读的 C++ 语法:std::array reserved; void x(std::array& reserved) 您是否尝试过通过指针访问它。您还可以将数组大小作为另一个函数参数传递。 【参考方案1】:

您可以将boost::dynamic_bitset 用于布尔的动态向量。 [Demo]

#include <boost/dynamic_bitset.hpp>
#include <iostream>  // cout

void x(const boost::dynamic_bitset<>& reserved) 
    if (reserved[1] == true) 
          std::cout << "it's true\n\n";
    
    for (int i0; i < reserved.size(); ++i)
    
        std::cout << "Bit " << i << ": " << reserved[i] << "\n";
    


int main() 
    int sizeOfArray = 6;
    boost::dynamic_bitset<> reserved(sizeOfArray, 0b111010);
    x(reserved);

【讨论】:

【参考方案2】:

你可以把它做成一个函数模板,以数组大小作为模板参数:

#include <iostream>

template<size_t N>
void x(bool (&reserved)[N]) 

    // make sure that the array size is at least 2 to not get out of
    // bounds access in reserved[1]:

    if constexpr (N >= 2)     
        if (reserved[1] == true) 
            std::cout << "it's true\n";
        
    
    

int main() 
    constexpr size_t sizeOfArray = 6; // must be a constant expression
    
    bool reserved[sizeOfArray]false,true; // rest will be false

    x(reserved);

输出:

It's true

【讨论】:

使用 std::span 怎么样? @vikram 当然,这也可以,但上面的内容非常接近 OP 在他/她的代码中已经包含的内容——无论好坏。 我同意这一点,我喜欢你的回答。但是 std::span 使代码不那么令人生畏和更清晰。也许只是个人意见。 @vikram 我也喜欢span 方法。哦,你添加了一个答案。在这里,有一个upvote :)【参考方案3】:

我认为轻量级的方法是使用 std::span 代替。

#include <iostream>
#include <span>

void x(std::span<bool> reserved) 
    reserved[1] = false;
    

int main() 

    constexpr size_t sizeOfArray = 6;
    bool reserved[sizeOfArray]false, true;

    x(reserved);

    if (reserved[1] == false) 
        std::cout << "Hello!" << std::endl;
    

【讨论】:

【参考方案4】:

如果大小仅在运行时确定,您基本上有两种选择:

    使用动态大小的容器,例如std::vector

    void x(std::vector&lt;bool&gt;&amp; reserved)

    使用“C 方法”将指向数组第一个元素的指针与数组大小一起传递void x(bool reserved[], size_t size)

可能的第三个选项是在数组中最后一个“哨兵”值(如 C 字符串)不适用于 bool,因为您只有两个值可供选择。

【讨论】:

以上是关于如何从另一个函数访问布尔数组? C++的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类访问列表的长度

从另一个类 c++ 访问 UI 元素

c ++从另一个类语法访问类字段

如何从另一个类访问函数?

如何使用 async/await 从另一个函数访问请求的正文?

如何从另一种方法访问 tableviewCell 中的文本字段