2016-10-18 10 views
-3

完全なエラーは次のとおりです。 * 'to' int ** '' quickSort(int **、int、int) 'への引数' 1 'C++でのクイックソートアルゴリズムの実装中にエラーが発生しました: - "エラー: 'int *'を 'int **'に変換できません....."

MY全体のコードは以下の通りです:

#include <iostream> 

using namespace std; 

int Partition (int *A[], int p, int r) { 
    int x = *A[r]; 
    int i = p-1; 
    for (int j=0; j<=r; j++){ 
     if(*A[j]<=x){ 
      i++; 
      int save=*A[j]; 
      *A[j] = *A[i]; 
      *A[i] = save; 
     } 
    } 
    int save2=*A[i+1]; 
    *A[i+1]=*A[r]; 
    *A[r]=save2; 
    return (i+1); 
} 

void quickSort(int *A[], int p, int r) { 
    if (p<r){ 
    int q = Partition(A, p, r); 
    quickSort(A, p, (q-1)); 
    quickSort(A, (q+1), r); 
    } 
} 



int main() { 
    int RR[] = {2,8,7,1,3,5,6,4}; 
    int y=sizeof(RR)/sizeof(int)-1; 
    cout << y << endl; 
    int *QQ = RR; 
    cout << *QQ << endl; 
    quickSort(QQ, 0, y); 

    return 0; 
} 

これは私が擬似コードから自分自身を試してみました実装です。私はプログラミングに慣れていないので、なぜこのエラーが発生したのかを少し説明することができれば大きな助けになるでしょう。事前

+1

'int * A []' vs 'int * QQ':1次元がありません。単にコンパイラのエラーメッセージを読んでください。 –

+0

代替:配列へのポインタを必要としないように関数を書き換えます。ここでポインタを使う必要はありません。 – user4581301

+0

'int * A []'宣言は、整数へのポインタ*の配列です。宣言 'int A []'は整数の配列です。あなたは、整数またはポインタの配列を渡していますか? –

答えて

0

おかげでコードについて私が最初に気づくのは、不必要なポインタの間接参照の全体の多くです。配列Aが最初の配列要素へのポインタとして扱われるので、配列がポインタ(What is array decaying?)に崩壊し、すでに参照によって配列を渡しているため、Aの内容は追加のポインタを必要とせずに変更されます。

さらに悪いことに、int * A[]intの配列へのポインタではなく、それはintへのポインタの配列です。全く違うもの。 *A[0]は2を返しません。アドレスとして2を使用し、アドレス2のメモリにあるものを返します。これは、プログラムが不幸なことをするために、あなたが望むものでも、許可されてもいけません。あなたが幸運ならばクラッシュします。

代わりに、あなたはPartitionで論理エラーを参照してくださいに役立つquickSortこれの上部に

int Partition (int A[], int p, int r) { 
    int x = A[r]; 
    int i = p-1; 
    for (int j=0; j<=r; j++){ 
     if(A[j]<=x){ 
      i++; 
      int save=A[j]; 
      A[j] = A[i]; 
      A[i] = save; 
     } 
    } 
    int save2=A[i+1]; 
    A[i+1]=A[r]; 
    A[r]=save2; 
    return (i+1); 
} 

void quickSort(int A[], int p, int r) { 
    cout << p << ',' << r << endl; // Bonus: This will make the next bug really easy to see 
    if (p<r){ 
    int q = Partition(A, p, r); 
    quickSort(A, p, (q-1)); 
    quickSort(A, (q+1), r); 
    } 
} 

注余分cout声明を試してみてください。プログラムは、ためにクラッシュします...それを待って!スタックオーバーフローが発生しますが、coutにその理由が表示されます。

+0

答えと特にヒントをありがとう、その帰りを修正することに戻ってください。再度、感謝します! – vibster

+0

@VibhuDubey別のヒント:[Quicksort用のWikipediaページ](https://en.wikipedia。org/wiki/Quicksort)の4分の1は、Lomuto Quicksortの疑似コードを持っています。これはあなたが実装しているものです。あなたが持っているものとあなたが持っているものを比較すると、数分でバグが取り除かれます。私は5つの違い/バグを数えます。つまり、私は常にHoareのバージョンが間違っているのを見つけました。 – user4581301