2017-01-20 4 views
0

とセグメンテーションフォールト私はこの質問は愚かなことかもしれないが、再帰機能は私にセグメンテーションフォールトを与える理由はただ一つのパラメータを持つ別の(一方で、私は本当に、理解していないCにかなり新しいです変更)、私に何も与えません。 これは、「vette」(ソースコード内の変数の名前)の数を計算するために使用される関数であり、配列内の他のすべての連続する数値よりも大きい数値です(最後の数値は含まれません)。 C - 再帰

この

非稼働いずれかになります。

#include <stdio.h> 
#include <stdlib.h> 
#define N 6 
int vette(int *a, int len, int lentot) { 
    /* end of the array */ 
    if (lentot<=1) return 0; 
    /* checked if the element is a vetta*/ 
    if (len == 1) { 
    return 1 + vette(&a[1], lentot-1, lentot-1); 
    } 
    /* checking */ 
    if (*a>a[len-1]) 
    return vette(a, lentot-1, lentot); /* this line gives me seg fault */ 
    else 
    return vette(&a[1], lentot-1, lentot-1); 
} 
/*trying the function*/ 
int main() { 
    int a[6]={10,9,4,5,7,6}; 
    printf("%d", vette(a,N,N)); 
} 

あなたが見ることができるようにparametesが関数に移動するように、私がlenとlentotを使用しています。しかし、何らかの理由で私が理解していないと、この関数は私に "/ *この行は私にseg fault *を与えるエラーを与えます//

同時に、lentot-1のvarialeをその時点で同じ値を持ち、lentotの値を変更しないlen-1は、パラメータint lenであるため、何も起こりませんが、コードは完全に動作します。ここにコード:

私は本当にこのコードは、事前に多く、私のおかげで、このエラーを与えている理由を理解
#include <stdio.h> 
#include <stdlib.h> 
#define N 6 
int vette(int *a, int len, int lentot) { 
    /* end of the array */ 
    if (lentot<=1) return 0; 
    /* checked if the element is a vetta*/ 
    if (len == 1) { 
    return 1 + vette(&a[1], lentot-1, lentot-1); 
    } 
    /* checking */ 
    if (*a>a[len-1]) 
    return vette(a, len-1, lentot); 
    else 
    return vette(&a[1], lentot-1, lentot-1); 
} 
/*trying the function*/ 
int main() { 
    int a[6]={10,9,4,5,7,6}; 
    printf("%d", vette(a,N,N)); 
} 

をいただければと思います!

+0

関数を入力するときに変数の値を出力します。それは何が起こっているかをすぐに伝えるはずです。 – dbush

+0

@bush提案には大変感謝しています。結果は正しいものですが、非動作のものでは再帰関数のループがあります。 lentは常に5で、lenは常に6です。なぜなら、作業中のlenであっても6であり、lentotは再帰関数の1ステップで5であることを前提としています。 –

+0

申し訳ありませんが、私は質問の冒頭にそれを書きましたが、何かが明確でない場合は教えてください! "したがって、これらは関数であり、配列内の他のすべての連続する数値よりも大きい数値(ソースコード内の変数の名前)を計算するために使用されます(最後のものを数えません)。たとえば、{4,6,1,2}は1つの "vette"、つまり6です。これは連続するすべての数よりも大きいためです。私はちょうど "vette"の数が必要です! –

答えて

0

これは、スタックオーバーフロー(意図しない言い換えなし)のためにセグメンテーション違反を与えます。あなたの再帰は決して終わらない。第2のパラメータlentot-1は減少しません。 len-1に変更すると、それが行われます。

メインプログラムから、最初の再帰呼び出しlen = lentot = 6から開始します。次に、被告ラインからの2回目の再帰呼び出しでは、len = 5lentot = 6です。問題は、3番目の問題は、まだlen = 5lentot = 6のようになります。

+0

申し訳ありませんが、私は理由を理解できません。関数lentot -1 *をlenの "場所"に与えると、lenに与えることはできません。だから、* lentot - 1 *と呼ばれる関数の新しいlenになりませんか?編集:理解した。私は毎回同じ変数を渡しています。どうもありがとう! –

+0

もう少し説明を追加しました。このような問題が発生した場合は、実際にデバッガまたは 'printf'を使って変数の値をトレースする必要があります。 – nickie