-1

したがって、他のプログラムではこのエラーは発生しませんが、これでは発生しました。

このプログラムは、エラーが発生しない例です。

#include<stdio.h>

int main() {



    system("pause");
} // end main

しかし、以下のこのプログラムではエラーが発生します

#include <stdio.h>
//#include <stdlib.h>

// Takes the number from function1, calculates the result and returns recursively.
int topla (int n) {
    if(n == 1)
    return 3;
    else
        return topla(n-1) + topla(n-1) + topla(n-1);
}

// Takes a number from main and calls function topla to find out what is 3 to the
// power of n 
int function1(int n) {
    return topla(n);
}

int main() {
    int n; // We us this to calculate 3 to the power of n

    printf("Enter a number n to find what 3 to the power n is: ");
    scanf("%d", &n);
    function1(n);

    system("pause");
} // end main
4

3 に答える 3

2

system関数は、標準ヘッダーで宣言されています<stdlib.h>。プログラムが を呼び出すsystem()場合

#include <stdlib.h>

ソースファイルの先頭またはその近く。

#includeしかし、あなたの質問の一部は、ディレクティブを省略したときにコンパイラが文句を言わなかったのはなぜですか?

1990 C 標準 ("ANSI C" と呼ばれることもあります) では、明示的に宣言されていない関数の呼び出しが許可されています。たとえば、次のように記述します。

system("pause");

関数の目に見える宣言がない場合、 は呼び出しの引数に一致する戻り値の型とパラメーターで宣言systemされていると見なされます。この場合は、 type の単一の引数です。これはたまたま の実際の宣言と一致しているため、C90 コンパイラを使用すると、ディレクティブを省略できます。また、より新しい 1999 年および 2011 年の標準 (暗黙の宣言を許可しない) をサポートする一部の C コンパイラは、下位互換性のために、おそらく警告付きで古い形式を許可しています。systemintchar*system#include

intC90 コンパイラが与えられたとしても、現在は廃止された「暗黙の」ルールに依存する利点はありません。を追加するだけ#include <stdlib.h>です。より一般的には、呼び出すライブラリ関数については、そのドキュメントとそれを宣言するヘッダーを読ん#includeください。

あるプログラムでエラーが発生し、別のプログラムでエラーが発生した理由については、私には説明がありません。おそらく、別の設定でコンパイラを呼び出した可能性があります。いずれにせよ、それは実際には問題ではありませんが、コンパイラを構成する方法を調べて、このようなことについて常に警告するようにすることで、この種のエラーを回避できます。

于 2016-01-03T21:12:37.123 に答える
2

を含めるだけstdlib.hですが、標準ではなく、すべてのシステムで機能するわけではないため、使用system("pause")しないでください。単純なgetchar()(またはを使用したため、ループを含むgetchar()scanf())だけでうまくいくはずです。

プログラムが終了するとWindowsコマンドプロンプトが閉じるため、通常system("pause")はWindowsコマンドラインプログラムで見つかります。コマンドプロンプトからプログラムを直接実行するか、geanyのようにこれを修正するIDEを使用するとよいでしょう。

scanf()最後に、それが機能したと仮定するのではなく、常に戻り値を確認してください。

注: このコード

return topla(n - 1) + topla(n - 1) + topla(n - 1)

あなたは次のように書くことができます

return 3 * topla(n - 1);

topla()再帰的に3回呼び出す代わりに。

再帰がなくてもが停止する場合をelse除き、関数が返されるため、実際には必要ありません。n != 1elsen == 1

于 2016-01-03T19:10:22.600 に答える
1

ここで、2 つのことについて知っておく必要があります。

まず、コードは問題なく動作し、プログラムは実際に 3^n の値を見つけます。だから心配しないでください。

system() 部分に来て、

関数を使用するsystem();には、stdlib.h ヘッダー ファイルをインクルードする必要があります。これは、関数がそのヘッダーで宣言されているためです。

そのため、(コメントするのではなく) ヘッダーを含めることをお勧めします。

現在、pause キーワードは Windows で使用され、プログラムの完了後にコンソールが閉じるのを停止します。これは Windows 専用です。

system("pause");も標準ではなく、他のマシン、つまり Linux では動作しないことに注意してください。システム コマンドを使用すると、コマンド ラインと直接やり取りすることになります。なお、コマンドは OS ごとに固有のものであり、他の OS では使用できません。

そのためgetchar();、C 標準ライブラリ関数である を使用してコンソール ウィンドウを保持することをお勧めします。

于 2016-01-03T19:43:58.143 に答える