2015-03-31 90 views
0

我在從一個函數返回一個數組到主函數時遇到了問題。該數組也被用作另一個函數的參數。C++ - 返回一個數組到主函數並將數組傳遞給另一個函數

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

基本上,這是一個不完整的猜數遊戲,其中向用戶給出一個提示如所共有的所述隨機產生的數以及所述用戶輸入的猜測的位數。我得到一個void類型的錯誤cout << black_marker(ran(r), guess(g));這是不尋常的,因爲這個傳遞引用方法的工作原理,否則,當我在void函數的主體中有一個cout語句。

+3

歡迎C++和所有內置作爲其標準庫的一部分,好的容器。使用'std :: vector '。並閱讀*通過常量引用*。 – Bathsheba 2015-03-31 14:50:38

+0

black_marker作爲第一個參數數組,但你提供了一個void函數void ran(r) – 2015-03-31 14:52:52

回答

0

black_marker(ran(r), guess(g))black_marker需要兩個數組,但ran()guess(g)返回空隙,所以你最終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代替。

+0

是的,我意識到'std :: vector'更方便。 – Marbille 2015-03-31 15:00:39

0

當您使用

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

black_marker是通過使用ran(r)guess(g)的返回值調用。這些函數的返回類型是voidblack_marker的參數類型被聲明爲int []。這是編譯器抱怨的參數類型不匹配。

使用

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

只是一個快速注:

你的功能

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

需要整型數組(引用)作爲輸入參數,但是你用函數調用爲他們提供無效:

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

自像巴勃羅指出的那樣,ran(r)和guess(g)返回void(nothing)。

Sahu的解決方案將運行良好。

此外,如果你想堅持原來的函數調用:

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

那麼你可能會返回從功能上「跑」中的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; 
} 
相關問題