1

私の研究の一環として、私たちは「ヒープ」の使用について学んでおり、ヒープを参照および参照するためのポインターを使用して短い数学プログラムを作成することを任されました。ちょっとした個人的な学習として、配列を作成してバイナリ検索を使用することで、これを配列で複製しようとしました。しかし、それは単に機能しません。

これが私のコードです:

#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{

//creating pointers
int* ii = new int;
int* top = new int;
int* bottom = new int;
int* uArray = new int[12];
int* uChoice = new int;

//assigning values in location of pointer
*ii = 5;
*top = 11;
*bottom = 0;

cout<<"Please input a value between 1 and 12 to find in the array: \t";
cin >> *uChoice;

for (int x = 0; x<12; x++) //adding values into the array
{
    uArray[x] = x;
    cout<<x;
    Sleep(1000);//checking loop works
}


while (uArray[*ii] != *uChoice)
{
    if (uArray[*ii] > *uChoice)
    {
        *bottom = *ii;
        *ii = (*top + *bottom)/2;
    }

    else 
    {
        *top = *ii;
        *ii = (*top + *bottom) /2;
    }

    if (*uChoice == *ii)
    {
        break;
    }


}

//clearing pointers.
delete ii;
delete top;
delete bottom;
delete uArray;
ii = 0;
top = 0;
bottom = 0;
uArray = 0;

cout<<uChoice<<" Found at position: \t"<< *ii;
Sleep(10000);
return 0;

}

よろしくお願いします。

[編集:] while ループ内でエラーが発生します。配列を正しく検索していないことを意味する何かが起こっています。申し訳ありませんが、これを明確にしませんでした。

4

3 に答える 3

3

deleteキーワードは、ポインタが指すメモリを解放します。したがって、その後はポインタを再度使用しないでください。

また、ポインタが配列を指す場合は、delete [] uArray構文を使用する必要があります。そうしないと、メモリが適切に解放されません。

あなたがより具体的ではなかったので、これが「機能しない」部分であるかどうかはわかりません。

于 2012-10-12T11:53:22.160 に答える
0

whileループが配列内の正しい要素を見つけられない理由は、ポインターの使用とは何の関係もありません。私はあなたに直接答えを与えることができますが、あなたがそれを自分で見つけることはあなたにとってより有用でしょう(あなたが下のスポイラーを見る前に)。

デバッガーでコードを実行してみることをお勧めします。これまでデバッガを使用したことがない場合は、試してみることを強くお勧めします。whileループの開始時にブレークポイントを設定します。参照用にuArray[]配列の内容を紙に書き留めておくと便利な場合があります。次に、whileループを一度に1行ずつ実行し、ifステートメントに注意を払います。ifステートメントがif句に入るのかelse句に入るのか、そして結果として*topまたは*bottomに移動するのかどうかに注意します。uArray [*ii]と比較した*uChoiceの値を考えると、何が起こるかを確認してください。

それは些細な間違いであり、それを見つけたら自分を蹴ります。しかし、より有用な教訓は、コードをデバッグする方法です。

(デバッガーがない場合は、whileループにいくつかのcoutステートメントを挿入して、キー変数の値を出力することで、同じ効果を得ることができます。)

答えは次のとおりです(マウスオーバーで確認してください)。

大なり演算子は、uArray[*ii]と*uChoiceを比較するテストでは小なりでなければなりません。検索している数値が配列の値よりも小さい場合は、それが下半分にあることがわかっているため、下から上ではなく、上から下に移動する必要があります。

于 2012-10-15T07:18:21.957 に答える
0

技術的には、Standardは「ヒープ」を定義していませんが、実装が定義している限り、ヒープではなくFreestorenewに要素を作成します。ヒープ上に要素を作成します。 malloc()

Good Read:
GotW#9:メモリ管理-パートI


次のような場合、未定義動作が潜んでいます。

   int* uArray = new int[12];
   delete uArray; 

必要なもの:

delete []uArray;
于 2012-10-12T11:52:01.453 に答える