Проблема с отображением 2D-динамического массива C ++ - PullRequest
0 голосов
/ 13 апреля 2011

Я читал о двухмерных динамических массивах, но, очевидно, я не совсем понял, как эта программа не работает.Программа вроде бы лежит в отображении массива.Входной файл представляет собой текстовый файл с V и E в первой строке с «отступом табуляции» между ними.Входные вершины на следующей строке снова вкладка с новым набором на каждой строке.На DevCpp говорится, что есть ошибка сегментации.Любая помощь будет очень высоко ценится.спасибо.

#include <iostream>
#include <fstream>

using namespace std;

#define maxV 100
#define unseen 0

typedef int Vertex;

class Graph {
private:
   int V, E;
   int**adj;

public:
    Graph(char filename[]);
    void display();
};

// constructor ask you for file name
Graph::Graph(char fname[])  {
    Vertex u,v;
    int j;

    ifstream f;
    f.open(fname, ios::in);
    if(!f) {
       cout << "\nError: Cannot open file\n";
       return;
    }

    //Input number of vertices and edges
    f >> V >> E;

    int** adj = new int*[V];
    for (int i=0;i<=V;i++)
    {
       adj[i]= new int[V];
    } 

    for(int x=0;x<=V; ++x) // initially 0 array
    {
       for (int y=0;y<=V;++y) 
          adj[x][y] = 0;
    }                             

    // Set diagonal to 1 
    for(int z=0; z<=V; ++z) 
       adj[z][z]=1;

    for (j =0;j<=E;++j)
    {
        f>>u>>v;
        adj[u][v] = 1;
        adj[v][u] = 1;
    }
}

// This method displays the adjacency lists representation.
void Graph::display(){
   int a,b,c;
   for (a=0;a<=V;++a)
   {
      cout << a << "  ";
   }
   cout << endl;

   for (b=0;b<=V;++b)
   {
      cout << b << "| ";

      for (c=0;c<=V;++c)
      {
         cout<<adj[b][c]<<"| ";
      }
      cout<<endl;
   }
}

int main()
{
    char fname[20];
    cout << "\nInput name of file with graph definition: ";
    cin >> fname;

    Graph g(fname);
    g.display();
}

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011
//Input number of vertices and edges
f >> V >> E;

// You're hiding your member variable in the following line, leading to an incorrect initialization    
// int** adj = new int*[V];
adj = new int*[V];
for (int i=0;i<=V;i++)
{
    adj[i]= new int[V];
} 
0 голосов
/ 13 апреля 2011

Я не знаю, какая строка вызывает ошибку сегментации, но вот некоторые вещи, на которые следует обратить внимание:

for (j =0;j<=E;++j)
{
    f>>u>>v;
    adj[u][v] = 1;
    adj[v][u] = 1;
}

Гарантируется ли u и v меньше V?Если нет, то вы могли бы писать за пределами матрицы.

Что происходит, когда j == E?Вы пытаетесь прочитать строку после последней строки в файле.Вместо этого вы должны проверить j < E.Лучшим способом по-прежнему было бы игнорировать E все вместе и просто сделать это:

while(f >> u >> v)
{
    adj[u][v] = 1;
    adj[v][u] = 1;
}

Скорее всего, здесь ошибка сегментации:

for (b=0;b<=V;++b)
{
    cout<<(b+1)<<"| ";
    for (c=0;c<=V;++c)
    {
        cout<<adj[b][c]<<"| ";
    }
    cout<<endl;
}

условия цикла for должныпроверять b < V и c < V не <=.когда b или c == V вы определенно читаете вне матрицы.

0 голосов
/ 13 апреля 2011

Я вижу две существенные проблемы только в коде, который инициализирует массив данных.Во-первых, такой цикл

    for (int i=0;i<=V;i++)

зацикливает на еще один элемент, чем фактически существует в массиве.Правильная форма цикла, если длина массива V элементов равна

for (int i=0;i<V;i++)

Это "меньше чем", а не "меньше или равно".

Во-вторых, вы выделяете оба массивауказатели должны быть длиной V указателей, а отдельные столбцы также иметь длину V элементов;но позже вы используете тот же массив и ожидаете, что он будет иметь размер V x E.Таким образом, в целом, я думаю, что код распределения должен быть

int** adj = new int*[V];
for (int i=0;i<V;i++)
{
   adj[i]= new int[E];
} 

В других местах могут быть и другие ошибки, но, по крайней мере, я вас начал.

...