微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当对象更改为对象指针时程序无法正常工作

如何解决当对象更改为对象指针时程序无法正常工作

我使用 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 举报,一经查实,本站将立刻删除。