c ++ std :: vector Orphan Range error - PullRequest
       22

c ++ std :: vector Orphan Range error

0 голосов
/ 21 октября 2010

Программа, имеющая дело с представлением и преобразованием графов (из теории графов). Список смежности и матрица реализованы как динамические массивы векторов (не спрашивайте, почему не вектор вектора) для следующей функции, которая завершается с ошибкой памяти компилятор, указывающий на определение потерянного вектора.

int vertex,edges;
vector<int> *adjacencyList,*adjacencyMatrix;

void listToAdMatrix(int vertexNumber, vector<int> *List, vector<int> *Matrix){
 int in=0,cont=0;
 for(int i=0;i<vertexNumber;i++){
  in=i;
  for(auto j=List[in].begin();j!=List[in].end();j++){
   for(int k=0;k<vertexNumber;++k){
    if(k==*j) Matrix[cont].push_back(1); 
    else Matrix[cont].push_back(0);
   }
   cont++;
  }
 }
}

//function call
//vertex(number) and ajacencyList are initialized

adjacencyMatrix=new vector<int>[vertex];
listToAdMatrix(vertex,adjacencyList,adjacencyMatrix);

«Источник ошибки» в STL, на который указывает компилятор:

http://i51.tinypic.com/2dt0t9e.jpg


Сообщение об ошибке:

Необработанное исключение в 0x001a543b в graph.exe: 0xC0000005: Место чтения нарушения прав доступа 0xfdfdfe01.


функция fillList, используемая для заполнения списка смежности:

void fillList(int vertexNumber, vector<int> *List){
    int input=0;
    for (int i=0;i<vertexNumber;i++){   
        int in=i;
        cout<<"Introduce adjacent vertexes for the vertex -"<<i+1<<"-:"<<endl;
        for(int j=0;j<vertexNumber;j++){
            std::cout<<i+1<<"-";
            std::cin>>input;
            if(input==0) break;
            List[i].push_back(input-1);
        }
    }
}

Любая подсказка приветствуется.


Ответы [ 3 ]

0 голосов
/ 21 октября 2010

Вы уверены, что adjacencyList[in].size() всегда меньше вершины?Поместите код перед циклом j, чтобы проверить это.Прямо сейчас вам просто нужно поставить фиктивную линию и точку останова, чтобы увидеть, может ли это произойти.

Если это произойдет, тогда или adjacencyList инициализируется неправильно, или это ситуация, которую вам нужно обработать.*

Вам также необходимо убедиться, что для adjacencyList задан массив длиной vertex, но это более очевидно, так что вы, вероятно, делаете это.

0 голосов
/ 21 октября 2010

Решенная проблема:

Еще раз я прочитал вне массива. Ошибка была в переменной cont , которую я использовал для адресации векторовМатрица (динамический массив), увеличивая его, пока он выходит за пределы массива. Проблема решается путем вставки оператора while. Спасибо всем за ответы.

int vertex,edges;
vector<int> *adjacencyList,*adjacencyMatrix;

void listToAdMatrix(int vertexNumber, vector<int> *List, vector<int> *Matrix){
 int in=0,cont=0;
 for(int i=0;i<vertexNumber;i++){
  in=i;
  for(auto j=List[in].begin();j!=List[in].end();j++){
   while(cont!=vertexNumber){
     for(int k=0;k<vertexNumber;++k){
       if(k==*j) Matrix[cont].push_back(1); 
       else Matrix[cont].push_back(0);
     }
     cont++;
   }
  }
 }
}

//function call
//vertex(number) and ajacencyList are initialized

adjacencyMatrix=new vector<int>[vertex];
listToAdMatrix(vertex,adjacencyList,adjacencyMatrix);
0 голосов
/ 21 октября 2010

Одной из проблем является то, что вы еще не инициализировали adjacencyList.Согласно этому коду, он должен указывать на мусор (или ноль), когда он попадает в listToAdMatrix.Это может привести к ошибке при попытке индексации в List [in].

...