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

时间:2016-10-03 22:07:46

标签: c++ time parameters compilation default

编辑:我现在明白发生了什么。当我将一个字符(一个字节)添加到其中一个标签(将“White Oyster Incubation”更改为“White Oyster IncubationX”)时,我认为该类及其实例化在RAM中是重复的。 Arduino IDE告诉我动态内存正在使用2个字节,所以我假设一个用于类,另一个用于instatiation。

事实证明,由于某种原因,String.h中的字符串似乎一次分配2个字节,因此一个字符串的大小为2,两个字符串为2,三个字符串为3,依此类推。大小增长均匀。

当然,现在我意识到该类存储在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实例将其成员作为参数传递给方法,以确定环境条件(在配置文件中设置)是否良好。

然而,在我看来,这是臃肿的,有效的数据是复制的,在类定义中,然后在实例化中。鉴于有问题的微控制器只有2K的内存...... 什么是不在最终可执行文件中复制数据的好方法?好像它是C#中的静态类?

2 个答案:

答案 0 :(得分:1)

假设您的班级GrowingProfile真的不变且不变,我会建议这些内容:

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

答案 1 :(得分:1)

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

但是,如果程序和文件系统位于相同的有限EPROM中,则注定要失败。你必须尽可能简短。