错误无效使用void表达式。尝试将参数传递给函数

时间:2019-06-21 18:24:50

标签: 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)需要一个参数。如何将该参数传递给函数?

2 个答案:

答案 0 :(得分:2)

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

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

示例...

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

server.on("/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()版本会返回整数,因此您可能必须在某个时候执行转换。

答案 1 :(得分:1)

您可以使用所谓的“关闭”。闭包使您可以编写一个函数,该函数保留对超出其范围的变量的访问。

闭包是使用"lambda expression"(基本上是一个匿名函数)编写的。 C ++用于lambda表达式的语法如下:

[capture variable list](argument list) { body}

捕获变量列表是要在体内使用的变量列表。参数列表是调用者将传入的普通函数参数列表。您将像这样编写所需的lambda表达式:

[i]() { runTest(i); }

并像这样使用它:

server.on(s, [i]() { runTest(i); });

需要明确的是,@ David Collins的答案是编写Web服务器的更好方法。在URL中使用参数比创建几个嵌入参数的URL更好。我只是在回答如何将参数传递给不带参数调用的函数的问题。如果您以更好的方式编写Web服务器代码,则无需这样做(尽管我将对URL中传递的值进行边界检查,以确保获得有效的电池编号)。