如何解决当对象更改为对象指针时程序无法正常工作
我使用 example 库的 mDNSResolver 将本地主机名解析为 IP 地址,如下所示:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <mDNSResolver.h>
#define WIFI_AP "myap"
#define WIFI_PASS "mypass"
#define NAME_TO_RESOLVE "myhost.local"
using namespace mDNSResolver;
WiFiClient wifiClient;
WiFiUDP udp;
Resolver resolver(udp);
void setup() {
Serial.begin(115200);
int WiFiCounter = 0;
// We start by connecting to a WiFi network
Serial.println("Connecting to ");
Serial.println(WIFI_AP);
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_AP,WIFI_PASS);
while (WiFi.status() != WL_CONNECTED && WiFiCounter < 30) {
delay(1000);
WiFiCounter++;
Serial.print(".");
}
Serial.print("Resolving ");
Serial.println(NAME_TO_RESOLVE);
resolver.setLocalIP(WiFi.localIP());
IPAddress ip = resolver.search(NAME_TO_RESOLVE);
if(ip != INADDR_NONE) {
Serial.print("Resolved: ");
Serial.println(ip);
} else {
Serial.println("Not resolved");
}
}
void loop() {
// required to clear the UDP buffer,as we can't unjoin a multicast group yet
resolver.loop();
}
它按我的预期工作,即 IP 已成功解析并在串行控制台上打印为:
已解决:[已解决的 IP 地址,例如:] 192.168.1.33
但是当我将 resolver
对象更改为指针时,如下所示:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <mDNSResolver.h>
#include <WiFiClient.h>
#define WIFI_AP "myap"
#define WIFI_PASS "mypass"
#define NAME_TO_RESOLVE "myhost.local"
using namespace mDNSResolver;
WiFiClient wifiClient;
WiFiUDP udp;
Resolver *resolver;
void setup()
{
Serial.begin(115200);
int WiFiCounter = 0;
// We start by connecting to a WiFi network
Serial.println("Connecting to ");
Serial.println(WIFI_AP);
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_AP,WIFI_PASS);
while (WiFi.status() != WL_CONNECTED && WiFiCounter < 30)
{
delay(1000);
WiFiCounter++;
Serial.print(".");
}
resolver = new Resolver(udp);
resolver->setLocalIP(WiFi.localIP());
IPAddress ip = resolver->search(NAME_TO_RESOLVE);
if (ip != INADDR_NONE)
{
Serial.print("Resolved: ");
Serial.println(ip);
}
else
{
Serial.println("Not resolved");
}
}
void loop()
{
// required to clear the UDP buffer,as we can't unjoin a multicast group yet
resolver->loop();
}
程序无法再解析任何本地主机名,以下语句将在串行控制台上打印:
未解决
if... else...
函数中的 setup()
语句确定 IP 是否成功解析:
if (ip != INADDR_NONE)
{
Serial.print("Resolved: ");
Serial.println(ip);
}
else
{
Serial.println("Not resolved");
}
我是否正确使用了对象指针?如果没有,我该如何解决?
解决方法
在 setup() 之前调用 resolver = new Resolver(udp);
:
WiFiClient wifiClient;
WiFiUDP udp;
Resolver *resolver = new Resolver(udp);
编辑1: 出于某种原因,某些板必须全局配置,即使您将指针传递给创建的对象,它也不起作用。这是一种正在讨论中的行为,正如您在这篇文章中所看到的: Class Instantiation only works globally but not in set up
这就是为什么我建议全局声明和实例化它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。