首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C动态构造联合

用C动态构造联合
EN

Stack Overflow用户
提问于 2022-10-14 09:10:26
回答 3查看 81关注 0票数 -1

我正在尝试用ESP32动态设置WIFI的配置。

取决于UUID的设备ID,我想设置SSID。

我试着把角色变量。然而,我失败了

代码语言:javascript
复制
 // Original code
   wifi_config_t ap_config =
       {
           .ap = {
               .ssid = 'WIFI_SSID', // I would like to change .ssid as variable
               .ssid_len = strlen(WIFI_AP_SSID),
               .password = WIFI_AP_PASSWORD,
               .channel = WIFI_AP_CHANNEL,
               .ssid_hidden = WIFI_AP_SSID_HIDDEN,
               .authmode = WIFI_AUTH_WPA2_PSK,
               .max_connection = WIFI_AP_MAX_CONNECTIONS,
               .beacon_interval = WIFI_AP_BEACON_INTERVAL,
           },
       };


// For example, I would like to set SSID name by using another variable
char ssid[10] = "anoter_ssid_name";

wifi_config_t ap_config =
       {
           .ap = {
               .ssid = ssid, // I would like to change .ssid as variable
               .ssid_len = strlen(WIFI_AP_SSID),
           },
       };
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-14 10:57:05

这绝对是错误的:

代码语言:javascript
复制
.ssid = 'WIFI_SSID', 

下一步:基本上,您不能在静态存储持续时间初始化器中使用not const表达式。你需要在函数中这样做。

代码语言:javascript
复制
wifi_config_t ap_config =
{
    .ap = {
        .ssid = "WIFI_SSID", // I would like to change .ssid as variable
        .ssid_len = sizeof("WIFI_SSID") - 1,
        .password = WIFI_AP_PASSWORD,
        .channel = WIFI_AP_CHANNEL,
        .ssid_hidden = WIFI_AP_SSID_HIDDEN,
        .authmode = WIFI_AUTH_WPA2_PSK,
        .max_connection = WIFI_AP_MAX_CONNECTIONS,
        .beacon_interval = WIFI_AP_BEACON_INTERVAL,
    },
};

wifi_config_t *setSSID(wifi_config_t *cfg, const char *ssid)
{
    strcpy(cfg -> ssid, ssid);
    cfg -> ssid_len = strlen(ssid);
    rerutn cfg;
}
票数 1
EN

Stack Overflow用户

发布于 2022-10-14 09:28:21

您需要复制ssid字符串,因为struct的ssid字段被声明为uint8_t [10],因此已经分配了空间。如果将上面的尝试声明为指针,您的尝试就会奏效。

代码语言:javascript
复制
strcpy(ap_config.ap.ssid, ssid);
ap_config.ap.ssid_len = strlen(ssid);
票数 1
EN

Stack Overflow用户

发布于 2022-10-14 09:30:31

如果您想初始化:

代码语言:javascript
复制
wifi_config_t ap_config =
       {
           .ap = {
               .ssid = { ssid[0], ssid[1], ssid[2], ssid[3], ssid[4], ssid[5], ssid[6], ssid[7], ssid[8], ssid[9] },
               .ssid_len = strlen(WIFI_AP_SSID),
           },
       };

您可以将每个元素初始化封装在针对长度的检查中,以防止溢出:

代码语言:javascript
复制
 .ssid = {
     strlen(ssid) > 0 ? ssid[0] : 0,
     strlen(ssid) > 1 ? ssid[1] : 0,
     strlen(ssid) > 2 ? ssid[2] : 0,
     strlen(ssid) > 3 ? ssid[3] : 0,
     // etc...

但是这样的代码并不是最优的。最简单的听起来像是你真的很想复制:

代码语言:javascript
复制
wifi_config_t ap_config;
strncpy(ap_config.ap.ssid, ssid, sizeof(ap_config.ap.ssid));
ap_config.ap.ssid_len = strlen(ssid);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74066947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档