2017-05-14 26 views
0

私は、再帰的メソッドのみを使って選択ソートコードを作成するよう依頼してきました。だから私は別の機能を最大値を格納する配列を見つけるために私の他の関数でそれを切り替えることについて考えています。 警告:互換性のないポインタ型から 'p_rec_max' の引数4を渡す ノート[デフォルトで有効に]:期待される 'int型*'再帰関数からのポインタの受け渡し

void p_rec_max(int data[], int cur, int arrSize,int * x) { 
    if(cur < arrSize - 1) { 
     if(data[cur] > data[arrSize - 1]) { 
      *x = cur; 
     } else if(data[cur] < data[arrSize - 1]){ 
      *x = arrSize - 1; 
     } 
     p_rec_max(data,cur + 1,arrSize,&x); 
    } 
} 

void rec_selection_sort(int data[], int arrSize) { 
    if(arrSize > 0) { 
     int maxi,temp; 
     p_rec_max(data,0,arrSize,&maxi); 
     temp = data[arrSize - 1]; 
     data[arrSize - 1] = data[maxi]; 
     data[maxi] = temp; 
     rec_selection_sort(data,arrSize - 1); 
    } 
} 

それはこの

機能で 'p_rec_max' のようないくつかの警告を得ました引数は 'int **'型です

そして、私の配列はまったく変わりません。 関数にポインタを渡すことの情報がないと、その問題を解決できません。 私のコードを修正して、自分のコードについて何が間違っているのかを説明してもらえますか? おかげ

+0

[mcve]を作成してください。 https:// ericlippertを読んでください。com/2014/03/05/how-to-debug-small-programs/ – Yunnosch

+0

plsにエラーメッセージmsg – CIsForCookies

答えて

2

まず問題

あなたはこの回線に問題があります:xので

p_rec_max(data,cur + 1,arrSize,&x); 
           ^^ 

&xは、関数が期待するものではありませんint **で、int *です。

変更行に:

p_rec_max(data,cur + 1,arrSize, x); 

すなわちx

第二の問題の前で無&

あなたp_rec_max機能は、最大配列値のインデックスを見つけることができません。

すべての配列要素が同じ場合、コードは決して*x = ...を実行しません。つまり、maxiは決して書き込まれず、ここで初期化されていないインデックスを使用することになります。data[arrSize - 1] = data[maxi];これは未定義の動作であり、プログラムがクラッシュする可能性があります。

それ以外にも、関数の基本ロジックが間違っていると思います。コードは常にcurと最後の配列要素を比較します。それは間違っているようだ。私は今まで見つかった最大値とcurを比較するべきだと思います。これは変数xを使って行うことができます。

何かのように:

void p_rec_max(int data[], int cur, int arrSize,int * x) { 
    if(cur < arrSize) { 
     if(data[cur] > data[*x]) { 
      *x = cur; 
     } 
     p_rec_max(data, cur + 1, arrSize, x); 
    } 
} 

とはrec_selection_sortコールでそれが好き:ところで

maxi = 0; // Assume index zero holds the maximum 
    p_rec_max(data, 1, arrSize, &maxi); 
        ^
       Start searching from index 1 

は、配列内の最大値を見つけるために、再帰関数を使用することはありません原因の良いです私はあなたが単純なforまたはwhileループを使用することは許されていないと思います。

+0

を表示し、エラーメッセージを削除しました。しかし、配列はまったくソートされません。 –

+0

@nandohidayat - アップデートを参照 – 4386427

+0

ありがとう。その本当に役に立つ –

関連する問題