c++ - 错误无效使用 void 表达式。试图将参数传递给函数

标签 c++ parameters arduino void esp32

我正在尝试初始化一个服务器,使其根据收到的请求看起来像特定的输入。它们有很多,所以我想用一个循环初始化它,如下所示:

void serverInit() {
    for (int i = 1; i <= qty; i++) {
        String s = "/readBatt" + i;
        server.on(s, runTest(i));
    }

    server.begin();
    Serial.println("Server started.");
}

它告诉我 server.on(s, runTest(i)); 是对 void 表达式的无效使用。我知道它希望将其格式化为 server.on(s, runTest) 但函数 runTest(int n) 需要一个参数。如何将此参数传递给函数?

最佳答案

看来您正在使用 WebServer ESP32 Arduino 库中的类。正如您已经收集到的,on() 中指定的回调方法不接受任何参数。

但是,您还有其他选择。您可以在 URL 路径中指定一个“占位符” - 使用大括号 - {} .然后,在回调中,可以使用 pathArg() 检索相应的参数。方法 - 它接受参数索引作为参数。

例子...

您可以将 API 端点定义为 /readBatt/<battery number> .然后,要配置服务器以处理对此端点的请求,您可以使用类似

#include <uri/UriBraces.h>
server.on(UriBraces("/readBatt/{}"), runTest);

在您的回调中,您将按如下方式检索第一个参数 ...

static void runTest() {
  String batteryNumber = server.pathArg(0);
  Serial.println("Request to read battery");
  String response = "You attempted to read battery " + batteryNumber;
  response += ".\nThis endpoint is a placeholder. Check again soon!";
  server.send(200, "text/plain", response);
}

最后...假设您的 ESP8266 在本地 IP 地址 192.168.1.9 上运行。您可以通过打开访问新的 API 端点

http://192.168.1.9/readBatt/1

在您的浏览器中。 (将 1 替换为相关的电池编号。)

我不认为有 pathArg() 的版本不幸的是,它返回一个整数,因此您可能必须在某些时候执行转换。

关于c++ - 错误无效使用 void 表达式。试图将参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56708674/

相关文章:

c++ - 静态常量声明,变量的 constexpr 定义,有效的 C++?

javascript - 将回调和其他参数传递给 jQuery ajax 是否成功?

c++ - 如何在导入另一个库的库中修复 "invalid use of non-static member function"

Python ArgParse Subparsers 并链接到正确的函数

asp.net-mvc - 向 ASP MVC 2 中的 Controller 发送参数

javascript - 串行通信 - node.js - arduino 板没有应答

Arduino Uno PWM - 奇怪的结果

c++ - 部分解码h264流

c++ - 操作 QStandardItemModel/QTreeView 中的数据?

c++ - 该指令的 #endif 丢失