Arduino C ++, поведение нечетного массива - PullRequest
1 голос
/ 23 марта 2012

У меня есть Arduino, который обрабатывает строку, разбивая ее на массив. Однако по какой-то причине после возврата функции обработки к массиву можно получить доступ только один раз, прежде чем окажется, что значения стали поврежденными. Другими словами, я могу получить доступ к любому элементу массива, но когда я это делаю, я не могу получить доступ к любым другим элементам массива.

void loop(){
  int pin;
  Serial.print("Enter command: ");
  while(Serial.available()<=0)
    delay(100);
///Input to the serial terminal was: "This;is;a;command". Notice how inside the getCommands() function, it will output all elements ok

  char** commands = getCommands();
  Serial.println(commands[1]); ///prints "is"
  Serial.println(commands[0]); ///**** prints nothing, or sometimes infinite spaces****
  delay(1000);
}
char** getCommands(){
  char* commandIn = getSerialString();
  char* commands[10];
  char *str;
 int i=0;
 while ((str = strtok_r(commandIn, ";", &commandIn)) != NULL){

   commands[i]=str;
   i++;
}
Serial.println(commands[0]);   ///prints "This"
Serial.println(commands[1]);   ///prints "is"
Serial.println(commands[2]);   ///prints "a"

return commands;
}
char* getSerialString(){
  while(Serial.available()<=0)
    delay(100);
  int i=0;
  char commandbuffer[100];
  for(int a=0; a<100; a++)
    commandbuffer[a]='\0';

  if(Serial.available()){
     delay(100);
     while( Serial.available() && i< 99) {
        commandbuffer[i++] = Serial.read();
     }
     commandbuffer[i++]='\0';
  }
  return commandbuffer;
}

1 Ответ

3 голосов
/ 23 марта 2012
char** getCommands(){
  char* commands[10];
  …
  return commands;
}

Оператор return commands не возвращает значение массива, он возвращает адрес массива. Технически, тип выражения commands распадается от array-10-of-pointer-to-char в этом контексте; значение выражения является адресом первого элемента массива.

В результате вы возвращаете адрес локальной переменной, локальная переменная которой перестает существовать после оператора return. Позже, в loop, вы разыменовываете этот указатель на уничтоженный объект, что приводит к неопределенному поведению.

...