2017-01-12 21 views
0
#include <iostream> 
#include <cstdlib> 

using namespace std; 

unsigned int idiv_rec(unsigned int a, unsigned int b) 
{ 
if (b == 0) exit(EXIT_FAILURE); 
unsigned int l = 0, h = a; 
return idiv_rec(a, b, l, h); 
} 

unsigned int idiv_rec( unsigned a, unsigned b, unsigned &l, unsigned &h) { 
unsigned int m = (l + h)/2; 
bool greater = m * b > a; 
h = greater ? m : h; 
l = greater ? l : m; 

if (h - l > 1) 
    return idiv_rec(a, b, l, h); 
else 
    return l; 
} 

の右の数と機能を持っているにもかかわらず、それは「unsigned int型idiv_rec(unsigned int型、unsigned int型)」を機能させる引数が多すぎますが、私は、引数

あまりにも多くの引数を言う

何かを含める必要がありますか?コールの時点で

+1

あなたは2つの引数を取る関数を宣言して4を渡しています。 – newGuy

+1

関数idiv_rec()を呼び出すときに4つの引数を渡していますが、関数のパラメータは2つの整数だけです –

+0

型あなたの関数のオーバーロードのaとbは 'unsigned int'ではありません。これは' unsigned int idiv_rec(unsigned int a、unsigned int b、unsigned&l、unsigned&h) 'です。 –

答えて

1
unsigned int idiv_rec(unsigned int a, unsigned int b) 
{ 
if (b == 0) exit(EXIT_FAILURE); 
unsigned int l = 0, h = a; 
return idiv_rec(a, b, l, h); //<---here 
} 

、コンパイラがあなた4引数のバージョンを参照してくださいにまだあります。あなたは(関数スコープ内、はいC++がそれを可能にする)、外側の名前空間(この場合はグローバル名前空間)で、または内部の機能のいずれかを呼び出す前に4引数のバージョンを宣言!:

// (1) 
unsigned int idiv_rec( unsigned a, unsigned b, unsigned &l, unsigned &h); 

unsigned int idiv_rec(unsigned int a, unsigned int b) 
{ 
    //or (2) 
    unsigned int idiv_rec( unsigned a, unsigned b, unsigned &l, unsigned &h); 

if (b == 0) exit(EXIT_FAILURE); 
unsigned int l = 0, h = a; 
return idiv_rec(a, b, l, h); 
} 
+0

ありがとう、私は間違いを今知っています:) – kirekhar

+0

@kirekharまた、あなたは前方宣言を保存して、2パラメータバージョンの前に4パラメータバージョンを定義することもできます。そうすることで、たとえば4パラメータ関数が5パラメータ関数になるなど、変更する必要があるものが1つ少なくなります。 – user4581301

2

を転送する必要がありますあなたが持っている問題は、あなたが

return idiv_rec(a, b, l, h); 

に達したときに、コンパイラは、まだこれは、それが何を意味

unsigned int idiv_rec( unsigned a, unsigned b, unsigned &l, unsigned &h) 

を見ていないです関数の4つの引数バージョンがあることはわかりません。そのため、関数が存在してもエラーが発生します。

関数プロトタイプや関数のインターフェースと呼ばれる

unsigned int idiv_rec(unsigned int a, unsigned int b) 
+0

ありがとうございました! – kirekhar

+0

@kirekhar問題ありません。喜んで助ける – NathanOliver

0

その関数の名前と型署名を指定する機能(の宣言である前に、あなたは

unsigned int idiv_rec( unsigned a, unsigned b, unsigned &l, unsigned &h); 

ようにそれを宣言転送する必要があります。パラメータのデータ型、および戻り値の型)を指定しますが、関数本体は省略します。

関連する問題