我必须使用这些方法的类,Executer:
和Parser:
Exectuers Execute方法调用Parsers Parse方法。然后,Parser将字符串放入较小的位(它会触发; -sign上的字符串)并将结构返回给Execute方法。它用于调用Lookup方法的结构。 Parse返回的结构包含一些标准信息:
这是我的问题。 Lookup方法采用变量参数,但是如何处理struct对这些变量参数的移交?我不是C和C ++的专家。我应该把这两个课程群众化吗?因此,Parser方法可以调用Execute方法,从而节省了结构。 或者也许有一种方法可以在运行时解析一个未知的参数变量?通过某种阵列?
修改 我不能使用C ++中的STL库。我只使用C ++类和虚拟功能。我写的编译器,我限制使用几乎所有的C库+ C ++的神奇技能(虚拟和类)。因为没有马上告诉我们。
编辑2 我将代码写入嵌入式系统,从而使用avr-gcc编译我的代码。这就是为什么我不能使用STL。 avr-gcc不支持这个。
答案 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>
继续阅读