使变量具有与#define相同的类型/作用?

时间:2019-06-20 17:06:41

标签: c pointers type-conversion int esp32

我正在ESP32和路由器之间建立wifi连接。 ESP32的结构包含所有wifi配置的详细信息,其中两个是SSID和密码。如果尝试使用变量,则无法设置这两个值。

如果我使用#define定义我想要的字符串,它将起作用。...sta是保存配置参数的结构,sta与另一个结构合并为wifi_config_t的数据类型。...ssid和密码为类型为uint8_t

//These work
#define ESP_SSID "AccessPoint"
#define ESP_PASS "Pass" 

//These don't work
char ESP_SSID[32] = "AccessPoint" //32 since that's max SSID length
char ESP_PASS[64] = "Pass" //64 since that's max pass length

//...later in code...
wifi_config_t wifi_config = {
    .sta = {
        .ssid = ESP_SSID,
        .password = ESP_PASS
    },
};

//...definition of .sta ...
typedef struct {
    uint8_t ssid[32];
    uint8_t password[64];
...
} wifi_sta_config_t;

但是我试图做到这一点,以便可以在运行时更改SSID和Pass,这就是为什么要设置变量的原因。但是,如果我使用变量版本,则会导致以下错误:

warning: initialization makes integer from pointer without a cast [-Wint-conversion]
.ssid = ESP_SSID,
        ^
warning: initialization makes integer from pointer without a cast [-Wint-conversion]
.password = ESP_PASS
            ^
error:missing braces around initializer [-Werror=missing-braces]
.sta = {
       ^

我知道这是类型不匹配,但是我一生都无法弄清楚如何使变量版本与#define版本具有相同的效果!

2 个答案:

答案 0 :(得分:5)

数组初始化

您的代码无法编译的原因是from tabula import read_pdf df = read_pdf("C:\\Users\\Downloads\\abc.pdf", multiple_tables=True,pages="1-2") df dataList = [] for link in soup.find_all('p'): dataList.append(link.text) import csv print(len(dataList )) import pandas as pd from pandas import DataFrame df = DataFrame(dataList, columns= ["Para"]) df.to_csv("c:\\users\\downloads\\abc.csv") 结构中的ssid元素是 array 类型-只能从字符串文字中初始化数组或用大括号括起来的列表。有关说明,请参见here。您正试图从另一个数组变量中初始化它-这是非法的。

例如,以下初始化是合法的。

wifi_config_sta_t

另一方面,这不是:

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 不是常量表达式。

This answer(关于SO的类似问题)提供了更多示例。

预处理器和常量表达式

请注意

ESP_SSID

相同
#define ESP_SSID "AccessPoint"
// etc.
char ssid[32] = ESP_SSID;

也就是说,在预处理阶段,char ssid[32] = "AccessPoint"; 代码中的所有实例都被替换为字符串文字ESP_SSID。这就是为什么对您的应用程序使用"AccessPoint"的原因-您只是使用字符串文字初始化数组。

数组分配

如果要在运行时更新SSID和密码,一种选择是在启动时对阵列进行零初始化-然后根据需要使用#define更新值。

strcpy()

请注意,由于ESP IDF生成过程中使用了编译选项,因此必须将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 *

答案 1 :(得分:0)

出现这些错误的原因是因为您将Console.WriteLine(string.Format("{0,-10}{1,-10}{2,-15}{3,-15}", "Id", "Ref", "Filename", "UploadDate")); foreach (var group in groupSkip3) { Console.WriteLine(); foreach(var record in group) { Console.WriteLine(string.Format("{0,-10}{1,-10}{2,-15}{3,-15}", record.Id, record.Ref, record.Filename, record.UploadDate.ToString("yyyy-MM-dd"))); } } 定义为char ESP_SSID[32],而结构将字段定义为char[]。这些是不同的指针(uint8_t []char *)。

如果将ESP_SSID声明更新为uint8_t *,警告将消失。

在ESP32代码中,我们uint8_t ESP_SSID[32]进入需要字符串的字段,strcpy进入需要二进制数据的字段,例如memcpy