Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在编译时存储默认值的优雅而高效的方法?_C++_Time_Parameters_Compilation_Default - Fatal编程技术网

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

C++ 在编译时存储默认值的优雅而高效的方法?,c++,time,parameters,compilation,default,C++,Time,Parameters,Compilation,Default,编辑:我现在明白发生了什么。当我在一个标签上添加一个字符(一个字节)(将“White Oyster Cultation”更改为“White Oyster CultationX”)时,Arduino IDE告诉我动态内存正在使用另外两个字节,这一事实让我产生了在RAM中复制类及其实例化的想法,所以我假设一个是给班级的,另一个是给公寓的 由于某些原因,String.h中的字符串似乎一次分配2个字节,因此一个字符串的大小为2,两个字符串的大小为2,三个字符串的大小为3,依此类推。大小以偶数增长 当然,

编辑:我现在明白发生了什么。当我在一个标签上添加一个字符(一个字节)(将“White Oyster Cultation”更改为“White Oyster CultationX”)时,Arduino IDE告诉我动态内存正在使用另外两个字节,这一事实让我产生了在RAM中复制类及其实例化的想法,所以我假设一个是给班级的,另一个是给公寓的

由于某些原因,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#?

中的一个静态类一样,假设您的类增长模式确实是恒定不变的,我建议您遵循以下几点:

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

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


但是,如果程序和文件系统位于同一个有限的EPROM中,那么您就注定要失败。您必须尽可能简短。

我在这里没有看到任何重复的内容。在编译时配置文件的数量是固定的吗?如果是的话,你能把名字放进一个枚举中吗?如果是这样,您可以使用模板类。您不应该滥用类来处理属于命名空间的内容。您可以通过在成员变量和方法参数之间选择不同的名称来删除
this->
语法。@ThomasMatthews或更好:使用成员初始值设定项列表(并可以选择重命名参数)。这确实可以避免复制类的任何实例的数据,这在其他体系结构中是很好的。但实际上Arduino只有一个EPROM