无法在 C++ [duplicate] 中获取额外函数中数组的长度

Cannot get the Length of an Array in an extra Function in C++ [duplicate]

提问人:RubyKanima 提问时间:2/28/2022 最后编辑:RubyKanima 更新时间:2/28/2022 访问量:232

问:

我一直在用 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;
}
C++ 数组函数 按引用传递

评论

0赞 RubyKanima 2/28/2022
对不起,这个奇怪的标题,但堆栈溢出不会让我选择另一个。
0赞 pm100 2/28/2022
你正在使用的这个函数是什么。size
0赞 JohnFilleau 2/28/2022
请提供一个最小的可重复示例。否则,你会得到 100 个关于小事的问题,最终会浪费你自己的时间。
0赞 JohnFilleau 2/28/2022
发布错误时,请完整发布错误。不要为了简洁起见而截断。
0赞 RubyKanima 2/28/2022
我做了。。。它只与函数有关,不需要其他任何东西,但我真的不知道 size() 需要哪一个才能工作。

答:

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_arrayint *

并且没有为指针定义标准函数。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;错误消息表示链接器看不到函数定义。它与您的问题和答案没有任何共同之处。