【问题标题】:C++: how do I pass a variable for multiple arguments? [duplicate]C++:如何为多个参数传递一个变量? [复制]
【发布时间】:2011-04-06 16:56:51
【问题描述】:

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

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

【问题讨论】:

标签: c++


【解决方案1】:

重写函数,使其不再需要。让它接受一个向量,而不是一个数组,然后可以从 size() 函数中检索参数的数量。

如果我理解正确,您要调用的函数看起来像这样(忽略参数类型,为了简单起见,我只是使用所有整数)

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);
}

【讨论】:

  • 不可能,因为这是一个外部库 =(
  • @DerNalia:当然可以,您只需要将它包装起来。查看我的更新。
  • @DerNalia,嘿!最好再试一次。
  • 这实际上与真正的解决方案非常相似......有一个名为 fann_create_standard_array 的函数......它完全符合我一直在寻找的......我只需要阅读文档更多=D
【解决方案2】:

我认为您所描述的是您需要可变数量的参数。它被称为可变参数,这个链接应该对你有帮助:

http://en.wikipedia.org/wiki/Stdarg.h#varargs.h

不幸的是,我看到您的论点并非都是同一类型。这是个问题。您需要使用格式字符串(如 printf),以便您的代码在从堆栈中获取数据时能够推断出正确的类型。

【讨论】:

  • varargs 不应在 C++ 中使用,应完全避免使用。 C++0x 可变参数模板或boost::any 会是更好的建议。
  • 它们不都是同一种类型,我在我的问题中添加了,函数本身采用整数。
  • 问题与可变参数无关。
【解决方案3】:

对参数进行硬编码。这当然是最好的选择。

如果确实太多,请将它们打包成适当的数据结构并重写函数以接受它。

编辑:我看到您正在使用外部库。幸运的是,它们已经提供了另一个函数,该函数接受数据结构而不是可变数量的参数。

FANN_EXTERNAL struct fann *FANN_API fann_create_standard_array(
    unsigned        int     num_layers,
    const unsigned  int     * layers
)

只需使用它即可。

【讨论】:

  • 硬编码是有史以来最糟糕的主意。
  • @Potatosweater,不,你没有理解这个问题。
【解决方案4】:

请看下面的编辑!!(我原本以为这是纯家庭作业的所有用途)

只是为了有意义而阅读您的代码,您的参数“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 让他弄清楚。或者你修改被调用的函数来为他弄清楚。

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 2016-06-03
    • 2011-03-29
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多