C++:如何为多个参数传递一个变量? [复制]

Posted

技术标签:

【中文标题】C++:如何为多个参数传递一个变量? [复制]【英文标题】:C++: how do I pass a variable for multiple arguments? [duplicate] 【发布时间】: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);

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

【问题讨论】:

嗯?能不能说的详细点,没看懂。。 是的,请清理这个问题。 你的意思是喜欢这些问题吗? ***.com/questions/41400/…***.com/questions/205529/…***.com/questions/1056411/… 你明确表示你是C++,所以我去掉了C标签。 完全重复:***.com/questions/3555583/… 【参考方案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 让他弄清楚。或者你修改被调用的函数来为他弄清楚。

【讨论】:

以上是关于C++:如何为多个参数传递一个变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数

使用 seaborn 绘图时,如何为色调参数指定多个变量?

如何为多个泛型类型使用关键字`where`? [复制]

C++:如何为多个重载函数保留公共代码路径?

如何为“IN 子句”传递可变参数

使用 azure webjobs 我如何为计划任务传递参数