0

このコードを gcc 4.7.2 (Ubuntu Server 12.10) でコンパイル中に問題が発生しました。

#include <stdio.h>

int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a)
{
   if (a == 1)
      return (n);
   fact(n * a, a - 1);
}

これは 1 つの引数関数で実行できることはわかっていますが、ここでのポイントではありません。

私が得たエラーは次のとおりです。「ファクト」のタイプが競合しています(関数宣言の行)ここでファクトの以前の暗黙の宣言(printfの行)

4

2 に答える 2

6

factから呼び出す前に、前方宣言が必要ですmain

long int fact(long int n, long int a); // forward declaration
int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a) // actual function

この場合、fact上記の実装を移動するだけで済みます。mainただし、このアプローチは、より長い関数が相互に呼び出す、より複雑なプログラムには拡張できないことに注意してください。

追加 階乗関数が間違っています。これが修正されたバージョンです

long int fact(long int n)
{
   if (a == 1)
      return (n);
   return n * fact(n - 1);
}
于 2013-01-16T22:38:50.053 に答える
0
#include <stdio.h>
long int fact(long int n, long int a);
int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a)
{
   if (a == 1)
      return (n);
   fact(n * a, a - 1);
}

関数プロトタイプが必要です。これは基本的に、関数の最初の行にセミコロンを付けたものです。これにより、この関数が存在することがコンパイラに通知されます。

于 2013-01-16T22:40:42.590 に答える