所以,在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微控制器无法使用std lib。
答案 0 :(得分:2)
在C ++中,处理可变大小数组的规范方法是使用vector
std::vector<std::string> options;
options.push_back("First option");
options.push_back("Second option");
options.push_back("Third option");
然后您可以使用options.size()
来了解有多少元素。
在开始使用该语言之前,您还可以从封面阅读good C++ book来帮助自己。由于某些原因,C ++不是通过实验学习的正确语言,最重要的是:
答案 1 :(得分:0)
最好的选择,以避免你陷入的几个陷阱:
这会让你的课看起来像:
class MenuSetting
{
public:
std::string name;
int min;
std::vector<std::string> options;
int max;
int step;
int value;
};
您可以找到有关std::string
和std::vector
的各种操作的详细信息。
答案 2 :(得分:0)
它不可能......答案是创建案例陈述和硬代码。
答案 3 :(得分: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;
}
我认为如果您使用智能指针(一个简单的指针并不难实现),它会对您有所帮助 我想你可以参考这个网站Implementing a simple smart pointer in C++。
此外,我认为这个答案对您有用https://stackoverflow.com/a/279032/2689696
答案 4 :(得分: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"};