我做了一些谷歌搜索,我无法找到解决问题的方法。我不确定我是否试图在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()宏或使用列表初始化器的事实有关?我的类不是模板,所以我不确定“模板参数列表”部分是否适用?
由于
答案 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}}