Обновить `символ*`

У меня есть класс, содержащий несколько переменных char*:

char* msgTopic     = "myHome/MSGS";
char* groupTopic   = "myHome/All";
char* errorTopic   = "myHome/Err";

но я хочу, чтобы он был определен вне класса, а не жестко запрограммирован (обновляйте только prefixTopic вне класса,

char* prefixTopic  = "myHome";
char* msgTopic     = ""; // also tried-->  char* msgTopic = "AAAAAAAAAAA";
char* groupTopic   = "";
char* errorTopic   = "";

а затем вниз по коду, чтобы определить его как:

sprintf(msgTopic  ,"%s/Messages",prefixTopic);
sprintf(groupTopic,"%s/All",prefixTopic);
sprintf(errorTopic,"%s/Errors",prefixTopic);

НО

в обоих случаях (при определении переменных как "" или просто заполнении их символами для выделения места) темы определялись с ошибками (чаще всего одна переменная содержала обе темы).

Будем признательны за любую помощь (я не думаю, что контекст класса имеет значение)

, 👍0

Обсуждение

Не дубликат, а ответы на «устаревшее преобразование строковой константы в 'char*'» должны предоставить ответ, который вы ищете (и многое другое)., @Edgar Bonet


1 ответ


Лучший ответ:

2

Во-первых, вы должны подумать об использовании динамических или предварительно выделенных строк. Динамическая память не рекомендуется для Arduino, поэтому я буду использовать предварительно выделенные строки.

В таком случае нужно подумать о максимальной длине, я пока возьму 32:

#include <stdio.h>

class YourClass
{
  static const int MaxTopicLength = 32;

  char _msgTopic[MaxTopicLength];
  char _groupTopic[MaxTopicLength];
  char _errorTopic[MaxTopicLength];

  void FillStrings(const char* prefixTopic);
};

Затем создайте в своем классе функцию для заполнения строк (не проверено):

void YourClass::FillStrings(const char* prefixTopic)
{
  snprintf(_msgTopic  , MaxTopicLength, "%s/Messages", prefixTopic);
  snprintf(_groupTopic, MaxTopicLength, "%s/All"     , prefixTopic);
  snprintf(_errorTopic, MaxTopicLength, "%s/Errors"  , prefixTopic);
}
,