如何在类中初始化C struct数组

时间:2017-11-21 22:30:47

标签: c++ arrays struct arduino initialization

我正在用C编写一个Arduino库,而我正在努力如何初始化一组结构。

我目前将此作为我的Menu.h文件

#ifndef MENU_H
#define MENU_H

#if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
#else
    #include "WProgram.h"
#endif

struct menuItem_t {
    char heading[16];
    char item[16];
    configItem_t* configItem;
};

class menu_t {
    public:
        menu_t();
        void test();
        menuItem_t _items[];
    private:

};

#endif

Menu.cpp文件中,我尝试了各种方法来初始化此数组,但似乎都没有工作(即数组从未填充)

#include "Menu.h"

menu_t::menu_t(){

}

void menu_t::test(){
    Serial.println("test:");
    Serial.println((sizeof(_items)/sizeof(_items[0])));
    Serial.println("first heading:");
    Serial.println(_items[0].heading);
}

menuItem_t _items[] = { 
    {"TIME", "", NULL},
    {"H", "Hour", NULL},
    {"M", "Minute", NULL},
};

此测试始终返回BLANK sketch.ino

#include "Menu.h"

menu_t m;

void setup(){
    Serial.begin(115200);
    Serial.println("Started...");
    m.test();
}

void loop(){

}

我已经以非OO方式测试了代码,它似乎工作正常。我正在努力学习语言:(
奇怪的是我设法让这些代码以某种方式工作,兴奋,删除了一些代码,然后它停止了工作。我知道我已经关闭了!

谢谢!

2 个答案:

答案 0 :(得分:0)

经过几天敲击我的头脑以使其工作我决定让阵列成为私人静态成员。这解决了我遇到的初始化问题,我不必指定数组中的元素数量。

#ifndef MENU_H
#define MENU_H

#if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
#else
    #include "WProgram.h"
#endif

struct menuItem_t {
    char heading[16];
    char item[16];
    configItem_t* configItem;
};

class menu_t {
    public:
        menu_t();
        void test();
    private:
        static menuItem_t _items[];
};

#endif

这是.cpp

#include "Menu.h"

menu_t::menu_t(){

}

void menu_t::test(){
    Serial.println("test:");
    Serial.println((sizeof(_items)/sizeof(_items[0])));
    Serial.println("first heading:");
    Serial.println(_items[0].heading);
}

menuItem_t menu_t::_items[] = { 
    {"TIME", "", NULL},
    {"H", "Hour", NULL},
    {"M", "Minute", NULL},
};

答案 1 :(得分:0)

你有两个问题。首先,您没有为数组提供维度。这是一个零长度数组,在标准C ++中是不允许的,但允许作为许多编译器的扩展。这不为数组分配空间,但假设您将使用类或结构作为覆盖来解释正确分配的足够大小的内存。你没有做这样的分配。

其次,您尝试初始化并不是初始化您的成员变量,而是创建一个单独的数组。

要更正代码,必须为数组提供维度,并在构造函数中使用成员初始值设定项。这是一个例子,但是使用标准C ++,因为我没有Arduino C ++。我不能保证它对Arduino有用,但它至少应该让你更接近:

#include <iostream>

struct configItem_t;

struct menuItem_t {
    char heading[16];
    char item[16];
    configItem_t* configItem;
};

class menu_t {
    public:
        menu_t();
        void test();
        menuItem_t _items[3];
    private:

};

menu_t::menu_t() :
        _items{
          { "TIME", "", NULL },
          { "H", "Hour", NULL },
          { "M", "Minute", NULL }
        }
{
    // Empty implementation
}

void menu_t::test(){
//    Serial.println("test:");
//    Serial.println((sizeof(_items)/sizeof(_items[0])));
//    Serial.println("first heading:");
//    Serial.println(_items[0].heading);
    std::cout << "test:\n";
    std::cout << (sizeof(_items)/sizeof(_items[0])) << '\n';
    std::cout << "first heading:\n";
    std::cout << _items[0].heading << '\n';
}

//menuItem_t _items[] = {
//    {"TIME", "", NULL},
//    {"H", "Hour", NULL},
//    {"M", "Minute", NULL},
//};

int main()
{
    menu_t m;
    m.test();
}

输出:

test:
3
first heading:
TIME

如果你真的不知道运行时需要的大小数组,你必须使用动态分配newmalloc(我的谷歌搜索表明new确实是可以使用Arduino C ++,但通常不建议使用动态分配。