| | |
C++ Segement Fault on Unix
Thread Solved
![]() |
•
•
Join Date: Sep 2008
Posts: 9
Reputation:
Solved Threads: 0
Hi I was wondering if anyone could help
I'm receiving a segmentation fault whenever I go to run
my main.cpp on my program. I've never encountered this before
and was wondering if anyone knew how it can be fixed.
The program consist of equiv.h, equiv.cpp, graph.h, graph.cpp, and main.cpp
here are the files
equiv.h
equiv.cpp
graph.h
graph.cpp
main.cpp
I'm receiving a segmentation fault whenever I go to run
my main.cpp on my program. I've never encountered this before
and was wondering if anyone knew how it can be fixed.
The program consist of equiv.h, equiv.cpp, graph.h, graph.cpp, and main.cpp
here are the files
equiv.h
C++ Syntax (Toggle Plain Text)
const int maxVertices = 50; /******************************************* * Equiv * ******************************************* * Equiv is a structure type that holds a * * pointer to an array of integers and an * * integer of the size of that array. * *******************************************/ struct Equiv { int* arrayIntegers; int arraySize; }; bool together(Equiv& e, int x, int y); void combine(Equiv& e, int x, int y);
equiv.cpp
C++ Syntax (Toggle Plain Text)
#include <iostream> #include <fstream> #include "equiv.h" /********************************************** * together * ********************************************** * together returns true if x and y are in the* * same set as object e. * **********************************************/ bool together(Equiv& e, int x, int y) { bool sameX = false; bool sameY = false; for(int i = 0; i < e.arraySize; i++) { if(e.arrayIntegers[i] == x) sameX = true; if(e.arrayIntegers[i] == y) sameY = true; if(sameX && sameY) break; } return (sameX && sameY); } /********************************************** * combine * ********************************************** * combine puts x and y together by combining * * the two into the same set. * **********************************************/ void combine(Equiv& e, int x, int y) { if(together(e, x, y)) return; bool switchX = false; bool switchY = false; if(e.arraySize > 0) { for(int i = 0; i < e.arraySize; i++) { if(x == e.arrayIntegers[i]) switchX = true; if(y == e.arrayIntegers[i]) switchY = true; if(switchX && switchY) break; } } else { e.arraySize = 0; e.arrayIntegers = new int[maxVertices]; } if(!switchX && !switchY) { if(x < y) { e.arrayIntegers[e.arraySize] = x; e.arrayIntegers[e.arraySize+1] = y; } else { e.arrayIntegers[e.arraySize] = y; e.arrayIntegers[e.arraySize+1] = x; } switchX = switchY = true; e.arraySize += 2; } if(!switchX) e.arrayIntegers[e.arraySize++] = x; if(!switchY) e.arrayIntegers[e.arraySize++] = y; }
graph.h
C++ Syntax (Toggle Plain Text)
#include <iostream> const int maxEdges = 100; /********************************************** * Edge * ********************************************** * Edge is a structure that holds two vertices* * and the weight. * **********************************************/ struct Edge { int vertOne; int vertTwo; int weight; }; /********************************************** * Graph * ********************************************** * Graph is a structure that holds the number * * of vertices, the number of edges, and a * * pointer to the array of edges. * **********************************************/ struct Graph { int numVert; int numEdges; Edge * arrayEdges; ~Graph() { delete [] arrayEdges; } }; void readGraph(Graph& g); void printGraph(Graph& g); void kruskalAlg(Graph& g); int totalWeight(Graph& g);
graph.cpp
C++ Syntax (Toggle Plain Text)
#include <iostream> #include <fstream> #include "graph.h" #include "equiv.h" using namespace std; /********************************************** * readGraph * ********************************************** * readGraph reads in information about graph * * g from standard input then sets the edges * * to the maximum number of edges avaliable. * **********************************************/ void readGraph(Graph& g) { int input; cin >> g.numVert; bool finished; finished = false; if(g.numEdges > 0) delete [] g.arrayEdges; g.arrayEdges = new Edge[maxEdges]; int k = 0; while(!finished) { cin >> input; if(input==0) break; g.arrayEdges[k].vertOne = input; cin >> g.arrayEdges[k].vertTwo; cin >> g.arrayEdges[k].weight; k++; } g.numEdges = k; } /************************************************ * printGraph * ************************************************ * printGraph prints out each vertice and weight* * of graph g from the standard input. * **********************************************/ void printGraph(Graph& g) { cout << "Vertices Weight" << endl; for(int k=0; k < g.numEdges; k++) cout << g.arrayEdges[k].vertOne << " " << g.arrayEdges[k].vertTwo<< "\t " << g.arrayEdges[k].weight << endl; } /********************************************** * kruskalAlg * ********************************************** * kruskalAlg computes the minimal spanning * * tree using Kruskal's algorithm, it takes * * graph g as a parameter and yields it to * * graph k. * **********************************************/ void kruskalAlg(Graph& g) { Graph k; Equiv e; k.numVert = g.numVert; k.numEdges = 0; k.arrayEdges = new Edge[maxEdges]; e.arraySize = 0; e.arrayIntegers = 0; int a = g.numEdges-1; while(a > 1) { for(int i = 0; i < a; i++) { if(g.arrayEdges[i].weight > g.arrayEdges[i+1].weight) { Edge edgeOne = g.arrayEdges[i+1]; g.arrayEdges[i+1] = g.arrayEdges[i]; g.arrayEdges[i] = edgeOne; } } a--; } for(int i = 0; i < g.numEdges; i++) { if(!together(e, g.arrayEdges[i].vertOne, g.arrayEdges[i].vertTwo)) { combine(e, g.arrayEdges[i].vertOne, g.arrayEdges[i].vertTwo); k.arrayEdges[k.numEdges++] = g.arrayEdges[i]; } } g.numEdges = k.numEdges; delete [] g.arrayEdges; g.arrayEdges = new Edge[maxEdges]; for(int i = 0; i < k.numEdges; i++) g.arrayEdges[i] = k.arrayEdges[i]; } /********************************************** * totalWeight * ********************************************** * totalWeight computes the total weight of * * graph g. * **********************************************/ int totalWeight(Graph& g) { int total = 0; for(int k = 0; k < g.numEdges; k++) total += g.arrayEdges[k].weight; return total; }
main.cpp
C++ Syntax (Toggle Plain Text)
#include <cstdlib> #include <iostream> #include "graph.h" using namespace std; int main() { Graph g; readGraph(g); cout << endl << "The input graph has " << g.numVert << " vertices, and its edges are as follows:" << endl << endl; printGraph(g); kruskalAlg(g); cout << endl << "A minimal spanning tree uses the following edges." << endl << endl; printGraph(g); cout << endl << "The total weight of the spanning tree is " << totalWeight(g) << endl << endl; }
My guess is that in main.cpp, the Graph object has not been initiaized, so when ReadGraph() is called and attempts to delete arrayEdges, CRASH/COREDUMP.
In main() initialize all Graph variables to 0 before calling ReadGraph() to see if that resolves your problem.
In main() initialize all Graph variables to 0 before calling ReadGraph() to see if that resolves your problem.
C++ Syntax (Toggle Plain Text)
int main() { Graph g; memset(&g, 0, sizeof(Graph)); readGraph(g); <snip>
Last edited by Ancient Dragon; Dec 2nd, 2008 at 10:33 pm.
Don't PM me with questions -- you might get a nasty PM in response. If you have a question then post it in one of the forums.
![]() |
Other Threads in the C++ Forum
- Previous Thread: Comparisons
- Next Thread: Finding Positon of characters
| Thread Tools | Search this Thread |
ace_thread api array based binary bitmap borland c++ c/c++ calling char class classes code coding compile console conversion count delete delete-line deploy desktop developer directshow dll download dynamic dynamiccharacterarray email embedded encryption error file forms fstream function functions game givemetehcodez graph gui homeworkhelp homeworkhelper iamthwee ifstream information input int integer java lib linkedlist linker loop looping loops map math mathhomeworkhelp matrix memory multiple news node number numbertoword output parameter pointer problem program programming project python random read recursion reference reverse richedit rpg string strings temperature template test text text-file tree url variable vector video win32 windows winsock word wordfrequency wxwidgets






