Семантика локальной PROGMEM

Я хочу создать класс, чтобы лучше использовать строки во flash. В основе его лежит

template<size_t N>
struct progstr
{
    constexpr progstr(const char (&str)[N])
        : progstr(str, make_index_sequence<N> {}) {}

    template<size_t... Is>
    constexpr progstr(const char (&str)[N], index_sequence<Is...>)
        : _str{str[Is]...} {}

    constexpr operator const char*() const {
        return _str;
    }

    const char _str[N] PROGMEM;
};

Где make_index_sequence и index_sequence тот же , что и у <utility>

Проблема возникает, когда я пытаюсь подражать PSTR

template<size_t N>
constexpr const char* pstr(const char (&str)[N])
{
    return progstr<N>{str};  // huh?
}

Он даже компилируется. Однако

  • Возвращаемый указатель «висит», но он указывает на флэш-память. Будет ли это работать?

  • Функция A constexpr может вызываться с массивом со значениями времени выполнения и не может создать строку во флэш-памяти это?

c++
1 голос | спросил Passer By 21 MarpmWed, 21 Mar 2018 20:06:58 +03002018-03-21T20:06:58+03:0008 2018, 20:06:58

1 ответ


2

Я тестировал 100 строк символов

const char *

Sketch uses 1566 bytes
Global variables use 288 bytes

с макросом F

Sketch uses 1594 bytes
Global variables use 188 bytes

progstr <101> пс (...

Sketch uses 1618 bytes 
Global variables use 288 bytes

const char * ps = pstr ("...

Sketch uses 1502 bytes 
Global variables use 188 bytes

строка версии pstr имеет ошибки в конце, когда печатается.

извините, функция pstr работает только в том случае, если предыдущая версия эскиза помещает строку во флэш-память. это не в шестнадцатеричном файле.

ответил Juraj 21 MarpmWed, 21 Mar 2018 21:32:15 +03002018-03-21T21:32:15+03:0009 2018, 21:32:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132