1. ホーム
  2. c

[解決済み] C言語プログラムでのSIGXCPUエラー

2022-02-09 01:34:36

質問

次のプログラムは出力を生成しません。 forループに入り、1つの値を( scanf が、その後、コードブロックの実行が停止します。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信号とはどういう意味ですか?

解決方法は?

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

から シグナル のマニュアルページをご覧ください。

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

デフォルトのアクションは以下の通りです。

A - プロセスの異常終了。 さらに、実装で定義された異常終了動作が発生しました。 コアファイルの作成などが発生する可能性があります。