2017-06-16 11 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'までのインデックスで扱われます。したがって、 'memo [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; 
} 

それが正常に働いていなかったとして、私はいくつかの変更を行いました。

関連する問題