2012-03-22 3 views
1

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

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; 
} 

ответ

3
char** getCommands(){ 
    char* commands[10]; 
    … 
    return commands; 
} 

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

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

+0

Отлично, спасибо огромное! Я новичок в C++, это исправлено! – Chris

Смежные вопросы