可能重复:
Passing Variable Number of Arguments with different type - C++
我有一个带n个参数的函数。
我想称之为function_name(number_args - 1, input, args_from_console[], output)
我该怎么做?
*带有n个参数的函数已经编写并且有效......我只是不想对传入的变量进行硬编码。
编辑:(添加代码)
struct fann *ann = fann_create_standard(num_layers,
Config::NUMBER_OF_INPUT_NEURONS,
Config::WIDTH_IN_BITS,
Config::WIDTH_IN_BITS,
Config::NUMBER_OF_OUTPUT_NEURONS);
上面的函数至少可以有3个参数......所需的参数是num_layers,num_input和num_output)
可选参数是神经网络的隐藏层(他们称之为不重要......但基本上......它可能看起来像这样:
fann_create_standard(#layers, #input, #hidden1, #hidden2, #hidden3, #hidden4, ... #output);
我想要做的是传递命令行参数来改变多少层,以及每个隐藏层的值是什么(这个函数调用中的中间参数),所以我不要每次我想重新配置网络时都必须重新编译程序。
答案 0 :(得分:0)
对参数进行硬编码。这当然是最好的选择。
如果真的太多,请将它们打包成适当的数据结构并重写函数以接受它。
修改:我发现您使用的是外部库。幸运的是,他们已经提供了另一个接受数据结构而不是可变数量参数的函数。
FANN_EXTERNAL struct fann *FANN_API fann_create_standard_array(
unsigned int num_layers,
const unsigned int * layers
)
只需改用它。
答案 1 :(得分:0)
我认为你所描述的是你想要一个可变数量的参数。它被称为varargs,这个链接应该对你有所帮助:
http://en.wikipedia.org/wiki/Stdarg.h#varargs.h
不幸的是,我发现你的论点并非都是同一类型。这是个问题。您需要使用格式字符串(如printf),以便您的代码能够在从堆栈中获取数据时推断出正确的类型。
答案 2 :(得分:0)
重写该功能,使其不需要。如果它使用向量而不是数组,那么可以从size()函数中检索参数的数量。
如果我理解正确,你要调用的函数看起来像这样(忽略参数类型,为了简单起见,我只是使用了所有的int)
int func(int n, int input, int args[], int & output);
你不想弄清楚n。只需包装该函数:
int func_wrap(int input, std::vector<int> & args, int & output)
{
return func(args.size() - 1, input, &args[0], output);
}
答案 3 :(得分:-2)
看下面的编辑!! (我原本以为这里有纯家庭作业的所有专项)
只是阅读你的感觉代码,可能是你的参数“args_from_console []”实际上是传递给main()的char ** argv(或char * argv []),但是这里以伪装的形式呈现给你?换句话说,您的函数的 调用者 是否看起来像这样?
int
main ( int argc, char **argv ) {
...
...
function_name(number_args - 1,
input,
argv, // <-- from the command line, right?
output);
..
return 0;
}
如果是这样,那么main()将为您的函数提供它在启动时收到的标记化命令行参数字符串。此参数是指向字符指针数组的指针。该数组的第一个成员指向第一个命令行参数;第二个成员指向第二个命令行参数;对于用户键入以启动main()程序的每个命令行参数,依此类推。
问题:你怎么知道在main()启动时传递了多少个离散参数?
编辑:我在OP之后编辑了这个例子。
如果您只想将命令行参数提供给被调用函数,只需传入int argc;和char ** argv,让他搞清楚。或者你修改被调用的函数来为他计算出来。