有人可以向我解释一下吗?我想将一个数组传递给一个函数来修改它的值。但我遇到了一些困难。首先,看起来我从记忆中找回了一些垃圾。
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
是一个带字段的简单结构。
答案 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) {