C++ 从Arduino中的函数返回初始长度未知的字符数组

C++ 从Arduino中的函数返回初始长度未知的字符数组,c++,arduino,C++,Arduino,我需要向服务器发送json。代码工作得很完美,但我需要在两个位置调用它,因此我希望将其作为我们的函数。但是,我无法让它与字符数组一起工作。一种可能是将char数组转换为我所期望的字符串,但这不是我所期望的内存效率。所以我想我应该传递一个指针,在函数中分配大小,然后返回长度。但它似乎不起作用,“编码”字符*似乎是空的 可能是我做错了什么 代码如下: Serial.println("Connected"); char* encoded; in

我需要向服务器发送json。代码工作得很完美,但我需要在两个位置调用它,因此我希望将其作为我们的函数。但是,我无法让它与字符数组一起工作。一种可能是将char数组转换为我所期望的字符串,但这不是我所期望的内存效率。所以我想我应该传递一个指针,在函数中分配大小,然后返回长度。但它似乎不起作用,“编码”字符*似乎是空的

可能是我做错了什么

代码如下:

      Serial.println("Connected");

      char* encoded;
      int contentLength = generateData(encoded);
      Serial.print("Data to be send, length: "); Serial.print(contentLength); Serial.println(" Data: "); Serial.println(encoded);
      // Send request to the server:
      client.println("POST /api/heartbeat HTTP/1.1");
      client.println("Host: localhost");
      client.println("Accept: */*");
      client.println("Content-Type: application/x-www-form-urlencoded");
      client.print("Content-Length: ");
      client.println(contentLength + 5);
      client.println();
      client.print("data=");
      client.print(encoded);

      // Done here, as the response availability sometimes takes time.
      lastConnection = millis();
      updateServer = false;
      free(encoded);
以及功能:

int generateData(char* encoded) {   
  Serial.println("Preparing the data to be send....");
  String inputString = "{\"status\":\"OK\",\"hostname\":\"";
  inputString += hostname;
  inputString += "\",\"build\":";
  inputString += build;
  inputString += ",\"hardware\":\"";
  inputString += hardware;
  inputString += "\",\"sensors\":[";

  bool firstSensor = true;
  for (uint8_t i = 0; i < 8; i++) {
    if (temperatureValues[i] == 0) continue;
    if (!firstSensor) inputString += ",";
    inputString += "{\"sensor\":\"";
    inputString += temperatureAddresses[i];
    inputString += "\",\"value\":";
    inputString += String(temperatureValues[i]);
    inputString += ",\"type\":\"temp\"}";
    firstSensor = false;
  }

  inputString += "]";

  if (pendingResponses.length() > 0) {
    inputString += ",\"responses\":[";
    inputString += pendingResponses;
    inputString += "]";
    pendingResponses = "";
  }

  inputString += "}";

  byte plain[inputString.length() + 1];
  inputString.getBytes(plain, inputString.length() + 1);
  des.calc_size_n_pad(sizeof(plain));

  byte encodedByte[des.get_size()];
  byte plain_p[des.get_size()];
  des.padPlaintext(plain, plain_p);
  for (int i = 0; i < (des.get_size() / 8); i++) {
    byte intermitInput[8];
    byte intermitResult[8];
    for (int j = 0; j < 8; j++) {
      intermitInput[j] = plain_p[(i * 8) + j];
    }
    des.encrypt(intermitResult, intermitInput, (byte*)key);
    for (int j = 0; j < 8; j++) {
      encodedByte[(i * 8) + j] = intermitResult[j];
    }
  }

  int inputLength = sizeof(encodedByte);
  int newLength = Base64.encodedLength(inputLength);
  encoded = (char*) malloc(newLength + 1);
  encoded[newLength] = '\0';

  // Base64 Encoder
  Base64.encode(encoded, (char*)encodedByte, inputLength);
  return newLength;
}
int-generateData(字符*编码){
Serial.println(“准备要发送的数据…”);
String inputString=“{\”状态\“:\”确定\“,\”主机名\“:\”;
inputString+=主机名;
inputString+=“\”,“\”构建\“:”;
inputString+=构建;
inputString+=“,\“硬件\:\”;
inputString+=硬件;
inputString+=“\”,“\”传感器\“:[”;
布尔第一传感器=真;
对于(uint8_t i=0;i<8;i++){
如果(温度值[i]==0)继续;
如果(!firstSensor)输入字符串+=“,”;
inputString+=“{\”传感器\:\”;
inputString+=温度地址[i];
inputString+=“\”,“值\”:“;
inputString+=字符串(温度值[i]);
inputString+=“,\”类型\“:\”临时\“}”;
firstSensor=false;
}
inputString+=“]”;
if(pendingreponses.length()>0){
inputString+=“,\“responses\”:[”;
inputString+=pendingResponses;
inputString+=“]”;
pendingreponses=“”;
}
inputString+=“}”;
字节普通[inputString.length()+1];
inputString.getBytes(普通,inputString.length()+1);
设计计算尺寸(平面尺寸);
字节编码字节[des.get_size()];
字节普通_p[des.get_size()];
des.padPlaintext(普通、普通);
对于(int i=0;i<(des.get_size()/8);i++){
字节间歇输出[8];
字节间歇结果[8];
对于(int j=0;j<8;j++){
间歇输入[j]=plain_p[(i*8)+j];
}
des.encrypt(intermitResult,intermitInput,(字节*)密钥);
对于(int j=0;j<8;j++){
encodedByte[(i*8)+j]=中间结果[j];
}
}
int inputLength=sizeof(encodedByte);
int newLength=Base64.encodedLength(inputLength);
encoded=(char*)malloc(newLength+1);
编码的[newLength]='\0';
//Base64编码器
Base64.encode(encoded,(char*)encodedByte,inputLength);
返回newLength;
}

您正在通过值传递
encoded

char* encoded;
int contentLength = generateData(encoded);
这意味着当您在
generateData()

您只更改了一个局部变量。
最快的修复方法是将
generateData()
更改为通过引用而不是通过值获取其参数,它应该可以工作

int generateData(char* &encoded)

杰克的想法应该行得通

但另一个想法是创建一个包含
char*
int
(或
size\u t
)的结构,并返回它。然后,您不需要尝试通过指针或引用参数“返回”任何内容

int generateData(char* &encoded)