Итак, в javascript (coffeescript) у меня есть код, который выглядит следующим образом:
"BRIGHT":
min: 1
max: 4
step: 1
value: 3
bluetooth:
options: [ 'off', 'on' ] # SOMETIMES I NEED ARRAY
callback: ->
rangeFinder.bluetooth = rangeFinder.getSetting().value
mode:
options: [ 'basic', 'advanced', 'config' ] # OF DIFFERENT LENGTHS
callback: ->
rangeFinder.lastMode = rangeFinder.getSetting().value
Как мне сделать что-то подобное в C ++?
У меня есть массив из 3 объектов, похожих на яркость
#include "setting.cpp"
class GlobalMenu {
public:
MenuSetting settings[3];
int setting;
GlobalMenu();
};
GlobalMenu::GlobalMenu(void){
// What is the currently selected setting?
this -> setting = 0;
this -> settings[0].name = "BRIGHT";
this -> settings[0].min = 1;
this -> settings[0].max = 4;
this -> settings[0].step = 1;
this -> settings[0].value = 3;
this -> settings[1].name = "BLUETOOTH";
// HOW DO I GET VARIABLE LENGTH ARRAYS HERE?
}
И в setting.cpp
class MenuSetting {
public:
char *name;
int min;
char options[][5];
int max;
int step;
int value;
};
где-то еще этот код меняет настройки (и работает)
void RangeFinder::changeSetting(int dir) {
this -> data.global.settings[this -> data.global.setting].value +=
(dir ? 1 : -1) *
this -> data.global.settings[this -> data.global.setting].step;
this -> enforceMinMax();
this -> render();
}
также, если вы можете найти способ очистить его, который поможет
Итак, я, вероятно, могу выяснить, как определить, имеет ли длина опции, но у меня возникают проблемы с назначением любого количества опций в массив опций
Решение не может использовать STD.
Насколько я знаю, микроконтроллер atmega32 не может использовать стандартную библиотеку lib.
В C ++ каноническим способом обработки массива переменного размера является использование vector
std::vector<std::string> options;
options.push_back("First option");
options.push_back("Second option");
options.push_back("Third option");
тогда вы можете использовать options.size()
знать, сколько там элементов.
Вы также сделаете себе одолжение, прочитав хорошая книга C ++ от обложки до обложки, прежде чем начать использовать язык. C ++ не подходит для экспериментального изучения по нескольким причинам, наиболее важными из которых являются:
Лучшие варианты для вас, чтобы избежать нескольких ловушек, в которые вы попали:
Это сделает ваш класс похожим на:
class MenuSetting
{
public:
std::string name;
int min;
std::vector<std::string> options;
int max;
int step;
int value;
};
Вы можете найти подробную информацию о том, как различные операции для обоих std::string
а также std::vector
.
это невозможно … ответ состоит в том, чтобы создавать регистр операторов и жесткий код больше.
Вы должны действительно использовать стандартную библиотеку шаблонов. Это сделает вашу жизнь намного более значимой, и у вас будет много свободного времени для документирования вашего кода!
Благодаря новейшим библиотекам std и c ++ 11 ваш код может быть упрощен, чтобы он выглядел чистым, как фрагмент javascript:
#include <string>
#include <vector>
std::vector<std::string> bluetoothOptions = {"on", "off"};
std::vector<std::string> modeOptions = {"basic", "advanced", "config"};
// Example usage:
assert (bluetoothOptions[1] == "off"); // exanple to access strings by index
assert (modeOptions.size() == 3); // example to determine size of vector
Если вы хотите, чтобы эти строки и векторы не могли измениться, используйте следующее (это было бы моим предпочтением):
const std::vector<const std::string> bluetoothOptions = {"on", "off"};
const std::vector<const std::string> modeOptions = {"basic", "advanced", "config"};
Самый простой способ — использовать массив указателей.
и не забудьте удалить указатели;)
class MenuSetting {
public:
char *name;
int min;
char* options[5];
int max;
int step;
int value;
};
тогда вы можете назначить это так
bool MenuSetting::setOption(char *str, unsigned int pos)
{
if(c && p <5)
{
options[pos]=str;
return true;
}
return false;
}
я думаю, что это поможет вам больше всего, если вы использовали умный указатель(простой не так сложно реализовать)
и я думаю, что вы можете сослаться на этот сайт Реализация простого умного указателя в C ++ например.
Также я думаю, что этот ответ будет работать для вас https://stackoverflow.com/a/279032/2689696