【问题标题】:Esp-32 invalid conversion from 'const char*' to 'int' [-fpermissive]Esp-32 从 'const char*' 到 'int' 的无效转换 [-fpermissive]
【发布时间】:2020-12-17 12:44:43
【问题描述】:

您好,我在一些变量转换方面遇到了问题,问题是当尝试编译代码时会收到此错误消息。为什么不能转换?

我将wtrtemp 作为字符串尝试将其更改为int 和float 和const char 相同的问题。 Mqtt 只是从滑块中打印出一个数字。这是从节点red发送的

从 'const char*' 到 'int' 的无效转换 [-fpermissive]

//MQTT incoming
#define mqttFloodInterval "greenHouse/floodInt"
#define mqttFloodDuration "greenHouse/floodDur"
#define mqttLightsOnDuration "greenHouse/lightsOnDur"
#define mqttLightsOffDuration "greenHouse/lightsOffDur"
//MQTT Setup End
int wtrtemp;
void topicsSubscribe(){
   client.subscribe(mqttFloodInterval);
   client.subscribe(mqttFloodDuration);
   client.subscribe(mqttLightsOnDuration);
   client.subscribe(mqttLightsOffDuration);
}
  Serial.print("MQTT message received on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  messageTemp.remove(0);
  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();
  Serial.println(messageTemp);
  if (String(topic) == mqttFloodDuration) {
    wtrtemp = mqttFloodDuration; // The problem is here 
    Serial.print("*** (Flood Interval Received)");
  }
  if(wtrtemp == 23){
 digitalWrite(15, HIGH); // turn on pump 5 seconds
     delay(5000);
  } 
     else {
     
       digitalWrite(15, LOW);  // turn off pump 5 seconds
      delay(5000);
  }
}

【问题讨论】:

  • 什么是mqttFloodDuration
  • 从看到的错误中,mqttFloodDuration 很可能是const char* 类型的变量,这意味着它可能是一个字符串,如果该字符串应该是数字,那么您将需要额外的代码来将其转换为整数
  • 编辑了 mqttFloodDuration 的代码
  • WARhead 可能会搜索如何将const char* 转换为string or int :)
  • 您希望“greenHouse/floodDur”作为 int 是什么?神奇的数字 23 是什么?

标签: c++ c arduino mqtt esp32


【解决方案1】:

我没有测试您的情况的环境,但我强烈建议您是否尝试将字符串转换为使用 atol() 的 int,因为 esp32 框架支持它。

int x = (int)atol("550");

所以在你的情况下:wtrtemp = (int)atol(mqttFloodDuration); // The problem is here

如果这不能解决您的问题(不能 100% 记住 atol 使用的参数是否采用 const char* 或 char*),因此如果它坚持使用 char*,请尝试使用以下方法: wtrtemp = (int)atol((char*)mqttFloodDuration); // The problem is here

如果您想走上使用 String 类的危险但容易的道路,那么您可以非常轻松地设置 String by

String xx = "hello world";
int xx_int = xx.toInt();

但是在底层该函数也执行上面提到的 atol() 函数,所以如果您想提高内存分配和 esp32 板载 ram 的使用效率,请记住这一点。

【讨论】:

  • 是的,它成功了,我可以编译代码。现在我需要修复我的逻辑代码 :D
  • 这将清除警告,是的,但鉴于mqttFloodDuration 的定义,它似乎不太可能产生所需的行为。
  • @LukasKaščiukevičius 为您的下一个关于 LED 的问题发布一个新问题,以便人们可以从未来如何解决该问题中受益。我很乐意尽我所能为您提供指导。
  • 我创建了一个线程,但我的理解仍不清楚。我仍在努力解决stackoverflow.com/questions/65145054/…
【解决方案2】:

您的mqttFloodDuration 是一个扩展为字符串文字"greenHouse/floodDur" 的宏。错误消息正确地告诉您,这不是与 int 类型的变量正确匹配的类型,例如您的 wtrtemp

此外,您似乎确实希望 wrtemp 采用真正的整数值,因为您稍后会将其与整数常量 23 进行比较,但从提供的代码中不清楚字符串 "greenHouse/floodDur" 如何对应于整数.可能有某种查找函数可以用来获取相应的值,但据我所知,这将特定于您的项目。

【讨论】:

  • 是的,我写了一些关于我在做什么的解释,但并没有具体说明我在做什么。节点红色有一个滑块,可以发回 20-30 等的数字。如果 wtrtemp 为 25 且 outtemp 为 >20,则该数字将用作浇水的水泵,然后浇水 5 秒
  • @LukasKaščiukevičius,我所说的不清晰不是关于你的程序的目的,而是关于它的功能。如果尝试从mqttFloodDuration(按原样定义)获取整数完全有意义,那么这样做的适当机制是特定于您的项目的。特别是,(int)atol(mqttFloodDuration) 将始终评估为 0,因此它似乎不太可能是您真正想要的。
  • 是的,就像你说的那样,变量在使用命令(int)atol 后归零,还有其他方法可以转换 char 值吗?
  • @LukasKaščiukevičius,正如我之前所说,任何可能存在的此类机制特定于您的项目。从您所提供的内容中,该字符串与数值之间的任何关联的性质都不清楚,而且我认为这不是标准的。该字符串可能是哈希表或数据库条目的键。可能它只是使用错误的东西,在这种情况下,可能有一个不同的宏扩展为想要的值而不是(不知何故)相关的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2014-01-16
  • 1970-01-01
  • 2019-09-22
相关资源
最近更新 更多