vecteur de gamme/ contrôle de portée
nouvel utilisateur ici.
J'ai écrit ce code qui crée un réseau avec des nœuds et utilise un nombre aléatoire pour créer des bords entre eux. - Je garder la trace de tout le graphe comme un vecteur, chaque entrée étant un vecteur représentant un nœud dont les éléments sont ses voisins. Il utilise ensuite une profondeur d'abord de recherche pour trouver le nombre de composants, qui sont découpés en plusieurs parties sur le graphique (ma variable count). Ensuite, j'ai sortie le nœud et le nombre de voisins, il est connecté dans un fichier txt. Le code compile, mais l'invite de commande me donne une erreur:
résilier appelé après avoir jeté une instance de 'std::out_of_range'
quel (le): vector::_M_range_check
Cette application a demandé l'Exécution d'y mettre fin d'une manière inhabituelle.
Veuillez contacter le support...
Donc... qu'est-ce que cela signifie et comment puis-je résoudre ce problème?
Aussi, j'ai besoin de garder une trace du nombre de nœuds dans chaque composante, des idées?
Merci d'avance, voici mon code:
#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);
}
}
}
OriginalL'auteur Ashton Wiens | 2013-02-26
Vous devez vous connecter pour publier un commentaire.
Vous avez créé le vecteur > mais il a la taille initiale de 0.
Désormais, lorsque vous accédez à l'aide de M. a() vérifie si cet indice est hors limite et lève une exception si c'est le cas.
définir le vecteur tel que:
devrait résoudre votre problème.
Vous devez également utiliser gdb ou d'autres débogueur. il va rendre la vie beaucoup plus facile sur vous
si vous avez gdb installé, alors il suffit d'exécuter le programme comme ceci: "gdb --args yourprogram vos paramètres"
également imprimer chaque pas que vous faites, de voir comment l'erreur se produit et dans lequel itération. sans un débogueur et sans message d'erreur, il est difficile d'obtenir l'erreur
OriginalL'auteur Moataz Elmasry
Cela crée un vecteur de vecteurs d'entiers, mais au départ, il n'y a pas de vecteurs-de-int éléments. Malgré cela, vous appeler
G.at(i)...
qui - pour toute valeur dei
, immédiatement accède à un non-existant élément.Séparément,
rand()
renvoie de façon aléatoire un entier de 32 bits, donc, sera presque toujours plus que votre 0.004float
. Vous pouvez utiliser quelque chose comme(rand() % 1000000 /1000000.0)
. Le nombre aléatoire sous-système doit être initialisée avec un appel alasrand(time(NULL));
Plus généralement, vous êtes mieux avec un peu de
std::cerr << "x is now " << x << '\n';
- impression des variables, vecteurs de tailles etc. dispersés à l'aide de votre code afin que vous puissiez voir ce qu'il fait et où il va mal. Sinon, voir si vous pouvez obtenir un débogueur interactif et l'étape à l'aide de votre code ligne par ligne.Vous voudrez peut-être trouver un nouveau professeur: voir linux.die.net/man/3/rand. Le redimensionnement peut pas fixes, mais il devrait avoir corrigé certains d'entre eux - déplacé le problème à plus tard de code avec un problème similaire. Si vous ajoutez un peu de trace comme
std::cerr << "gengraph returning\n";
vous serez en mesure de voir ce qui est imprimé dernier et de trouver la ligne exacte c'est encore buggé.OriginalL'auteur Tony Delroy
Cela signifie que vous indexées un vecteur à l'extérieur de la gamme.
vector::a()
effectue gamme de contrôles. Donc c'est probablement parce que vous n'avez pas de pré-allouer suffisamment d'éléments pourG
.OriginalL'auteur StoryTeller
Première erreur: en fonction gengraph() vous utilisez le vecteur vide:
Oui vous appelez push_back, mais vous appelez ça de la méthode at() a renvoyé. Mais à() ne retourne rien, quelle que soit la valeur de i et j ai comme vecteur est vide. L'une des solution de mettre cette ligne en début de gengraph()
Deuxième conseil: évitez d'utiliser des numéros de magie autant que possible. Mettez quelque chose comme:
Au début de votre fichier et utiliser la taille au lieu de chiffre magique de 1000.
En particulier ceci:
OriginalL'auteur Slava