【问题标题】:Defining correct parameters & Passing an array in a recursive function C++定义正确的参数并在递归函数 C++ 中传递数组
【发布时间】:2014-12-21 12:48:14
【问题描述】:

我正在学习 C++ 入门课程,之前在定义正确参数时遇到了困难,所以如果有人能指出我做错了什么,那就太好了。

这项任务是创建一个二分搜索函数,程序将在其中猜测用户正在考虑的数字。

这是我的代码:

#include <iostream>
using namespace std;


int b_search(int Arry[], int L, int R)                
{
   int M = 0;                                         
   char userAnswer = '-';

   M = (L + R) / 2;


   cout << "Is it " << Arry[M] << "? (l/h/z): ";
   cin >> userAnswer;

   if( (userAnswer != 'l') && (userAnswer != 'h') ) { 
      cout << "Thank you!" << endl;                   
   }
   else {                                             
      if (userAnswer == 'l') {                        
        b_search(Arry[], L, M); 
      }
      else {                                          
        b_search(Arry[], ++M, R);                     
      }
   }
   return;      
}


int main()                                            
{
    const int N = 100;
    int A[N];
    int i = 0;
    int value = 1;

    for(i = 0; i < N; ++i) 
    {
        A[i] = value;
        ++value;
    }

   cout << "Choose a number from 1 to 100." << endl << endl;
   cout << "Answer with:" << endl;
   cout << "   l - if your num is lower" << endl;
   cout << "or: " << endl;
   cout << "   h - if your num is higher" << endl;
   cout << "or: " << endl;
   cout << "   any other key if the guess is right." << endl << endl;

   b_search(N, 1, 100)

   return 0;

}

当我编译它时,第一个递归调用的第一个参数有问题。

这是来自 Code Pad 的错误消息:

In function 'int b_search(int*, int, int)':
Line 22: error: expected primary-expression before ']' token
compilation terminated due to -Wfatal-errors.

谢谢!

【问题讨论】:

    标签: c++ arrays recursion binary-search dev-c++


    【解决方案1】:

    在通过名称引用数组时不要使用方括号。假设您声明了一个名为A 的数组。那么:

    A: 是一个数组。

    A[5]:是A的一个元素。

    A[]: 不是一个有效的表达式。

    由于您想将数组以递归方式传递给 b_search 函数,而不是其任何元素,因此只需使用 Arry

    函数声明中的int Arry[]不是表达式,而是声明参数Arrydeclarator。声明符在某些方面类似于表达式,但有不同的语法规则。 [] 在声明器中表示“数组”,但在表达式中不表示。

    这里有一个与数组参数相关的微妙之处:当你声明一个函数接受一个数组参数时,参数的类型会自动重写为指针。所以Arry实际上是一个指针,而不是一个数组。在这种情况下,这个细节对你来说是不可见的,因为数组和指针在下标下的行为方式相同,并且数组在按值传递时会自动转换为指针。

    【讨论】:

    • 好的,非常感谢。那么在声明函数时需要在参数中声明符,而在调用函数时需要表达式?它编译正确,但现在我在 main() 中对 b_search() 的原始调用的第三个参数有问题。它说“ int 到 int* 的无效转换。”
    • @Sarah 是的,您使用声明器来声明参数和变量以及写下类型,但是在实际调用函数时,您必须传入表达式。而您现在的错误是因为您尝试将N 作为数组传入,而您应该传入A
    • @LightnessRacesinOrbit 它一个数组。它只衰减到一个指针,因为它是按值传递的,但它首先是一个数组。
    • @Brian: 不。Arry 是函数参数——一个指针——在你所说的衰减之后。 A 是一个数组。
    • 哦,我现在明白了。呃。我误读了错误消息。我认为出于某种原因它指的是第三个参数。非常感谢布赖恩,你很有帮助!!!
    【解决方案2】:

    您将b_search 定义为接收一个 int 数组、一个 int 和另一个 int。但是,您要做的第一件事:

    b_search(N, 1, 100); // Is invalid since N is an int but the function expects an array.
    

    尝试传入一个 const int、一个 int 和一个 int。第一个参数应该是一个 int 数组,而不是一个 int。

    我看到的另一个问题是在您尝试重复出现的b_search 的定义中,您使用第一个参数Arry[] 调用b_search。括号无效,因为Arry 已经是一个数组,你可以直接传入。

    【讨论】:

    • 最初传递 1100 也可能是错误的,因为它们被用作数组的索引。它应该是 0100 或者可能是 099,这取决于 b_search 的编写方式。
    • 不,它需要一个指针。不是数组。 Arry 不是数组。
    • 非常感谢 Lochemage 和 @ooga !
    猜你喜欢
    • 2021-08-07
    • 2013-10-21
    • 1970-01-01
    • 2014-02-07
    • 2016-01-08
    • 2020-12-13
    • 2018-05-07
    • 2022-01-25
    相关资源
    最近更新 更多