如何填充可变长度的字符串数组

时间:2014-02-13 21:30:18

标签: c++ atmega

所以,在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。

5 个答案:

答案 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. 有时C ++是不合逻辑的(因为它的历史),无论你多么聪明,你都无法猜测历史。你需要研究它。
  2. 当你犯了一个错误时,你不能指望语言来帮助你(天使没有运行时错误,只是未定义的行为守护进程)。

答案 1 :(得分:0)

最好的选择,以避免你陷入的几个陷阱:

  1. 使用std :: string而不是字符指针和缓冲区
  2. 使用std :: vector而不是编译器大小的数组
  3. 这会让你的课看起来像:

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

    您可以找到有关std::stringstd::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"};