【问题标题】:C++ - Returning an array to main function and passing array to another functionC++ - 将数组返回给主函数并将数组传递给另一个函数
【发布时间】:2015-06-04 23:02:05
【问题描述】:

我在将数组从函数返回到主函数时遇到问题。该数组还用作另一个函数的参数。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;

void ran(int list[]);
void guess(int list[]);
int black_marker(int num1[], int num2[]);

int main(){
    int r[4];
    int g[4];
    cout << black_marker(ran(r), guess(g));
}

void ran(int list[]){       //random number generator
    srand (time(NULL));
    int a = rand() % 6 + 1;
    int b = rand() % 7 + 1;
    while(a == b)
        b = rand() % 7 + 1;
    int c = rand() % 8 + 1;
    while(a == c || b == c)
        c = rand() % 8 + 1;
    int d = rand() % 9 + 1;
    while(a == d || b == d || c == d)
        d = rand() % 9 + 1;

    int num_random[4] = {a, b, c, d};
}

void guess(int list[]){         //takes user input for a guess
    int random_no[4];
    for(int i = 0; i < 4; i++){
        cin >> random_no[i];
    }
}

int black_marker(int num1[], int num2[]){   //Counts how many digits from random number
    int black_count = 0;                    //is similar to the user's guess
    for(int i = 0; i < 4; i++){
        if(num1[i] == num2[i]){
            black_count += 1;
        }
    }
    return black_count;
}

基本上,这是一个不完整的猜数游戏,其中向用户提供提示,例如随机生成的数字共有的位数和用户输入的猜测。我收到cout &lt;&lt; black_marker(ran(r), guess(g)); 的 void 类型错误,这是不寻常的,因为当我在 void 函数的主体中有 cout 语句时,这种传递引用方法可以正常工作。

【问题讨论】:

  • 欢迎使用 C++ 以及作为其标准库的一部分内置的所有漂亮容器。使用std::vector&lt;int&gt;。并阅读通过常量引用传递
  • black_marker 作为第一个参数数组,但您提供了一个 void 函数 void ran(r)

标签: c++ arrays


【解决方案1】:

只是一个简短的说明:

你的功能

int black_marker(int num1[], int num2[]); 

将整数数组(引用)作为输入参数,但是您可以使用函数调用为它们提供 void:

black_marker(ran(r), guess(g)); 

因为 ran(r) 和 guess(g) 返回 void(无),正如 Pablo 指出的那样。

Sahu 的解决方案效果很好。

另外,如果你想坚持原来的函数调用:

black_marker(ran(r), guess(g));

然后你可以从函数“ran”和“guess”返回int指针,如下所示:

int* ran(int list[]) { 
    ...
    return list;
}

int* guess(int list[]) {  
    ...
    return list;
}

那么你的函数调用就可以正常工作,因为大小是已知的 (=4)。

或者,您可以使用数组引用:

int ( &ran( int (&list)[4] ) )[4] { 
    return list;
}

int ( &guess( int (&list)[4] ) )[4] { 
    return list;
}

【讨论】:

    【解决方案2】:

    black_marker(ran(r), guess(g)) black_marker 需要两个数组,但 ran()guess(g) 返回 void,所以你最终会得到 black_marker(void, void),这将不起作用。

    你想做的是

    #include <cmath>
    #include <iostream>
    
    using namespace std;
    
    void ran(int list[]){       //random number generator
        srand (time(NULL));
        int a = rand() % 6 + 1;
        int b = rand() % 7 + 1;
        while(a == b)
            b = rand() % 7 + 1;
        int c = rand() % 8 + 1;
        while(a == c || b == c)
            c = rand() % 8 + 1;
        int d = rand() % 9 + 1;
        while(a == d || b == d || c == d)
            d = rand() % 9 + 1;
    
        list[0] = a;
        list[1] = b;
        list[2] = c;
        list[3] = d;
    }
    
    void guess(int list[]){         //takes user input for a guess
        int random_no[4];
        for(int i = 0; i < 4; i++){
            cin >> list[i];
        }
    }
    int black_marker(int num1[], int num2[]){   //Counts how many digits from random number
        int black_count = 0;                    //is similar to the user's guess
        for(int i = 0; i < 4; i++){
            if(num1[i] == num2[i]){
                black_count += 1;
            }
        }
        return black_count;
    }
    int main(){
        int r[4];
        int g[4];
        ran(r);
        guess(g);
        cout << black_marker(r, g) << endl;
    }
    

    但是,您应该放弃 C 样式的数组,改用 std::vectorstd::array

    【讨论】:

    • 是的,我意识到std::vector 更方便。
    【解决方案3】:

    当你使用时

    black_marker(ran(r), guess(g))
    

    black_marker 使用ran(r)guess(g) 的返回值调用。这些函数的返回类型是voidblack_marker 的参数类型被声明为 int []。这就是编译器抱怨的参数类型不匹配。

    使用

    ran(r);
    guess(g);
    cout << black_marker(r, g);
    

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2015-08-07
      • 2021-02-08
      • 2013-06-26
      • 2014-06-28
      • 1970-01-01
      相关资源
      最近更新 更多