2

次のプログラムは出力を生成していません。for ループに入り、( 経由でscanf) 1 つの値を取りますが、その後、コード ブロックは実行を停止します。Ideone (オンライン コンパイラおよびデバッグ ツール) によると、SIGXCPU シグナルが生成されます。

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

long fact(int);
int z(int);

int main()
{
    int i, n; 
    scanf("%d",&n); 
    int a[10];long b[10];
    int c[10];
    for(i=0;i<n;i++)
    {
        scanf("%d", &a[i]);
        b[i]=fact(a[i]);
        c[i]=z(b[i]);
    }
    printf("\n");
    for(i=0; i<n; i++)
    {
        printf("%d", c[i]);
    }
    return 0;
}

long fact(int m)
{
    if (m==1) return 1;
    else return (m*fact(m-1));
}

int z (int s)
{
    int c=0, temp;
    temp=s%10;
    if(temp!=0) return c;
    else
    {
        c++; z(temp);
    }
}

SIGXCPU シグナルは何を意味しますか?

4

3 に答える 3

11

シグナルは、SIGXCPU消費されたプロセッサ時間 ( RLIMIT_CPU) の制限、またはリアルタイム プロセスの場合は、スリープせずに実行する制限を超えた後、毎秒プロセスに送信されます。ここでの問題は、再帰z関数が停止せず、自分自身を何度も呼び出す (そしてスタック オーバーフローを引き起こす) ことです。停止条件を修正します。

シグナルのマニュアルページ から:

Signal | Default Action | Description
-------+----------------+-------------------------
SIGXCPU| A              | CPU time limit exceeded.

デフォルトのアクションは次のとおりです。

A - プロセスの異常終了。さらに、コア ファイルの作成など、実装定義の異常終了アクションが発生する場合があります。

于 2013-03-29T04:51:43.863 に答える
4

プログラムがサイトに過負荷をかけないように、ideone が許可するよりも多くの CPU 時間や関連リソースを消費している可能性があります。

再帰条件と終了条件を確認してください。

于 2013-03-29T04:46:51.790 に答える