修改函数内的数组

时间:2017-08-21 20:38:08

标签: c++ arduino

有人可以向我解释一下吗?我想将一个数组传递给一个函数来修改它的值。但我遇到了一些困难。首先,看起来我从记忆中找回了一些垃圾。

void CustomEthernetClientClass::readMessages(size_t &messageCount, Message *messages) {
  digitalWrite(ETHERNET_SS, LOW);
  if(_client.available()) {
    uint8_t msgBuffer[ETHERNET_RX_BUFF];
    uint16_t bufferSize = 0;
    while(_client.available() && (bufferSize < ETHERNET_RX_BUFF)) {
      msgBuffer[bufferSize] = _client.read();
      bufferSize++;
    }
    Serial.println("converting...");
    messages = reinterpret_cast<Message *>(msgBuffer);
    messageCount = ETHERNET_FRAME_LENGTH * sizeof(uint8_t) / sizeof(Message);
  } 
  digitalWrite(ETHERNET_SS, HIGH);
}

void loop() {
  Message messageBuffer[10];
  size_t messageCount = 0;
  CustomEthernetClient.readMessages(messageCount,messageBuffer);
  Serial.println(messageCount);
  if(messageCount > 0) {
    for(int i=0; i<messageCount; i++) {
      Serial.print("H1: ");
      Serial.print(messageBuffer[i].header1 );
      Serial.print(", ");
      Serial.print(messageBuffer[i].header2 );
      Serial.print(", ");
      Serial.print(messageBuffer[i].data1 );
      Serial.print(", ");
      Serial.print(messageBuffer[i].data1 );
      Serial.println();
    }
  }
  delay(1000);
}

我得到了这个结果(不是我的预期......):

converting...
1
H1: 255, 255, 4294967295, 4294967295

但如果我像这样修改readMessages()函数:

void CustomEthernetClientClass::readMessages(size_t &messageCount, Message *messages) {
  digitalWrite(ETHERNET_SS, LOW);
  if(_client.available()) {
    uint8_t msgBuffer[ETHERNET_RX_BUFF];
    uint16_t bufferSize = 0;
    while(_client.available() && (bufferSize < ETHERNET_RX_BUFF)) {
      msgBuffer[bufferSize] = _client.read();
      bufferSize++;
    }
    Serial.println("converting...");
    messages = reinterpret_cast<Message *>(msgBuffer);
    messageCount = ETHERNET_FRAME_LENGTH * sizeof(uint8_t) / sizeof(Message);

    //This is what I have added
    for(int i=0; i<messageCount; i++){
      Serial.print("H1: ");
      Serial.print(messages[i].header1 );
      Serial.print(", ");
      Serial.print(messages[i].header2 );
      Serial.print(", ");
      Serial.print(messages[i].data1 );
      Serial.print(", ");
      Serial.print(messages[i].data1 );
      Serial.println();
    }
  } 
  digitalWrite(ETHERNET_SS, HIGH);
}

但是为了调试之后我在代码中添加了一些打印行,它开始起作用了。我得到了我的期望:

converting...
H1: 1, 0, 0, 0
1
H1: 1, 0, 0, 0

Message是一个带字段的简单结构。

2 个答案:

答案 0 :(得分:1)

参数在C ++中是可变的,但它们是在调用时复制的,这意味着您要分配给本地副本而不是调用者传递的变量。您可能知道这一点,因为您正在传递messageCount作为参考。但是,

messages = reinterpret_cast<Message *>(msgBuffer);

将指向本地数组的指针存储到消息中,消息未声明为引用,因此是本地变量。尝试将您的消息参数作为参考:

void CustomEthernetClientClass::readMessages(size_t &messageCount, Message *&messages)

如果你这样做,你还需要从堆而不是堆栈中分配缓冲区;我不知道它适用于Arduino。另一种方法是用memcpy或类似的方法替换赋值,它将覆盖指针指向的数据而不是指针本身。

答案 1 :(得分:0)

您传递messages指针,但不要写入指向的位置。相反,你要覆盖它的价值:

messages = reinterpret_cast<Message *>(msgBuffer);

为避免此类错误,您应该编写const-correct代码:

readMessages(size_t & messageCount, Message * const messages) {