2017-06-16 65 views
1

如何通過引用傳遞數組,如果數據類型是typedef。我正在學習C++,我閱讀了引用調用的概念,但是當我按照這種方式實現時 - 我得到一個錯誤(在代碼之後粘貼下面)。請任何人都可以解釋發送一個數組作爲參考調用的最佳方式嗎?如何在函數參數中引用數組?

#include <iostream> 
#include <vector> 
using namespace std; 

typedef unsigned long ulong; 

ulong fib_dynamic(ulong n, ulong &memo[]){ 
    if(n < 2) return 1; 
    if(memo[n] == 0){ 
    memo[n] = fib_dynamic(n-1, memo) + fib_dynamic(n-2, memo); 
    } 
    return memo[n]; 
} 

ulong fib_iterative(ulong n){ 
    ulong fib[n+1]; 
    fib[0] = 1; 
    fib[1] = 1; 
    for(int i=2; i<n; i++) { 
    fib[i] = fib[i-1] + fib[i-2]; 
    } 
    return fib[n-1]; 
} 

int main(){ 

    ulong n; 
    cout << "Welcome to Fib Calculator\nEnter the n:"; 
    cin >> n; 
    ulong memo[n]; 

    cout << endl << n << " th fib num(dynamic) = " << fib_dynamic(n,memo) << endl; 
} 

//錯誤

1-fib-dp.cpp:13:47: error: 'memo' declared as array of references of type 
     'unsigned long &' 
ulong fib_dynamic(ulong n, unsigned long &memo[]){ 
              ^
1-fib-dp.cpp:37:53: error: no matching function for call to 'fib_dynamic' 
    cout << endl << n << " th fib num(dynamic) = " << fib_dynamic(n,memo) << endl; 
                ^~~~~~~~~~~ 
1-fib-dp.cpp:13:7: note: candidate function not viable: no known conversion from 
     'ulong [n]' to 'int' for 2nd argument 
ulong fib_dynamic(ulong n, unsigned long &memo[]){ 
    ^
2 errors generated. 
+0

爲什麼你覺得你首先需要一個參考?使它成爲'ulong memo []' –

+0

還要注意''ulong memo [n]'有'n'個元素,索引爲'0'到'n-1'。因此'備忘錄[n]'通過緩衝區溢出展現了未定義的行爲。 –

+0

'ulong&memo []'是一個數組(指針)到ulong's('ulong&')的引用。 'ulong(&memo)[]'是對'ulong'數組的引用。 –

回答

5

使用,因爲這是一個std::vector是你想要一個動態大小的數組(即你的數組的大小在運行時決定)的情況。按引用傳遞的載體,注意不要出界

#include <iostream> 
#include <vector> 
using namespace std; 

ulong fib_dynamic(ulong n, std::vector<unsigned long>& memo){ 
    if(n < 2) return 1; 
    if(memo[n] == 0){ 
     memo[n] = fib_dynamic(n-1, memo) + fib_dynamic(n-2, memo); 
    } 
    return memo[n]; 
} 

int main() { 

    ulong n; 
    cout << "Welcome to Fib Calculator\nEnter the n:"; 
    cin >> n; 
    std::vector<unsigned long> memo(n + 1); 

    cout << endl << n << " th fib num(dynamic) = " << fib_dynamic(n,memo) 
     << endl; 
} 
1

數組違約指針傳遞的。 閱讀thisthis

碼 -

#include <iostream> 
#include <vector> 
#include <bits/stdc++.h> 
using namespace std; 

typedef unsigned long ulong; 


ulong fib_dynamic(ulong n, ulong (*memo)){ 
    if(n < 2) return 1; 
    if(memo[n]!=0)return memo[n]; 
    if(memo[n] == 0){ 
    memo[n] = fib_dynamic(n-1, memo) + fib_dynamic(n-2, memo); 
    } 
    return memo[n]; 
} 

ulong fib_iterative(ulong n){ 
    ulong fib[n+1]; 
    fib[0] = 1; 
    fib[1] = 1; 
    for(ulong i=2; i<n; i++) { 
    fib[i] = fib[i-1] + fib[i-2]; 
    } 
    return fib[n-1]; 
} 

int main(){ 
    ulong n; 
    cout << "Welcome to Fib Calculator\nEnter the n:"; 
    cin >> n; 
    ulong memo[n+1]; 
    memset(memo,0,sizeof memo); 
    memo[0]=memo[1]=1; 
    cout << endl << n << " th fib num(dynamic) = " << fib_dynamic(n,memo) << endl; 
} 

我做了一些修改,因爲它不能正常工作。