Arduino / c ++ - 使用F()宏将PROGMEM字符串传递给类

时间:2016-12-10 12:25:11

标签: c++ compiler-errors arduino

我做了一些谷歌搜索,我无法找到解决问题的方法。我不确定我是否试图在c ++中不正确地使用F()宏,或者我是否误解了一些基本的东西。

arduino IDE包含一个库WString.h,它有一些宏和其他函数,有助于在PROGMEM而不是SRAM中放置字符串。

我正在尝试创建一个类,该类包含指向PROGMEM中使用F()宏传递的字符串的指针。

我创建了一个小例子程序来测试它。该程序创建一个测试类的新实例,其目的是打印出PROGMEM字符串。

class FTester{
  private:
    const __FlashStringHelper* Label;

  public:
    FTester(const __FlashStringHelper* _Label): Label(_Label){};
    void print(){ Serial.println(Label); };
};

我的主程序然后只是创建我的类的新实例,并调用print函数:

FTester FS(F("FString-TestingTesting123"));

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  FS.print();
}

此代码无法编译,我收到以下错误:

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,
                 from sketch\FTester.ino.cpp:1:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: statement-expressions are not allowed outside functions nor in template-argument lists
 #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
                                                                          ^
C:\Users\Nick1\Desktop\FTester\FTester.ino:11:12: note: in expansion of macro 'F'
 FTester FS(F("FString-TestingTesting123"));
            ^

exit status 1

对我来说突出的一件事是错误的一部分,即“不允许外部函数或模板参数列表”。

这是否与我在构造函数中使用F()宏或使用列表初始化器的事实有关?我的类不是模板,所以我不确定“模板参数列表”部分是否适用?

由于

2 个答案:

答案 0 :(得分:0)

您需要直接使用PROGMEM。 F()宏是需要函数的代码。

然后,您可以在需要时将char指针强制转换为__FlashStringHelper*

class FTester{
  private:
    const char* Label;

  public:
    FTester( const char *pstr ): Label(pstr){};
    void print(){ Serial.println( (const __FlashStringHelper*) Label ); };
};


const char str[] PROGMEM = "FString-TestingTesting123";

FTester FS(str);

void setup() {
  Serial.begin(9600);
}

void loop() {
  FS.print();
}

编辑:

哦,以上是如果FS是一个全局变量,就像你的例子一样,你可以做到这一点。如果它是局部变量,则可以使用F()宏。

 class FTester{
  private:
    const __FlashStringHelper* Label;

  public:
    FTester( const __FlashStringHelper* pstr ): Label(pstr){};
    void print(){ Serial.println( Label ); };
};

void setup() {
  Serial.begin(9600);
}

void loop() {
  FTester FS(F("FString-TestingTesting123"));
  FS.print();
}

答案 1 :(得分:-2)

非常感谢您的帮助。事实证明我希望我的代码使用全局变量编写的方式。我还想将字符串作为一个段传递,而不是定义一个单独的变量。

我最终采用了一种不同的方法,将信息存储在对象构造函数中的PROGMEM中。这具有将数据存储到PROGMEM并保存SRAM所需的效果。

{{1}}