как заполнить массив строк переменной длины

Итак, в 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.

-1

Решение

В 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 ++ не подходит для экспериментального изучения по нескольким причинам, наиболее важными из которых являются:

  1. иногда C ++ нелогичен (из-за своей истории), и независимо от того, насколько вы умны, вы не можете угадать историю. Вы должны изучить это.
  2. когда вы совершаете ошибку, вы не можете рассчитывать на язык, который вам поможет (нет ангелов ошибок времени выполнения, только неопределенные демоны поведения).
2

Другие решения

Лучшие варианты для вас, чтобы избежать нескольких ловушек, в которые вы попали:

  1. Используйте std :: string вместо символьных указателей и буферов
  2. Используйте std :: vector вместо массивов размера компилятора

Это сделает ваш класс похожим на:

class MenuSetting
{
public:
std::string name;
int min;
std::vector<std::string> options;
int max;
int step;
int value;
};

Вы можете найти подробную информацию о том, как различные операции для обоих std::string а также std::vector.

0

это невозможно … ответ состоит в том, чтобы создавать регистр операторов и жесткий код больше.

0

Вы должны действительно использовать стандартную библиотеку шаблонов. Это сделает вашу жизнь намного более значимой, и у вас будет много свободного времени для документирования вашего кода!
Благодаря новейшим библиотекам 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"};
0

Самый простой способ — использовать массив указателей.
и не забудьте удалить указатели;)

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

0