0

다른 프로그램에 사용할 Graph ADT를 구현하고 있으며 정의해야 할 "삽입"및 "제거"기능이 제공되었습니다. 그들은 두 개의 꼭지점이있는 Edge (Edge 구조체에서)를 만들고 더 큰 Graph에 삽입/제거해야합니다. 그것은 주에서 그것의 인스턴스를 만들 때 잘 실행되지만 삽입 또는 제거 함수를 호출하려고하면 오류 메시지가 나타납니다 :C++ - 그래프 ADT - 액세스 위반 가져 오기

"COMP222 - Program3.exe의 0x00A56C84에서 첫 번째 예외 : 0xC0000005 : 0xCDCDCDCD "액세스 위반 기록 위치.

어떤 오류가 발생했는지에 대한 의견이 있습니까? 다시, 주요 문제는 삽입/제거와 함께하지만, 나는 그것을 위해 나머지의 경우에 대비해 게시했다.

EDGE STRUCT 

    struct Edge { //edge with vertices v1 and v2 
    int *vertex1; 
    int *vertex2; 
}; 


GRAPH.H 

#include "Graph.h" 
#include <iostream> 
Graph::Graph() { 

    graphSize = 0; 
}; 

Graph::Graph(const string& file) { 

    text.open(file); 
    while(!text.eof()) { 
    char ch; 
    text.get(ch); 
    vertices.push_back(ch); 
} 
for(int i = 0;i < sizeof(vertices);i++) { 
    static_cast<int>(vertices.at(i)); 
} 
} 
void Graph::insert(int v1,int v2) { 
    Edge* newEdge = new Edge; 

    *newEdge->vertex1 = v1; 
    *newEdge->vertex2 = v2; 

    v1 = vertices.at(0); 
    v2 = vertices.at(2); 

    graphSize += 2; 
    }; 

    void Graph::remove(int v1,int v2) { 
     Edge* delEdge = new Edge; //edge to be deleted 

    *delEdge->vertex1 = v1; 
    *delEdge->vertex2 = v2; 

    delete delEdge->vertex1; 
    delete delEdge->vertex2; 

    graphSize -= 2; 
    }; 

    ostream& operator <<(ostream& verts,const Graph& graph) { 
    return verts; 
    }; 



MAIN FUNCTION -- problem seems to be with the test.insert and test.remove      functions 

#include "Graph.h" 
#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

int main() { 
    Graph test("Path to file...no problem here..."); //THIS WORKS FINE 
    test.insert(2,3); //INSERT/REMOVE CAUSE THE ERROR 
    test.remove(2,3); 
    system("PAUSE"); 
    return 0; 
} 
+0

또한 제거 기능이 적합하지 않습니다. 새로운 모서리를 생성하고 새로 생성 된 모서리의 정점 포인터를 삭제하고 있습니까?! 나는 꼭지점이 v1, v2 인 모서리를 찾고 그 모서리를 삭제하겠습니까? – DigitalEye

+0

예, 그게 무슨 뜻입니까? 그리고 vertex1과 vertex2를 일반 int로 변경하는 것이 좋습니다. 감사합니다. – jordpw

+0

제거 기능이 변경되었습니다. 나는 가장자리를 저장하도록 정의 된 벡터를 가지고 있다는 사실을 잊어 버렸습니다. 그래서 가장자리를 검색하고 꼭지점이 일치하면 지워 버렸습니다. 이제는 모두 작동합니다. 당신의 도움을 주셔서 감사합니다! – jordpw

답변

1

문제해야 삽입 기능이 두 라인 :

*newEdge->vertex1 = v1; 
*newEdge->vertex2 = v2; 

vertex1vertex2가 초기화되지 않은 포인터이다가 메모리에서 올바른 위치를 가리키는되지 않으며 당신이 쓰기를 시도 그 위치들. vertex1vertex2을 정점 ID를 보유하는 int로 간단하게 지정하고 싶습니다.

마찬가지로 remove 함수로 쓰기가 시도됩니다. 너도 그걸 고쳐야 해.

+0

그래, 그게 의미가 있지만, 정확히 어떻게 이것을 해결할 수 있는지 알아낼 수 있습니다. 이 경우 유효한 초기화의 예를 들어 주시겠습니까? 내 시도가 작동하지 않습니다. – jordpw

+0

앞에서 말한 것처럼 'Edge :: vertex1'과'Edge :: vertex2'는 포인터 일 필요는 없습니다. 그것들을 일반 int로 변환하고 나머지 코드가 변경되었는지 확인하십시오. – DigitalEye