2017-04-17 4 views
0

タイトルのように、私はポインタに割り当てられた動的に割り当てられた配列の要素を表示しようとしています。そこからいくつかの要素が追加された後に配列の要素を出力しようとしましたが、intでもない非常に奇妙な文字を取得します。ここにいくつかのコードがあります。印刷から奇妙な文字を取得する動的なint配列fromポインタ

//QS.h 
class QS: public QSInterface { //where the pointer is declared 
private: 
int* quickSort; 

//QS.cpp 

bool QS::createArray(int capacity) { //where the array is created 
if (quickSort != NULL) { 
    //delete [] quickSort; 
} 
quickSort = new int[capacity]; 
arrayCap = capacity; 
arraySize = 0; 
return true; 
} 

bool QS::addToArray(int value) { //elements are added 
if (arraySize >= arrayCap) { 
    return false; 
} 
quickSort = &value; 
++arraySize; 
return true; 

} 

string QS::getArray() const { //where array is "printed" 
string array; 
for (unsigned int i = 0; i < arraySize; ++i) { 
    array += *quickSort + i; 
    array += ", "; 
} 
return array; 
} 

私が受け取る出力はメモリアドレスではなく、無意味なASCII文字です。私は配列に追加するときに私がうんざりしているかもしれないと思う。どんな助け?おかげ

注* I配列を使用するには、「持っている」、おそらくいくつかの他の世界では、ベクターは、よりよい

+1

インサイド 'createArrayは()'、あなたが次の文を実行します。もっときれいに置き換え: 'int arr [capacity]; quickSort = arr; '。関数の最後では、 'arr'は局所変数であるため破壊されます。したがって、quickSortはゴミを指し示します。 – user2296177

+0

おっと、私は完全に忘れました。それは "新しい"を使うはずです。 –

+0

'int arr [capacity];' - これは無効なC++です。配列は、変数ではなく定数を使用して宣言され、エントリの数を示します。 – PaulMcKenzie

答えて

1

この行(機能を追加する)を実行する場合:

quickSort = &value; 

を使用すると、基本的にパラメータのメモリアドレスを指す、との最初の要素を指して停止するクイックポインタを設定します最初に作成したダイナミック配列。したがって、他のすべての要素が失われ、ランダムなメモリデータの整数解釈が出力されます。

代わりに書き込み:あなたは、ポインタを移動せずに、望むよう

quickSort[size] = value; 

は、お使いのアレイに割り当てられたメモリアドレスにパラメータの値を追加しますクイックソート

最後に、最後の関数:

array += *quickSort + i; 

ちょうど正しく行われint型に文字列からの変換を確認するために、

array += quickSort[i]; 

array += to_string(quickSort[i]); 
+0

これは修正済みです!私は配列の中にそれを置かなければならないかもしれないと思ったが、私は私のポインタに '[]'を使うことができないことを知りませんでした。ありがとう! * to_string修正のボーナス –

0

「QS :: addToArray」セットquickSortがスタックにある新しい値を指すようになります(パラメータ)。既に割り当てられた配列には何も追加されません。

アレイを割り当ててquickSortにポインタを格納したら、それを変更しないでください。あなたは、のようにquickSortで指されるメモリ内のアイテムを保存する必要があります。

bool QS::addToArray(int value) { //elements are added 
    if (arraySize >= arrayCap) { 
     return false; 
    } 
    quickSort[arraySize++] = value; 
    return true; 

} 

編集:私は後で:: QSで*quickSort + iの問題に気づいたのgetArray()しかし、ダニエルH.が書いたように、私はここでそれを追加するつもりはありませんそれについて最初に。

+0

ありがとう!私はこれが@GillBatesと同じコンセプトだと思っていて、彼の事例は私のために働いた。しかし、これは間違いなくadd関数の問題でした。 –

1

std::stringintを追加するだけではなりません(これは、とにかくstringです)。 supported operationsを見ると、文字列、個々の文字、Cスタイルの文字列、{'a', 'b', 'c'}、(次のバージョンのC++の)string_viewなどの文字のリストのみを追加できることがわかります。 intがこれらのいずれかに変換されているか、コードがコンパイルされません。 intからcharへのポインタか、ポインタへのポインタであるかどうかは私の頭の上から覚えていませんが、どちらも望ましい動作ではありません。

intを任意の方法で文字列に変換するには、to_string、さまざまなC関数、またはstring streamsがあります。

さらに、*quickSort + i(*quickSort) + i、ない*(quicksort + i)として読み取るので、あなたはquickSortの最初の要素にiを追加し続けるています。要素iにアクセスするには、通常は配列のインデックス付けであるquickSort[i]を使用するのが好ましい方法です。

+0

クイックソートをポインタにすると、 'quickSort [i]'を使っても動作しません。しかし、新しい要素を文字列ストリームに追加することはできましたが、今は狂った数字になってしまいます。 –

+0

気にしないで、 'quickSort [i]'が有効で、実際にはかなり理解しやすく簡単です。私のコードの他の問題は、これがうまくいかなかったように見えるものでした。ありがとうございました! –

関連する問題