在结构中在运行时处理可变数量的参数

时间:2010-07-30 09:27:40

标签: c++ c arrays struct

我必须使用这些方法的类,Executer:

  1. 执行器()
  2. struct Execute(string s)
  3. 查找(字符串名称,int模块,int num,...)
  4. 和Parser:

    1. 分析器()
    2. struct Parse(string s)
    3. Exectuers Execute方法调用Parsers Parse方法。然后,Parser将字符串放入较小的位(它会触发; -sign上的字符串)并将结构返回给Execute方法。它用于调用Lookup方法的结构。 Parse返回的结构包含一些标准信息:

      1. 命令名称
      2. senderId(用户名,mac地址和密码)
      3. 可变数量的参数
      4. 这是我的问题。 Lookup方法采用变量参数,但是如何处理struct对这些变量参数的移交?我不是C和C ++的专家。我应该把这两个课程群众化吗?因此,Parser方法可以调用Execute方法,从而节省了结构。 或者也许有一种方法可以在运行时解析一个未知的参数变量?通过某种阵列?

        修改 我不能使用C ++中的STL库。我只使用C ++类和虚拟功能。我写的编译器,我限制使用几乎所有的C库+ C ++的神奇技能(虚拟和类)。因为没有马上告诉我们。

        编辑2 我将代码写入嵌入式系统,从而使用avr-gcc编译我的代码。这就是为什么我不能使用STL。 avr-gcc不支持这个。

3 个答案:

答案 0 :(得分:1)

使用std :: vector<>或者可以容纳任意数量条目的类似容器。

struct {
  std::string commandName;
  sender_t senderId;
  std::vector<arg_t> arguments;
};

编辑:哦,你不能使用std :: vector。在这种情况下:使用数组并存储长度:

struct {
  const char* commandName;
  sender_t senderId;
  int argumentCount;
  int maxArgumentCount; // you might not need this
  arg_t* arguments; // pointer to array of (at least) argumentCount elements.
};

使用malloc()或new()为arguments创建数组。

我建议将argumentCount,maxArgumentCount和arguments包装在一个单独的类中,该类也可以处理malloc / new和free / delete。这样可以更容易地防止内存泄漏。

最后,你将编写自己的vector_of_arg_t类,所以也许看看一些基本的矢量实现。网上必须有相关的教程。

答案 1 :(得分:1)

您可以按如下方式声明Lookup方法:

void Lookup(string name, int module, int num, std::vector<std::string> &args);

通过将变量参数存储在args数组中,您可以拥有任意数量的参数。

答案 2 :(得分:1)

问:如何编写一个函数,该函数接受可变数量的参数并将它们传递给其他函数(它接受可变数量的参数)?

答:一般情况下,你不能。理想情况下,您应该提供接受va_list指针的其他函数的版本。

假设您要编写一个faterror函数,该函数将打印致命错误消息,然后退出。您可能希望根据问题15.5的错误函数来编写它:

    void faterror(const char *fmt, ...)
    {
        error(fmt, what goes here? );
        exit(EXIT_FAILURE);
    }

但是如何将faterror的论点交给错误并不明显。

<snip>

继续阅读

http://c-faq.com/varargs/handoff.html