2010-07-30 69 views
1

我不得不类,与这些方法的一个执行器:在一个结构在运行时处理的可变数量的参数

  1. 执行器()
  2. 结构执行(字符串s)
  3. 查找(字符串名称,INT模块,INT NUM,...)

和分析器:

  1. 分析器()
  2. 结构解析(字符串s)

的Exectuers Execute方法调用解析器解析方法。解析器然后将字符串卡入较小的位(它将在; -sign上爆炸字符串)并将结构返回给Execute方法。它用来调用查找方法的结构。 该解析返回的结构保持的一些标准信息:

  1. 的命令名
  2. 甲senderId(用户名,MAC地址和密码)
  3. 的参数个数可变

这就是我的问题。 Lookup方法需要可变参数,但是如何通过结构来处理这些可变参数的交接?我不是C和C++的专家。我应该把这两个班级集中到一起吗?所以Parser方法可以调用Execute方法,避免使用结构体。 或者也许有一种解析运行时参数的未知变量的方法?通过某种数组?

编辑 我不能使用C++的STL库。我只使用C++类和虚拟功能。我写一个编译器,Im限制使用几乎所有的C库+ C++(虚拟和类)的魔法技能。 SOory不会马上告诉你。

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

+0

阅读你怎么打算使用这个变量的参数集? – Jacob 2010-07-30 09:34:06

+0

变量集的参数传递给Commands Execute方法。这种方法是纯虚拟的,并且保存程序员定义的代码。通过查找方法找到该命令(它通过一个列表并找到匹配模块ID和传递给查找方法的命令名称的命令)。然后由程序员决定执行Commands Execute方法来处理参数。 – mslot 2010-07-30 09:37:36

回答

1

使用std :: vector < >或一个可容纳任意数量条目的simular容器。

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()或新的()以产生用于arguments阵列。

我会建议将argumentCount,maxArgumentCount和参数包装在一个单独的类中,它可以处理malloc/new和free/delete。这将使防止内存泄漏更容易。最后,你会写出自己的vector_of_arg_t类,所以也许看看一些基本的矢量实现。网络上必须有教程。

+0

哦。我很抱歉:(我标记了错误的方式,我使用了虚拟和类C++功能,我忘了写我不能使用C++ STL库,这是因为编译器的限制,我已经更新了我的问题 – mslot 2010-07-30 09:38:38

+0

@mslot呵呵?“他们”不希望你使用经过良好测试,优化的代码,但更喜欢你重新发明轮子?奇怪... – Sjoerd 2010-07-30 09:43:33

+0

嵌入式系统。我使用avr-gcc编译器,所以我不能使用整洁的C++功能 – mslot 2010-07-30 09:45:00

1

如下您可以宣布你的Lookup方法:

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

通过存储在args数组变量参数,你可以有你想要的。

+0

由于我编辑过,我不能使用STL库,我更新了我的问题灰。但也许我可以用一个标准的C类数组来做到这一点? – mslot 2010-07-30 09:44:09

+0

是的,你当然可以。假设你可以调用'malloc()',那就是。 – 2010-07-30 09:45:56

+0

Aaah Im允许这样做!在我的Parse方法中,我调用malloc,返回结构中的指针并将指针或数组包含的内容分析到Lookup函数。 – mslot 2010-07-30 09:48:40

1

问:我如何写一个函数,它采用可变数量的参数,并将它们传递给其他一些功能(它采用可变数量的参数)? A:一般来说,你不能。理想情况下,您应该提供接受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

+0

+1链接!在此之前,我已经搜索了很多,但我没有找到。谢谢。 – mslot 2010-07-30 09:56:13

+0

这很晦涩。我只记得它,因为很久以前我被迫进入OP这样的位置。编写可变参数的C函数,甚至更麻烦的交换都很麻烦。 – bradgonesurfing 2010-07-30 10:01:11

相关问题