Почему я получаю ошибку сегментации при попытке написать график? - PullRequest
2 голосов
/ 01 апреля 2020

Мое задание - прочитать график в этом формате ввода: enter image description here

и вывести его в этом формате enter image description here

Тем не менее, я продолжаю получать ошибки сегментации при запуске моей программы. Я думаю, что моя проблема заключается в написании графика, но я не могу понять, почему. Может кто-нибудь указать мне правильное направление, пожалуйста?

Еще немного информации: readGraph должен использовать insertEdge, чтобы вставить ребро. Соблазнительно читать три числа в строке, несмотря ни на что. В последней строке будет успешно прочитано только одно число. Но программы, как правило, модифицируются, и, где это не слишком много работы, это хорошая идея, чтобы быть готовым к изменениям. Что если программа будет изменена, чтобы после графика было больше входных данных? Вы не хотите, чтобы readGraph считывал то, что следует за графиком.

Напишите readGraph, чтобы он не зависел от строки, содержащей только 0, чтобы быть последним элементом ввода. Это легко сделать. Прочитайте первое число и проверьте его, прежде чем читать следующие два.

 struct Edge
    {
        int vertex1;
        int vertex2;
        int weight;

        Edge()
        {
            vertex1 = 0;
            vertex2 = 0;
            weight = 0;
        }
    };

    struct Graph
    {
        int numOfVertices;
        int numOfEdges;
        Edge*   edges;
        int sizeOfArray;

        Graph(int n, int e)
        {
            numOfVertices = n;
            numOfEdges = 0;
            sizeOfArray = e;
            edges = new Edge[e];
        }
    };

    //Inserts an edge between vertices u and v, of weight w, into graph g.
    void insertEdge(int u, int v, int w, Graph* g)
    {
        Edge e;
        e.vertex1 = u;
        e.vertex2 = v;
        e.weight = w;
        g->edges[g->numOfEdges] = e;
        g->numOfEdges++;

    }

    //Reads vertices, edges, and weight from the input
    //and allocates a graph in the heap with enough room for e edges.
    Graph* readGraph(int e)
    {
        int numberOfVertices, edge;
        scanf("%i", &numberOfVertices);
        Graph* g = new Graph(numberOfVertices, e);
        int u, v, w;
        while(scanf("%i", &edge) != 0)
        {

            scanf("%i%i%i", &u, &v, &w);
            insertEdge(u,v,w,g);
        }
        return g;
    }

    //Writes graph g by listing the number of vertices and the number of edges.
    void writeGraph(const Graph* g)
    {
        printf("There are %i vertices and %i edges", g->numOfVertices, g->numOfEdges);
        printf("Vertices        Weight");
        for(int i = 0; i < g->numOfEdges; i++)
        {
            printf(" %i %i      %i", g->edges[i].vertex1, g->edges[i].vertex2, g->edges[i].weight);
        }

    }

    int main()
    {  

        int maxEdges = 1000;
        Graph* g = readGraph(maxEdges);
        writeGraph(g);
        return 0;
    }

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Я не вижу проблемы в вашем коде, но, возможно, я слепой. Тем не менее, вы можете использовать GDB для отладки. 15 хорошо вложенных минут: https://www.youtube.com/watch?v=PorfLSr3DDI

Или вы можете использовать такой инструмент, как Valgrind: https://valgrind.org/, https://valgrind.org/docs/manual/quick-start.html

1013 * Я sh ты лучший.
0 голосов
/ 03 апреля 2020

Я действительно нашел ответ, ребята, благодаря некоторым старым добрым заявлениям в GDB. В readGraph scanf сначала сканирует переменную ребра и сохраняет переменную. Таким образом, следующее считанное число не будет фактическим первым числом, что приведет к бесконечному l oop (ошибка сегментации), потому что в зависимости от входа 0 читается как часть графика и позже никогда не будет найдено. Просто измените сканирование на scanf ("% i% i", & v, & w); и использование уже прочитанного u в insertEdge () будет правильно читать график.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...