とセグメンテーションフォールト私はこの質問は愚かなことかもしれないが、再帰機能は私にセグメンテーションフォールトを与える理由はただ一つのパラメータを持つ別の(一方で、私は本当に、理解していない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));
}
をいただければと思います!
を
関数を入力するときに変数の値を出力します。それは何が起こっているかをすぐに伝えるはずです。 – dbush
@bush提案には大変感謝しています。結果は正しいものですが、非動作のものでは再帰関数のループがあります。 lentは常に5で、lenは常に6です。なぜなら、作業中のlenであっても6であり、lentotは再帰関数の1ステップで5であることを前提としています。 –
申し訳ありませんが、私は質問の冒頭にそれを書きましたが、何かが明確でない場合は教えてください! "したがって、これらは関数であり、配列内の他のすべての連続する数値よりも大きい数値(ソースコード内の変数の名前)を計算するために使用されます(最後のものを数えません)。たとえば、{4,6,1,2}は1つの "vette"、つまり6です。これは連続するすべての数よりも大きいためです。私はちょうど "vette"の数が必要です! –