2013-02-26 30 views
5

新しいユーザーはここにあります。 私はノードを持つネットワークを作成し、乱数を使ってノード間にエッジを作成するこのコードを書いています。グラフ全体をベクトルとして追跡します。各要素は、その要素がその近傍であるノードを表すベクトルです。次に深さ優先検索を使用して、グラフの別々の部分(私のカウント変数)であるコンポーネントの数を見つけます。次に、接続されているノードと隣接ノードの数をtxtファイルに出力します。コードはコンパイルしますが、コマンドプロンプトは私にエラーを与える:ベクトル:: _ M_range_checkベクトルが範囲外/範囲チェック

このアプリケーションは、ランタイムを要求しました:

のインスタンス投げた後、いわゆる「STDを:: out_of_range」何を() 終了しますそれを異常な方法で終了させる。 サポートにお問い合わせください...

です...どういう意味ですか、どうすれば修正できますか?

また、各コンポーネントにいくつのノードがあるのか​​を把握する必要があります。

#include <iostream> 
#include <fstream> 
#include <stdlib.h> 
#include <vector> 
using namespace std; 

void gengraph(int v, float p, vector <vector <int> >& G); 
void DFS(vector <vector <int> > G, int v, vector<int>& M); 

int main() 
{ 
    int a = 1000; 
    float b = 0.004; 
    vector <vector <int> > G; 
    gengraph(a,b,G); 
    vector <int> M (1000); 
    int count = 0; 
    int i; 
    for (i = 0; i < a; i++) 
    { 
     if (M[i]==0) 
     { 
      DFS(G, i, M); 
      count += 1; 
     } 
    } 
    ofstream myfile; 
    myfile.open ("data.txt"); 
    for (int l=0; l<1000; l++) 
    { 
     myfile << "v len(G[v])\n"; 
    } 
    myfile.close(); 
} 
void gengraph(int v, float p, vector <vector <int> >& G) 
{ 
    for (int i = 0; i<1000; i++) 
    { 
     for (int j = 0; j<1000; j++) 
     { 
      int y = rand(); 
      bool Prob = (y <= p); 
      if (i == j) 
       continue; 
      else 
      { 
       if(Prob == true) 
       { 
        G.at(i).push_back (j); 
        G.at(j).push_back (i); 
       } 
      } 
     } 
    } 
} 
void DFS(vector <vector <int> >& G, int v, vector<int>& M) 
{ 
    M[v]=1; 
    for(unsigned int j = 0; j < G[v].size(); j++) 
    { 
     if (M[j]==0) 
     { 
      DFS(G, j, M); 
     } 
    } 
} 

答えて

0

は、それはあなたがそれの範囲外のベクトルをインデックス化を意味します

事前のおかげで、ここに私のコードです。

vector::at()は範囲チェックを実行します。だからおそらく、Gに十分な要素をあらかじめ割り当てていないからでしょう。

0

まずエラー:関数GENGRAPHで()を使用すると、空のベクターを使用します。

G.at(i) ... 
G.at(j) ... 

はいあなたは一backを呼んでいますが、(でどのような方法でそれを呼び出す)が返されます。しかしat()はあなたのベクトルが空であるので、iとjの値が何であれ返すことはできません。できるだけ多くのマジックナンバーを使用することを避ける:解決策の一つは、GENGRAPHの初め()

G.resize(1000); 

セカンドアドバイスで、この行を置きます。この特に、代わりにマジックナンバー1000 のあなたのファイルや使用サイズの初めに

const int size = 1000; 

::のようなものを入れて

int a = 1000; 
float b = 0.004; 
vector <vector <int> > G; 
gengraph(a,b,G); 
vector <int> M (1000); // use a here and better call it something more meaningfulness than a 
int count = 0; 
int i; 
for (i = 0; i < a; i++) { // or use M.size() here or both 
} 
1

あなたはベクトルを作成した>が、それは初期サイズ0

を持っています

これで、M.at()を使用してアクセスすると、このインデックスが範囲外であるかどうかがチェックされ、そのような場合は例外がスローされます。

vector<vector<int> > M(1000); 

はあなたの問題を解決する必要があります

としてベクトルを定義します。

gdbなどのデバッガも使用する必要があります。

+0

ベクトル M(1000)を使用しようとしました。それは私に同じエラーを与えた。 Codeblocksでデバッガを動作させるにはどうすればよいですか? –

+0

gdbがインストールされている場合は、次のようにプログラムを実行してください。 "gdb -args yourprogram your parameters" –

+0

は、エラーがどのように発生し、どのように反復されるかを確認するために、デバッガなしでエラーメッセージが表示されない場合は、エラーを取得するのが難しい –

1
vector <vector <int> > G; 

これはベクトルのof-intsのベクトルを作成しますが、最初はベクトルのof-int要素はありません。それにもかかわらず、iの任意の値に対して、存在しない要素にただちにアクセスするG.at(i)...を呼び出します。

別途、rand()はランダムな32ビット整数を返します。したがって、ほとんどの場合、0.004 float以上になります。 (rand() % 1000000/1000000.0)のようなものを使用したいかもしれません。乱数サブシステムは、呼び出し元で初期化する必要がありますsrand(time(NULL));

さらに一般的には、印刷変数、ベクトルサイズなどのいくつかを使用することをお勧めします。それは間違っています。あるいは、インタラクティブなデバッガを入手し、コードを1行ずつ進めるかどうかを確認してください。

+0

MとGのサイズを1000に変更しましたが、エラーが修正されませんでした。私は同じことを考えましたが、.004は私の教授が私に使ってくれた確率です。彼は私にrandコードを与え、rand()は0と1の間のランダムな浮動小数点を選ぶだろうと言った。 –

+0

新しい教授が見つかるかもしれない:http://linux.die.net/man/3/randを見よ。サイズ変更はそれらをすべて修正していないかもしれませんが、それらのいくつかを修正する必要があります - 同様の問題で後でコード化する問題を移動しました。 \ n ";"などの 'std :: cerr <<" gengraphのようなトレースを入力すると、最後に何が印刷されたかを確認し、まだバグのある正確な行を見つけることができます。 –