Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将特定大小的数组作为参数传递?_C++_Arrays_Function_Arguments - Fatal编程技术网

C++ 如何将特定大小的数组作为参数传递?

C++ 如何将特定大小的数组作为参数传递?,c++,arrays,function,arguments,C++,Arrays,Function,Arguments,我有一个函数,可以生成带有错误处理的安全输入,因此输入数字(int)更简洁。但我希望其中一个参数是长度为2的可选数组,该数组包含所需变量输入的边界 以下是我目前拥有的: //function prototype void input_number(int* variable, string text = "Input : ", int boundaries[2] = NULL); //function call int variable; input_number(&variable,

我有一个函数,可以生成带有错误处理的安全输入,因此输入数字(int)更简洁。但我希望其中一个参数是长度为2的可选数组,该数组包含所需变量输入的边界

以下是我目前拥有的:

//function prototype
void input_number(int* variable, string text = "Input : ", int boundaries[2] = NULL);

//function call
int variable;
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10});
这不起作用,抛出错误
无法将参数“3”的“”转换为“int*”,将其转换为“void input\u number(int*,std::u cxx11::string,int*)”

如何将长度为2的数组传递给函数

另外,默认数组值的
int[]=NULL是正确的还是我完全错了?

尝试以下方法:

void input_number(int* variable, string text = "Input : ", std::array<int, 2> boundaries = {});
void input_number(int*变量,string text=“输入:”,std::数组边界={});
试试这个:

void input_number(int* variable, string text = "Input : ", std::array<int, 2> boundaries = {});
void input_number(int*变量,string text=“输入:”,std::数组边界={});

错误消息解释了问题-当数组作为参数传递给函数时,它将转换为指针(指向第一个元素)

一种解决方案是传递一个有两个成员的
struct
类型,并给它一个默认值。例如,因为
std::array
实际上是一个模板结构

void input_number(int* variable, std::string text = "Input : ", const std::array<int, 2> &bounds = {});

int variable;
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10});
这存在函数无法报告错误的问题(除了抛出异常),但您的方法也是如此

就个人而言,我也不会将边界作为默认参数传递。我只需要使用函数重载就可以了

 int input_number(std::string input, int lower_bound, int upper_bound)
 {
     // do whatever you want
 }

 int input_number(std::string input)
 {
      return input_number(input, std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
 }
int-input\u-number(std::string-input,int-lower\u-bound,int-upper\u-bound)
{
//你想干什么就干什么
}
int输入_编号(标准::字符串输入)
{
返回输入\编号(输入,标准::数值\限制::最小(),标准::数值\限制::最大());
}

强制调用方在第一个参数(在这种情况下,使用默认边界)之后不提供任何参数,或者在第二个参数(指定边界)之后不提供任何参数—仅传递一个附加参数将是可诊断的错误。与您所问的唯一不同之处在于,这不需要(隐式或显式)构造数组或其他数据结构来调用函数,这对调用方来说更容易处理。

错误消息解释了问题-数组被转换为指针(指向第一个元素)当作为参数传递给函数时

一种解决方案是传递一个有两个成员的
struct
类型,并给它一个默认值。例如,因为
std::array
实际上是一个模板结构

void input_number(int* variable, std::string text = "Input : ", const std::array<int, 2> &bounds = {});

int variable;
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10});
这存在函数无法报告错误的问题(除了抛出异常),但您的方法也是如此

就个人而言,我也不会将边界作为默认参数传递。我只需要使用函数重载就可以了

 int input_number(std::string input, int lower_bound, int upper_bound)
 {
     // do whatever you want
 }

 int input_number(std::string input)
 {
      return input_number(input, std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
 }
int-input\u-number(std::string-input,int-lower\u-bound,int-upper\u-bound)
{
//你想干什么就干什么
}
int输入_编号(标准::字符串输入)
{
返回输入\编号(输入,标准::数值\限制::最小(),标准::数值\限制::最大());
}

强制调用方在第一个参数(在这种情况下,使用默认边界)之后不提供任何参数,或者在第二个参数(指定边界)之后不提供任何参数—仅传递一个附加参数将是可诊断的错误。与您所问的唯一不同之处在于,这不需要(隐式或显式)构造数组或其他数据结构来调用函数,这对调用方来说可能更容易处理。

将数组作为常量&,但这正是当时的偏好:只需要打开更多的用例。在这个案例中,@TheKitchenSink一无所获。根据错误消息,Asker似乎在调用中使用了
{}
。不幸的是,{}并不意味着“没有数组”,而是意味着“一个填充了0的数组”。我的措辞很糟糕。我应该写
{0,10}
。如果参数在编译时已知,请使用模板参数而不是函数参数。将数组作为常量也是一个不错的建议,但在这一点上,这是首选:只需打开更多的用例。在这种情况下@TheKitchenSink没有任何好处。根据错误消息,Asker似乎在调用中使用了
{}
。不幸的是,{}并不意味着“没有数组”,而是意味着“一个填充了0的数组”。我的措辞很糟糕。我应该写
{0,10}
。如果参数在编译时已知,请使用模板参数而不是函数参数。谢谢您的详细回答!很多额外的建议,我喜欢。是的,即使我想避免函数重载,我想除了使用它们,我肯定别无选择!读一读,就像你刚才写的那样,重载不会比不重载占用更多的空间。。非常好的解决方案,谢谢!(+在输入之后的最后一个代码块中有一个额外的闭括号,可能会被删除)感谢您的详细回答!很多额外的建议,我喜欢。是的,即使我想避免函数重载,我想除了使用它们,我肯定别无选择!读一读,就像你刚才写的那样,重载不会比不重载占用更多的空间。。非常好的解决方案,谢谢!(+在输入之后的最后一个代码块中有一个额外的圆括号,可能会被删除)