【问题标题】:How do I access boolean array from another function? c++如何从另一个函数访问布尔数组? 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){}
  • 您是否尝试过通过指针访问它。您还可以将数组大小作为另一个函数参数传递。

标签: c++ function reference


【解决方案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 i{0}; 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】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-10-23
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多