2011-04-20 6 views
1

im gettinこれは本当に面倒なエラーメッセージです。私はこれだけ新しいことを知っていますが、私が把握できるもののようです。誰かが私がどこに間違っていてくださいを示すことができますか?C++アサーションは実行時にベクトルに失敗しました式:ベクトル添え字が範囲外です

実行時のメッセージは次のとおりです。 デバッグアサーションが失敗しました! プログラム: .... ファイル:C:932 式:ベクトル添字範囲

のうち、コードが

です\プログラムファイルは、\ベクトル 行を含め、マイクロソフトのVisual Studio 10.0 \ VCの\を\します
#include "VectorIntStorage.h" 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <algorithm> 

using namespace std; 

void VectorIntStorage::Read(istream& r) 
{ 
    char c[13]; 
    r >> c; 
    r >> NumberOfInts; //gets number of ints for vector 

    //numberVector = new std::vector<int> numberVector; 

    for(int i = 0; i < NumberOfInts; i++) 
    { 
     r >> numberVector[i]; 
     cout << numberVector[i] << endl; 

     if(_sortRead) //true 
     { 
      for(int k = 0; k < i; k++) 
      { 
       if(numberVector[i] < numberVector[k]) 
       { 
        int temp = numberVector[k]; 
        numberVector[k] = numberVector[i]; 
        numberVector[i] = temp; 
       } 
      } 
     } 
    } 
} 

void VectorIntStorage::Write(ostream& w) 
{ 
    for(int i = 0; i < NumberOfInts; i++) 
    { 
     w << numberVector[i] << endl; 
     cout << numberVector[i] << endl; 
    } 
} 

void VectorIntStorage::sortStd() 
{ 
    sort(numberVector.begin(), numberVector.end()); 
} 

void VectorIntStorage::sortOwn() 
{ 
    quickSort(0, NumberOfInts - 1); 
} 

void VectorIntStorage::setReadSort(bool sort) 
{ 
    _sortRead = sort; 
} 

void VectorIntStorage::quickSort(int left, int right) 
{ 
    int i = left, j = right; 
     int tmp; 
     int pivot = numberVector[(left + right)/2]; 

     while (i <= j) 
     { 
      while (numberVector[i] < pivot) 
        i++; 
      while (numberVector[j] > pivot) 
        j--; 
      if (i <= j) 
      { 
        tmp = numberVector[i]; 
        numberVector[i] = numberVector[j]; 
        numberVector[j] = tmp; 
        i++; 
        j--; 
      } 
     } 

     if (left < j) 
     { 
      quickSort(left, j); 
     } 
     if (i < right) 
     { 
      quickSort(i, right); 
     } 
} 

VectorIntStorage::VectorIntStorage(const VectorIntStorage& copying) 
{ 
    //int *duplicate = new int[(copying.NumberOfInts)]; 
    //vector<int> *duplicate = new vector<int>; 

    //std::copy(numberVector.begin(), numberVector.end(), duplicate); 
    //numberVector = duplicate; 
    //NumberOfInts = copying.NumberOfInts; 
} 

VectorIntStorage::VectorIntStorage(void) 
{ 
} 


VectorIntStorage::~VectorIntStorage(void) 
{ 
} 
+2

我々がそうであるが – rerun

+0

参考になっ行番号、その実行時エラーないだろう何行を示す行番号を持っていない、申し訳ありませんが、 –

+0

はあなたがこれをデバッグしていることを言及している必要があります。 – rerun

答えて

6

私たちには確かな情報はありませんが、失敗した行はr >> numberVector[i]と思われます。あなたが言うつもりだと思います。int j; r >> j; numberVector.push_back(j);

エラーメッセージには、ベクトルの下付き文字(i)が範囲外ですという問題があります。具体的には、ベクトルのサイズを増やすことはないので、サイズは常に0です。したがって、operator[]を使用すると、範囲外の要素を参照することになります。

+0

この理由以外に、メモリリークが発生したときにこのエラーが表示されることはありますか? –

2

numberVector[i]を最初に使用してnumberVector.resize()を呼び出すことはできません。上記のコメントから

vector<int> vec; 
vec[1] = 0; // fails - vec is empty so [1] is out of range 
vec.resize(100); 
vec[1] = 5; // ok, you can access vec[0] .. vec[99] now 
vec.push_back(11); // Now the size is 101 elements, you can access vec[0] .. vec[100] 
1
r >> NumberOfInts; //gets number of ints for vector 

、あなたがサイズNumberOfIntsのベクトルを必要とするようです。しかし、コメントとして行を残して -

//numberVector = new std::vector<int> numberVector; 

をあなたのようにベクトルを宣言している - numberVector[]の操作を実行するには

std::vector<int> numberVector; // The size of the vector is 0 

、それのサイズが言及されるべきであると有効範囲の中にあるべきです宣言。宣言中に言及されていないので、ベクトルのサイズを動的に増やすには、push_back操作を行う必要があります。

for(int i = 0; i < NumberOfInts; i++) 
{ 
    r >> numberVector[i]; // Size isnot initially mentioned while declaration 
          // of the vector to do an `[]` operation 
    cout << numberVector[i] << endl; 
    // .... 
関連する問題