2017-12-03 17 views
1

ここで間違っていることを正確に把握するのに問題があり、同じ問題の投稿は見つかりませんでした。私は文字列の動的配列を使用して、バイナリツリーを[0]、最初の行のルート、[1]と[2]などの左から右に保持しています。その出力フォーマットをデバッグしていない間しかし、私は、なぜその特定の行が私のプログラムをクラッシュさせているのか、もっと懸念しています。文字列ポインタ配列を出力する

私はポインタの逆参照問題だと思っていましたが、outStream << &contestList[i]は予想通りにアドレスを表示し、outStream << *contestList[i]はエラーを投げます。

//3 lines are from other functions/files 
typedef string elementType; 
typedef elementType* elementTypePtr; 
elementTypePtr contestList = new elementType[arraySize]; 

void BinTreeTourneyArray::printDownward(ostream &outStream) 
{ 
    int row = 1; 

    for (int i = 0; i < getArraySize(); i++) 
    { 

     outStream << contestList[i]; //this is crashing the program 

     if (isPowerOfTwo(i)) 
     { 
      outStream << endl; 
      row++; 
     } 
     else 
     { 
      outStream << ":"; 
     } 
    } 
} 

ARRAYSIZEはcontestantsが私のトーナメントで出場者の数であるプライベートメンバarraySize = ((2 * contestants) - 1)です。ツリー内の各ラウンドまたは「行」は、トーナメントブラケットと同義です。 n人の競技者がいる場合、ツリーには2n-1個のノードが必要です。問題はこの機能ではありません。

getArraySize() { return arraySize; } 
+0

'arraySize'と' getArraySize'のコードを表示 – pepperjack

+0

_ "文字列ポインタ配列" _ Shudder!あなたのコードで_arrays_または_pointers_を使用する簡潔な理由は何ですか?これらのことを詳しく教えてください。 – user0042

+0

@pepperjackが追加されました – ViscousRandom

答えて

1

となる。elementTypePtr contestList = new elementType[arraySize];が問題であった。 contestListがクラスのプライベートメンバーだった場合、関数が終了した後に消える同名のローカル変数を宣言する関数にこの行を投げました。いいえ、大したことはありませんが、私が印刷機能でそれを必要としたという事実を除いて...おっと。

+0

これは、私が上記の質問のコメントに 'unique_ptr'を提案した2つの理由を示しています。これは、あなたが 'contestList'を作成した関数を呼び出したときにあなたが漏れていたことを意味します。 'unique_ptr'はそれを避けるでしょう。 2.もっと重要なことに、 'unique_ptr'を使うと、クラスメンバを' nullptr'にしておくことになり、デバッグがずっと簡単になりました。 –

関連する問題