2016-12-17 7 views
0

У меня есть массив символов char *menu_strings[8];, который я заполняю параметрами экранного меню динамически в функции многократного использования(). Я могу изменить элементы индивидуально с помощью строк вручную, например. menu_strings[0] = "New"; и т. Д., Но как взять char *, возвращаемый из другой функции, и вставить его в одну из «строк» ​​массива? Если я пытаюсь Переберите массив с помощью функции с чем-то вроде этого:Как поместить несколько массивов char * в двумерный массив?

for (i=0; i<8; i++) 
{ 
    char returnedOption[32]; 
    if (getOption(i, returnedOption)) 
    menu_strings[i] = returnedOption; 
} 

bool getOption(byte entryNum, char* option) { //code and stuff } 

... все 8 menu_strings заполнены восьмой/последний вариант возвращается (я = 7) вместо строки каждой конкретной записи в. ..

for (i=0; i<8; i++) 
    Serial.println(menu_strings[i]); 

Выходы:

option eight 
option eight 
option eight 
option eight 
option eight 
option eight 
option eight 
option eight 

Я использую Arduino IDE, но чувствую себя довольно уверенно, что я бы завинчивание использование указателей в любой C/++/# здесь. Кроме того, возвращаемый символ char * не превышает 31 символ плюс нулевой указатель.

+0

вы используете 'символ *' почему не строка https://www.arduino.cc/en/Reference/String –

+1

'Я могу изменить элементы индивидуально с ручными типизированными строками, например menu_strings [0] = "New"; 'Это не делает то, что вы думаете, что это делает, и в этом проблема. Либо используйте strcpy (но сначала вам понадобятся malloc, free и т. Д.) Или std :: string. – deviantfan

+2

* но как взять char *, возвращаемый из другой функции * - Выйти из 'char *' и просто использовать 'std :: string'. Вероятно, вы также возвращаете адрес локального массива, учитывая то, что вы разместили. Если вы это делаете, возвращение адреса локальной переменной - это неопределенное поведение. – PaulMcKenzie

ответ

1

Большое спасибо PaulMcKenzie, yardpenalty и deviantfan, которые привели меня к ответу:

Получить из char * бизнеса и просто использовать std::string. Вы также , вероятно, возвращаете адрес локального массива, учитывая то, что вы разместили. Если вы это делаете, возвращающий адрес локальной переменной неопределенное поведение.

Это привело меня использовать объект Arduino Строка вместо char*https://www.arduino.cc/en/Reference/StringObject и использовать toCharArray() для любых библиотечных вызовов, настаивающих на указатель полукокса. Это работает, но добавлено около 2k (или 7% от моей полезной памяти программ!).

В конце концов я отбросил указатель *, поскольку это неверно, и правильно использовал strcpy, как рекомендовано deviantfan и yardpenalty, чтобы держаться подальше от библиотеки String. Ее обязательство дополнительно превозносило здесь: https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/