Инициализация массива
Причина, по которой ваш код не компилируется, состоит в том, что элемент ssid
в структуре wifi_config_sta_t
имеет тип array - и массивы могут быть инициализированы только из строкового литерала или в скобках список. См. здесь для объяснения. Вы пытаетесь инициализировать его из другой переменной массива, что недопустимо.
Следующие инициализации, например, допустимы.
char ssid1[32] = "My WiFi"; // from string literal -> okay
// from brace-enclosed list -> okay
char ssid2[32] = {'M', 'y', ' ', 'W', 'i', 'F', 'i'};
Это, с другой стороны, не является:
char ESP_SSID[32] = "My WiFi";
// won't work - ESP_SSID is not a string literal
char ssid[32] = ESP_SSID; // ILLEGAL
потому что ESP_SSID
не является константным выражением.
Этот ответ на аналогичный вопрос по SO дает дополнительные примеры.
Препроцессор и константные выражения
Обратите внимание, что
#define ESP_SSID "AccessPoint"
// etc.
char ssid[32] = ESP_SSID;
совпадает с
char ssid[32] = "AccessPoint";
Т.е. любые экземпляры в коде ESP_SSID
заменяются строковым литералом "AccessPoint"
на этапе предварительной обработки. Вот почему использование #define
подходит для вашего приложения - вы просто инициализируете массив, используя строковый литерал.
Назначение массива
Если вы хотите обновить SSID и пароль во время выполнения, одним из вариантов является инициализация массива при запуске с нуля, а затем используйте strcpy()
для обновления значений по мере необходимости.
wifi_config_t wifi_config = {0}; // Zero initialize all struct memberes
strcpy((char *)wifi_config.sta.ssid, ESP_SSID);
strcpy((char *)wifi_config.sta.password, ESP_PASS);
Обратите внимание, что необходимо привести uint8_t *
к char *
из-за параметров компиляции, используемых в процессе сборки ESP IDF.