字符串被破坏 - 堆栈溢出?

时间:2017-10-11 18:21:27

标签: c++ string esp8266 arduino-esp8266

我绝望了!我想让我的ESP8266从TCP客户端接收一个字符串,执行相应的函数并给出TCP响应。但不幸的是,响应字符串以某种奇怪的方式被破坏: 假设我输入了一个“未知命令”,前11个字节通过串行接口正确打印(其余的是转储),客户端收到的前11个字节是转储,但其余的是正确的(见下面脚本中的评论)。但是当我进入“昏暗”状态时命令结果是正确的(但返回字符串也短于"错误:未知命令")。 目前我完全不知道如何解决这个问题,即使我已经尝试了很多。

#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <string.h>

struct parsed_query{
  String command;
  String arguments;
};

struct parsed_query parser(void){
  // this function receives and parses a query
  struct parsed_query result;
  result.command="entered command";
  result.arguments="entered arguments"
  return result
}

char* str2char(String as_string){
  int i_0=0;
  while(as_string[i_0]!='\0'){i_0++;}
  char as_char[i_0+1];
  as_char[i_0]='\0';
  for(int i=0;i<i_0;i++){
    as_char[i]=as_string[i];
  }
  return as_char;
}

String executor(String command,String arguments){
  String response;
  if(command=="dim"){
    response="dimming";
  }
  else if(command=="on"){
    response="switching ON";
  }
  else{
    response="error: unknown command";
  }
  return response;
}

void setup(){
// initialize serial interface, wifi & tcp-server
  Serial.begin(115200);
  WiFi.begin("<SSID>","<PASSWORD>");
  while (WiFi.status() != WL_CONNECTED){delay(500);}
  TCPserver.begin();
  }

void loop() {
  if(!client.connected()){
    client=TCPserver.available();
  }else{
    struct parsed_query query=parser();

// This prints "error: unkno??*/???*??"
    Serial.println(str2char(executor(query.command,query.arguments)));

// here, the client receives "????**?*??*?wn command"
  client.write(str2char(executor(query.command,query.arguments))));
  }
}

我有两个想法可能会导致这个结果(即使我不知道在我的代码中修复它的位置):

案例1: 也许,我在某些时候将参考调用和值调用联系起来(如果是的话,在哪里?)

案例2: 我的程序导致堆栈溢出(如果是,在哪里??)

任何帮助都非常感谢,因为我不想再花一晚时间。

2 个答案:

答案 0 :(得分:5)

library(roll) roll_cor(dt[,.(a,b)],5) Error in roll_cor(dt[, .(a, b)], 5) : Not compatible with requested type: [type=list; target=double]. 中,您返回一个指向本地数组的指针,但是就像每个局部变量一样,它在函数返回后不再存在。因此,从返回的指针读取会导致未定义的行为。

启用警告进行编译(强烈建议)应该输出如下内容:

  

警告:本地变量的地址&#39; as_char&#39;返回

答案 1 :(得分:0)

(一)正确的代码是

#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <string.h>

#define TCP_RESPONSE_L 1024

struct parsed_query{
  String command;
  String arguments;
};

struct parsed_query parser(void){
  // this function receives and parses a query
  struct parsed_query result;
  result.command="entered command";
  result.arguments="entered arguments"
  return result
}

int str2char(char *as_char, String as_string, int max_length){
  int i_0=0;
  while(as_string[i_0]!='\0'){
    if(i_0>=max_length){as_string="error: caught an overflow! increase TCP_BUFFER_L";break;}
    i_0++;
  }
  as_char[i_0]='\0';
  for(int i=0;i<i_0;i++){
    as_char[i]=as_string[i];
  }
  return 1;
}

String executor(String command,String arguments){
  String response;
  if(command=="dim"){
    response="dimming";
  }
  else if(command=="on"){
    response="switching ON";
  }
  else{
    response="error: unknown command";
  }
  return response;
}

void setup(){
// initialize serial interface, wifi & tcp-server
  Serial.begin(115200);
  WiFi.begin("<SSID>","<PASSWORD>");
  while (WiFi.status() != WL_CONNECTED){delay(500);}
  TCPserver.begin();
  }

void loop() {
  if(!client.connected()){
    client=TCPserver.available();
  }else{
    struct parsed_query query=parser();
    char response[TCP_RESPONSE_L];

    str2char(response,executor(query.command,query.arguments),TCP_RESPONSE_L);

    //prints fine
    Serial.println(str2char(executor(query.command,query.arguments)));

    //correctly sending to client
    client.write(str2char(executor(query.command,query.arguments))));
  }
}