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++:如何为多个参数传递一个变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章