提问人:RubyKanima 提问时间:2/28/2022 最后编辑:RubyKanima 更新时间:2/28/2022 访问量:232
无法在 C++ [duplicate] 中获取额外函数中数组的长度
Cannot get the Length of an Array in an extra Function in C++ [duplicate]
问:
我一直在用 VisualStudio 用 C++ 编写一个小程序,虽然我没有找到找到数组元素的好方法,但我只是制作了自己的函数来从数组中获得最大值。但我也不能这样做,因为 size() 函数在那里不起作用。
我在 中使用了大小,它工作正常,但在我的函数中它不起作用,因为它说.我之前尝试过初始化变量,但它仍然不起作用。int main()
int biggest_num(int tmp_array[])
no instance of overloaded function matches the argument list
#include <iterator>
int biggest_num(int tmp_array[] = {}) {
int q = 0;
int array[] = tmp_array; // Error: C++ initialization with '{...}' expected for aggregate object
for (int i = 0; i < size(array); i++) q = (q < array[i]) ? q : array[i]; //size(array) Error: <error-type>
return q;
}
int main(){
int nums[] = {23, 34, 6, 2, 3, 456, 32, 76, 24, 7, 9, 47};
cout << biggest_num(nums) << endl;
}
无需初始化:
#include <iterator>
int biggest_num(int tmp_array[]){
int q = 0;
for (int i = 0; i < size(tmp_array); i++) q = (q < tmp_array[i]) ? q : tmp_array[i]; // size() Error: no instance of overloaded function matches the argument list
return q;
}
int main(){
int nums[] = {23, 34, 6, 2, 3, 456, 32, 76, 24, 7, 9, 47};
cout << biggest_num(nums) << endl;
}
溶液:
#include <iostream>
using namespace std;
int biggest_num(const int tmp_array[], size_t n)
{
int q = tmp_array[0];
for (size_t i = 1; i < n; i++)
{
if (q < tmp_array[i]) q = tmp_array[i];
}
return q;
}
int main() {
char yn = ' ';
int nums[] = { 1, 2, 3 };
cout << biggest_num(nums, size(nums)) << endl;
}
答:
0赞
pm100
2/28/2022
#1
您无法确定像这样传递给您的数组的长度。您还需要将长度作为参数传递。
话虽如此,如果您使用 std::vector,生活会轻松得多。(提示“我们不允许使用 Vector”响应)
评论
0赞
RubyKanima
2/28/2022
我(显然)是C++的新手,所以...你不能传递任何数组,或者只是不能传递长度?
0赞
WhozCraig
2/28/2022
@RubyKanima 您可以随心所欲地传递数组。然而,除非其中的数据包含某种终止逻辑(例如:本机 C 样式字符串的 nullchar 终止符),否则其有用性是值得怀疑的。否则,您还需要提供一个量级(以某种方式)。
0赞
pm100
2/28/2022
@RubyKanima你可以传递一个数组,但 C++ 无法判断作为指向函数的指针传递的数组的长度。它所拥有的只是开始地址和元素的大小,它不知道何时结束。这就是 std::vector 的用途,当需要动态大小的数组时,每个有经验的 c++ 开发人员都会使用它。在您的示例中,您有一个固定的大小,因此将该大小作为参数传递,或更改为 vector
0赞
Vlad from Moscow
2/28/2022
#2
此函数声明
int biggest_num(int tmp_array[]){
for (int i = 0; i < size(tmp_array); i++) int q = (q < tmp_array[i]) ? q : tmp_array[i]; // size() Error: no instance of overloaded function matches the argument list
return q;
}
由编译器调整为以下声明
int biggest_num(int *tmp_array){
for (int i = 0; i < size(tmp_array); i++) int q = (q < tmp_array[i]) ? q : tmp_array[i]; // size() Error: no instance of overloaded function matches the argument list
return q;
}
也就是说,实际上函数中的参数具有指针类型。tmp_array
int *
并且没有为指针定义标准函数。std::size
此外,在任何情况下,函数的主体都没有意义,因为变量 q 是未初始化的,并且具有 for 循环的作用域,在该循环之外它不处于活动状态。
您需要的是以下内容
template <size_t N>
int biggest_num( const int ( &tmp_array )[N] )
{
int q = tmp_array[0];
for ( size_t i = 1; i < N; i++ )
{
if ( q < tmp_array[i] ) q = tmp_array[i];
}
return q;
}
这是一个演示程序
#include <iostream>
#include <iterator>
template <size_t N>
int biggest_num( const int ( &tmp_array )[N] )
{
int q = tmp_array[0];
for ( size_t i = 1; i < N; i++ )
{
if ( q < tmp_array[i] ) q = tmp_array[i];
}
return q;
}
int main()
{
int nums[] = {23, 34, 6, 2, 3, 456, 32, 76, 24, 7, 9, 47};
std::cout << biggest_num(nums) << std::endl;
}
或者函数可以按以下方式声明
int biggest_num( const int tmp_array[], size_t n )
{
int q = tmp_array[0];
for ( size_t i = 1; i < n; i++ )
{
if ( q < tmp_array[i] ) q = tmp_array[i];
}
return q;
}
在这种情况下,它被称为
cout << biggest_num( nums, std::size( nums ) ) << endl;
尽管在这种情况下,如果将返回指向数组中最大元素的指针,则该函数将更安全,因为通常用户可以将值为零作为第二个参数传递。
也就是说,该函数应该像这样声明
const int * biggest_num( const int tmp_array[], size_t n )
{
const int *q = tmp_array;
for ( size_t i = 1; i < n; i++ )
{
if ( *q < tmp_array[i] ) q = tmp_array + i;
}
return q;
}
并称
cout << *biggest_num( nums, std::size( nums ) ) << endl;
评论
0赞
RubyKanima
2/28/2022
我认识到 q 的问题,在;D之前已经编辑了它我尝试了您的解决方案,但现在我的整个代码都坏了。唯一没有损坏的部分是功能。
0赞
Vlad from Moscow
2/28/2022
@RubyKanima我不知道你的“整个代码”是什么。似乎您的“整个代码”作为您的初始函数定义存在缺陷。请参阅我的回答中提供的演示程序。
0赞
RubyKanima
2/28/2022
它可以在一个新文件中单独工作,但它不能在我已经编写的代码中工作,因为它说我应该使用并将<<检测为错误......我会试着弄清楚发生了什么cout;
0赞
RubyKanima
2/28/2022
它说“标识符'biggest_num'未定义”在cout << *biggestnums(nums, size(nums) << endl;
0赞
Vlad from Moscow
2/28/2022
@RubyKanima 首先,您需要添加一个右括号 cout << *biggestnums(nums, size(nums) ) << endl;错误消息表示链接器看不到函数定义。它与您的问题和答案没有任何共同之处。
下一个:C 传递参考误解
评论
size