【问题标题】:Trouble declaring an array using symbolic constant使用符号常量声明数组时遇到问题
【发布时间】:2015-08-21 21:57:36
【问题描述】:

这段代码不会编译:

#ifndef RemoteControl_h
#define RemoteControl_h

#include "Arduino.h"

class RemoteControl
{
    public:
        RemoteControl();
        ~RemoteControl();

        static void prev_track();
        static void next_track();
        static void play_pause_track();
        static void mute();
        static void vol_up();
        static void vol_down();

        void respond(int code);
        void add_code(int code, void (*func)());
    private:
        boolean active = true;
        struct pair {
            int _code;
            void (*_func)();
        };
        const int max = 1000;
        int database_length = 0;
        pair database[max]; //This line doesn't compile unless I use a literal constant instead of "max"

};
#endif

但是如果我将下面的部分放在类的构造函数中,它就可以正常工作。

const int max = 1000;
int database_length = 0;
pair database[max];

我是否不允许在 C++ 中的类中声明数组并使用虚拟常量作为长度?如果这有所作为,我正在使用 arduino,但我希望我不了解 c++ 语言的某些内容,因为这是一个标准的 .h 文件。哦,问题不在于 .cpp 文件,因为我完全删除了它,结果相同:编译时使用文字常量长度而不是虚拟常量长度。

【问题讨论】:

    标签: c++ arduino


    【解决方案1】:

    在 C 或 C++ 中,尝试在 stdlib.h 中使用 malloc(),在 c++ 中使用 cstdlib。别忘了free()

    const int max = 1000;
    struct pair *ptr = malloc(sizeof(pair) * max); // allocated 1000 pairs
    free(ptr); // when the amount of memory is not needed anymore
    

    【讨论】:

    • arduino 至少据我所知不支持使用“new”关键字。对于第一个示例,您是否建议我这样做?常量 int 最大值 = 1000; int 数据库长度 = 0; int ptr = (int) malloc(sizeof(int) * max);整数数据库[];数据库 = ptr;
    • 我对此有点生疏。基本上我将偏移量添加到 ptr 然后取消引用并分配给那个对吗?像这样将 3 分配给索引 2?:*(ptr+2) = 3
    • *(ptr+2) = 3ptr[2] = 3 相同。您可以像使用数组一样使用和处理它。 @j_v_wow_d
    • 太棒了。我只需要在我的析构函数中使用“free(ptr)”,我应该很好去吧?
    • 当你不再需要内存(分配)时销毁它。是的。 @j_v_wow_d
    【解决方案2】:

    让我先为你澄清几件事。

    1. C 中,const 变量被视为const-qualified,它不是编译时常量值(与整数文字不同,它是编译时常量值)。因此,按照正常数组大小规范的规则,在这种情况下,您甚至不能使用 const 变量。

    2. C 中,我们可能规定使用VLA,这使我们能够使用pair database[max] 之类的语法,即使max 不是const 变量但这又是编译器的一些可选功能(根据C11)。

    3. C++中,我们可以使用const变量作为数组的大小,如C++中,const变量是编译时间常数。

    所以,回答你的问题:

    • C 中,如果您的编译器支持VLA,您的代码就可以了。即使max 不是const
    • C++ 中没有 VLA,但它也许支持作为 gnu 扩展。如果maxconst 就可以了。

    【讨论】:

    • Arduino 的编译器在类主体中不支持它,但它在构造函数中工作。
    【解决方案3】:

    最简单的解决方法是采取

    const int max = 1000;
    

    走出班级,放在班级之上。

    最好确保它是一个编译时常量,如下所示:

    constexpr int max = 1000;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 2013-02-25
      • 2014-08-12
      • 1970-01-01
      • 2020-05-23
      • 2019-01-24
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多