首先,我想事先就這個問題道歉。我想它一定很簡單,但我是一個初學者,無處可去。
我在我的所有函式(全域變數)之外宣告了以下指標:
#include <ESP8266WiFi.h>
String* IP;
String* MAC;
然后,從一個函式內部,我試圖改變它的值:
void networkInfo() {
String* IP = WiFi.localIP().toString();
String* MAC = WiFi.macAddress();
}
當我嘗試編譯和執行時,它給了我以下錯誤:
error: cannot convert 'String' to 'String*' in initialization
String* IP = WiFi.localIP().toString();
^
error: cannot convert 'String' to 'String*' in initialization
String* MAC = WiFi.macAddress();
^
請問,我做錯了什么?謝謝...
PS:我想宣告,在問這個問題之前,我確實在 StackOverflow 上進行了搜索,嘗試了許多不同的方法,但沒有一個對我有幫助。(大多數都不完整或只是針對 OPs 問題)
如果這是重復的,我很抱歉。我沒有找到解決方案。
編輯1:
更改了指向普通變數的指標:
// Global Variables
String IP;
String MAC;
在函式內部,更改了分配變數的方式:
void networkInfo() {
IP = new String;
MAC = new String;
*IP = WiFi.localIP().toString();
*MAC = WiFi.macAddress();
}
但是在 networkInfo 函式上,它回傳了一個錯誤。等號錯誤:
****no viable overloaded '='****
編輯2:
下面進一步測驗。
- 使用 g_Variable 更改變數名稱以解決最佳實踐
// Global Variables String *g_IP; String *g_MAC;
- 將變數分配為物件,然后給它一個字串。
void networkInfo() { g_IP = new String; g_MAC = new String; *g_IP = WiFi.localIP().toString(); } void sendInfo() { cout << "Test: " << g_IP; }
呼叫 sendInfo() 函式時,輸出完全是:
Test: 0x22beeb0
我期望IP地址。
編輯3(解決方案): 出于某種奇怪的原因,我能夠使用 g_IP = new String; 解決這個問題 然后分配為指標。奇怪,不明白為什么。
// Global Variables
String *g_IP;
String *g_MAC;
// Prototypes - Functions you will use.
void networkInfo();
void sendInfo();
void initSerial();
void setup()
{
// Initialize Functions
initSerial();
networkInfo();
sendInfo();
}
void loop()
{
// Loop Functions
sendInfo();
}
void initSerial()
{
Serial.begin(115200); // Baudrate NodeMCU
}
void networkInfo() {
// Obs: Without new String a Error happens, below.
// ets Jan 8 2013,rst cause:4, boot mode:(1,6)
// wdt reset
// Why? IDK
g_IP = new String; // No idea why this works.
g_MAC = new String;
// Removing this two lines and above gives wdt reset error
*g_IP = WiFi.localIP().toString();
*g_MAC = WiFi.macAddress();
}
void sendInfo() {
delay(500);
Serial.println(*g_IP);
}
uj5u.com熱心網友回復:
首先,void networkInfo()您要宣告隱藏全域變數的區域變數。
String* IP = (value)
應該只是
IP = (value)
如果您希望 IP 成為全域版本,請在函式中。有些人會使用命名方案g_IP來明確表示它是全域變數而不是區域變數。
其次,必須為指標分配(某物)的地址,而不是(某物)本身。
IP = new String
將在堆上分配一個持久字串物件并將 IP 設定為它的地址(指向它的指標)。
現在 IP 指向一個字串,*IP 是字串,這將起作用
*IP = WiFi.localIP().toString();
正如@CherryDT 所指出的,您可能只想在某些初始化函式中為全域變數分配一次存盤空間。如果每次呼叫此函式時都繼續分配新物件,則會泄漏記憶體。
uj5u.com熱心網友回復:
您正在嘗試將 String 值放入 String 指標型別。
String* IP = WiFi.localIP().toString();
// ^ This variable is ^This returns a String.
// a String* (string
// pointer) type
您還在networkInfo()函式中重新宣告變數 IP 和 MAC。
我不知道為什么您將 IP 和 MAC 作為字串指標,您不需要。但是,如果您堅持以這種方式保留它們,您只需要這樣做:
*IP = WiFi.localIP().toString();
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519693.html
標籤:细绳指针ArduinoESP8266arduino-c
