C ++:如何为多个参数传递变量?

时间:2011-04-06 16:56:52

标签: c++

  

可能重复:
  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);

我想要做的是传递命令行参数来改变多少层,以及每个隐藏层的值是什么(这个函数调用中的中间参数),所以我不要每次我想重新配置网络时都必须重新编译程序。

4 个答案:

答案 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,让他搞清楚。或者你修改被调用的函数来为他计算出来。