【问题标题】:How to initialise a C struct array within a class如何在类中初始化 C 结构数组
【发布时间】:2017-11-21 22:30:46
【问题描述】:

我正在用 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 方式测试了代码,它似乎可以正常工作。我在语言上苦苦挣扎:(
奇怪的是我设法让这段代码以某种方式工作,很兴奋,删除了一些代码,然后它就停止了工作。我知道我很接近了!

谢谢!

【问题讨论】:

  • 你确定这是 C 吗? C 没有类。
  • “删除了一些代码,然后它停止工作”。查看版本控制。
  • 我没有在它工作的时候检查它:(
  • menuItem_t _items[]; 是 C++ 中的错误。您应该在该点指定尺寸
  • @MrMase 我怀疑它会创建一个除 0 以外的任何大小的“空白结构数组”

标签: c++ arrays struct arduino initialization


【解决方案1】:

你有两个问题。首先,你没有给你的数组一个维度。这是一个零长度数组,在标准 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++,但是一般不推荐动态分配)。

【讨论】:

  • 谢谢弗雷德!这很好用,但我决定实施我发布的答案中概述的方法(即将数组定义为静态)。通过使用这种方法,我不需要指定数组大小,这很好,因为有一些项目。
【解决方案2】:

经过几天的努力,我决定让数组成为私有静态成员。这解决了我遇到的初始化问题,我不必指定数组中的元素数量。

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

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2010-09-23
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多