2017-02-24 10 views
1

私はクラス割り当てに取り組んでいます(これは関連するコードだけが表示される理由です)。私は、乱数の配列へのポインタの配列を割り当て、バブルソート技術を使用しなければなりません。複数の呼び出しレベルでcポインタを渡す

次のように配列が設定されています

int array[DATASIZE] = {71, 1899, 272, 1694, 1697, 296, 722, 12, 2726, 1899}; 
int *arrayPointers = array; // donation array 

関数呼び出しは、メインから来ていると見えます以下の通りです:

bubbleSort(arrayPointers); 

私は別々にポインタの交換をしなければなりません機能:実際のバブルソートから

void pointerSwap(int *a , int *b) 
{ 
// swap the pointers and store in a temp 
int temp = *a; // temp storage of pointer a while being reassigned 
*a = *b; 
*b = temp; 
}// end of pointerSwap 

void bubbleSort (int *toStore) 
{ 
//sort each of the pointers successively 
int i,j; // counters 
for (i=DATASIZE-1;i>1;i--) 
    { 
    for (j=0;j<DATASIZE-1;j++) 
     { 
     if (toStore[j]>toStore[j+1]) 
      { 
      pointerSwap(toStore[j],toStore[j+1]); 
      }// end of if? 
     }// end of j for loop 
    }// end of i for loop 
}// end of buubleSort 

私の問題は、私はコードをコンパイルしようとすると、私はポインタスワップ呼び出すときに、私は次のエラーを取得することです:「pointerSwap」の引数1を渡し


はなし整数からポインタを作りますキャスト
注:「int型*」が、引数期待は型 'int型
は「pointerSwap」の引数2を渡すのであるキャストなし整数からポインタを行い
注:期待 'int型*' が、引数は型である「int型


私は私が間違ってやっているのかわからないです、私は "& toStore [j]を" 試してみましたし、「& toStore [J + 1] "しかし、リストは、(予想される)尖った配列の代わりにオリジナルをソートします。ポインタを期待

pointerSwap(toStore[j],toStore[j+1]); 

あなたはinttoStore[j]*(toStore + j)にequivelentされる)を通過されている機能に:すべてのヘルプははるかに高く評価され、事前に


〜ジョーイ・コールで

+0

ただし、インプレースの並べ替えを避けるために、別のストレージ場所をどこで定義しましたか?注: 'toStore + j'はポインタの方が明確です。 –

+2

外側のforループでjを使用するとどうなりますか?それは私ではないはずですか? – RSon1234

+0

'void bubbleSort(int * toStore)'関数は1つの引数しか取っておらず、何も返さないので、関数は配列をソートする以外に何をしますか?元の配列を変更したくない場合は、どこかにコピーする必要があります。 'bubbleSort'を呼び出すコードを提供してください。 –

答えて

1

。ポインタを渡す必要があります。

pointerSwap(toStore + j, toStore + j + 1); 

2番目の質問は、場所からのソートに関連しています。あなたが何かを返すされていません

void bubbleSort (int *toStore) 

とあなたの場所に並べ替えが、何かを傾けるように、あなたは二番目の配列への参照を与えていない:あなたの関数signitureは、他の何かのために許可されていません。

int *bubbleSort (int *input) { 
    int* toStore = malloc(DATASIZE * sizeof(int)); 
    memcpy(toStore, input, DATASIZE); 
    ... 
    //sort toStore 
    ... 
    return toStore 
} 

これはソートされた配列を返し、元のものには触れません。

+0

"&toStore [j]"と "toStore [j + 1]" - 同じことですが、それはコンパイルされますが間違ったことをします – pm100

+0

コードがコンパイルされますが、コードを実行すると、指し示された配列の代わりに元の配列が変更されます。 – thePinochleKid

+0

@Joey編集を参照してください。 –

0

これまでの回答を拡張するだけです...

Cブラケット演算子は、[] *と等価である()

a[5] 

の両方が、新しいポインタを取得するためのポインタにオフセット及び追加

*(a + 5) 

と同等になるように指されている値を取得します。 toStore [j]をpointerSwapに渡すと、ポインタを渡すときにtoStoreのj番目の要素にある整数値を渡して、Storeがその位置にある値を入れ替えることができるようにします。何をしたい

(toStore + j) 

代わりの

*(toStore + j) 

楽しいCのトリビアです:なぜ、これはC++のために真実ではない:これらはすべて等価な表現

toStore[j] 
*(toStore + j) 
*(j + toStore) 
j[toStore] 

行使していますか?

関連する問題