在编译时存储默认值的优雅而有效的方法?

Elegant and efficient way to store default values at compile time?

编辑:我现在明白发生了什么。当我将一个字符(一个字节)添加到其中一个标签(将 "White Oyster Incubation" 更改为 "White Oyster IncubationX"), Arduino IDE 告诉我动态内存还使用了 2 个字节,所以我假设一个用于 class,另一个用于实例化。

原来由于某种原因来自 String.h 的字符串似乎一次分配 2 个字节,所以一个字符串的大小是 2,两个字符串是 2,三个字符串是 3,等等。尺寸以偶数增长。

当然,现在我意识到 class 存储在 Arduino PROGMEM (EPROM) 中,实例化在 RAM 中,因此数据并没有真正复制到 RAM 中。

原问题如下: 我正在为 Arduino (atmega328) 制作程序,其中要控制蘑菇温室。对于蘑菇发育的不同阶段,应该存在多个温度和湿度参数配置文件。 我想在编译时保存这些配置文件,然后让 Arduino 在配置文件之间进行更改,以相应地执行操作。 我想到了这个:

class GrowingProfile
{
private:
int idealTemp; 

int idealHumi;

String label;

public:
GrowingProfile(int idealTemp,int idealHumi, String label)
{
    this->idealTemp = idealTemp;
    this->idealHumi = idealHumi;
    this->label = label;
};
//general methods
};

    class mushroomSpecies1Profiles
{
public:
 GrowingProfile incubationProfile;
 GrowingProfile fruitingProfile;

 WhiteOysterGrowingProfiles():
     incubationProfile (100, 95, "White Oyster Incubation"),
     fruitingProfile (20, 4, "White Oyster Fruiting"){}

};

然后,在主代码中,让 mushroomSpecies1Profiles 的实例将其成员作为参数传递给确定环境条件(在配置文件中设置)是否良好的方法。

但是,在我看来,这是臃肿的,因为数据实际上是重复的,在 class 定义中,然后在实例化中。考虑到有问题的微控制器只有 2K 内存...... 不在最终可执行文件中复制数据的好方法是什么?好像它是 C# 中的静态 class?

假设您的 class GrowingProfile 确实是恒定且不变的,我会推荐以下内容:

static const GrowingProfile incubationProfile (100, 95, "White Oyster Incubation");
static const GrowingProfile fruitingProfile (20, 4, "White Oyster Fruiting");

如果在程序中定义(以任何方式),字符串文字就是程序的一部分。为了避免这些文字的内存消耗,您可以将它们放在一个单独的文件中,在访问该文件时承担映射文字的成本(例如:通过整数键)。

但是,如果程序和文件系统位于同一个有限的EPROM中,那你就完蛋了。你必须尽可能简短。