2016-09-15 3 views
1

私は現在、 "可変関数"をダウンし、文字列ベクトルに4つの名前をロードしてからそれらを出力しようとしています。私は 'int'型でこれを行い、数値を使用するとうまくいきますが、文字列ベクトルを使用するとエラーが発生します。"ベクトル下付き文字を範囲外にする"エラー

+1

ですね。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** –

+0

あなたは時間を過ごすことをお勧めします'std :: vector'がどのように動作するか(http://en.cppreference.com/w/cpp/container/vector)。 – caps

答えて

3

C++では、可変引数として簡単にコピー可能な型のみを使用できます。 std::stringはNULL終了バッファを指すポインタchar*から構築可能であるため、std::stringタイプの代わりにchar*を使用できます。ちょうどあなたのコード内の

currentElement = va_arg(namesList, char*); 

currentElement = va_arg(namesList, string); 

を交換してください。この制限を解消するには、使用する任意のタイプのコンパイル時にコードを生成するvariadic templatesを検討してください。

コードにはランタイムエラーも含まれています。これは:

namesVector[i] = currentElement; 

は、ベクターにメモリを割り当てなかったため、プログラムがクラッシュする可能性が非常に高いです。ベクトルは実際には動的配列なので、適切なコンストラクタにsize引数を渡すか、ベクトル上でresizeを呼び出す必要があります。あなたはケースで、あなたはそれのどちらを行うが、ちょうどpush_back methodを使用することができます:あなたのコードをステップ実行するためにデバッガを使用する方法を学ぶ必要があるかもしれないよう

namesVector.push_back(currentElement); 
+0

ありがとう!それはそれを修正し、説明に感謝します! – JSan782

関連する問題