C ++ - 将数组返回到main函数并将数组传递给另一个函数

时间:2015-03-31 14:45:27

标签: c++ arrays

我将数组从函数返回到main函数时遇到了问题。该数组也用作另一个函数的参数。

#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 << black_marker(ran(r), guess(g));的void类型错误,这是不寻常的,因为这个pass-by-reference方法在void函数体中有cout语句时会起作用。

3 个答案:

答案 0 :(得分:0)

使用时

black_marker(ran(r), guess(g))
使用black_markerran(r)的返回值调用

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

使用

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

答案 1 :(得分:0)

black_marker(ran(r), guess(g)) black_marker需要两个数组,但ran()guess(g)返回void,因此您最终会使用black_marker(void, void),但这将无效。< / p>

你想做的是

#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

答案 2 :(得分:0)

快速说明一下:

你的功能

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

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

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

因为run(r)和guess(g)返回void(没有),因为Pablo指出。

Sahu的解决方案将运作良好。

此外,如果您想坚持原始函数调用:

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

然后你可以从函数中返回int指针&#34; ran&#34;并且&#34;猜测&#34;如下:

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;
}