【问题标题】:how to populate variable length array of strings如何填充可变长度的字符串数组
【发布时间】:2014-02-13 21:30:17
【问题描述】:

所以,在 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 微控制器不能使用标准库。

【问题讨论】:

  • 这个问题用 C 和 C++ 双重标记;现在它已被修改,因此它仅标记为 C,基于 cmets 中对Zac Howlandanswer 的讨论。问题中的代码显然应该是 C++ (class GlobalMenu),这使得 C 标记看起来很奇怪。事情很混乱!
  • 在我的任何编辑中都没有用 c 标记。它的 C++。

标签: c++ atmega


【解决方案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() 来知道有多少元素。

在开始使用该语言之前,您还可以通过从头到尾阅读good C++ book 来帮自己一个忙。 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::stringstd::vector 的各种操作的详细信息。

    【讨论】:

    • 我一直在避免使用 std,因为我包含它时找不到它。
    • 如果要使用std::string,则必须包含&lt;string&gt;&lt;vector&gt;,并且声明using namespace std;
    • 它没有找到&lt;string&gt; 它可以找到string.h,但是std 没有字符串。我不确定它是否与我的 makefile 有关,我将其附加到问题中
    • 你用的是什么编译器?
    • 我试过using namespace stdstring,没有using namespace stdstd::string,甚至组合,但没有一个工作。
    【解决方案3】:

    不可能...答案是创建案例语句和更多的硬代码。

    【讨论】:

      【解决方案4】:

      您应该真正使用标准模板库。它会让你的生活变得更有意义,并且你会有很多额外的空闲时间来记录你的代码! 使用最新的 std 库和 c++11,您的代码可以简化为看起来像 javascript sn-p 一样干净:

      #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"};
      

      【讨论】:

        【解决方案5】:

        最简单的方法是使用指针数组
        并且不要忘记删除指针;)

        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

        【讨论】:

        • options[][5] 就是一个未知长度的选项列表,包含许多长度为5的字符串。所以.. ['on', 'off'] 或 ['yes', 'no', 'maybe']
        • 您可以为选项创建一个类,而不是 char 说 class options { private: char* strings[/*Some size*/]; int numberOfStrings; public: int getNoOfString(); char* getString(int index); bool setStringIndex // blah blah blah } 或更好的东西;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多