Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z funkcją globalną (jako argumenty obiekty dwóch różnych klas)

Ostatnio zmodyfikowano 2015-05-10 22:05
Autor Wiadomość
KamilosD
Temat założony przez niniejszego użytkownika
Problem z funkcją globalną (jako argumenty obiekty dwóch różnych klas)
» 2015-05-10 13:33:30
Witam. Mam problem z funkcją addedge. Generuję losowo graf i wrzucam go do macierzy. Później, żeby przekopiować krawędzie z macierzy do listy, do stworzonej funkcji globalnej addedge chcę wrzucić tablicę ( od struktury krawedzie) przechowującącej krawędzie klasy klgraf i tablicę list (od struktury listakraw) z klasy listgraf. Przy kompilacji nie wyrzuca żadnych błędów, ale program crashuje przy 291 linii (zaraz po rozpoczęciu pętli for w metodzie addedge). Jest mi ktoś w stanie pomóc?

C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <ctime>
#include <conio.h>

// KAMIL DZIAŁEK - SDIZO PROJEKT II
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

int wierz, kraw;
float gest;

struct krawedzie
{
    int waga, wp, wk;
};

struct listakraw
{
    int wk, waga;
    listakraw * next;
};

class listgraf
{
public:
    friend class klgraf;
    //int wierz, kraw;
    listakraw * head;
    listakraw ** tablist;
    void readfromfile( string nazwa );
    void display();
};

class klgraf
{
public:
    friend class listgraf;
    //int wierz, kraw;
    //float gest;
    krawedzie * tab;
    char ** macierz;
    void readfromfile( string nazwa );
    void display();
    void createrand( listgraf * obligraf );
};

void addedge( listakraw ** tablist, krawedzie * tab );

void klgraf::readfromfile( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str(), ios::in );
    if( !plik ) cout << "\n\nBLAD WCZYTYWANIA PLIKU! Podano nieprawidlowa nazwe lub plik nie istnieje.\n\n" << endl;
   
    else
    {
        int i, j, wp1, wk1, waga1, w1, k1;
        plik >> k1;
        plik >> w1;
       
        wierz = w1;
        kraw = k1;
        macierz = new char *[ wierz ]; // Tworzymy tablicę wskaźników macierzy
        krawedzie tab[ kraw ];
       
        for( i = 0; i < wierz; i++ )
             macierz[ i ] = new char[ wierz ]; // Tworzymy wiersze macierzy
       
        for( i = 0; i < wierz; i++ ) // Macierz wypełniamy zerami
             for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0;
       
        cout << "\nLiczba krawedzi: " << kraw << "\nLiczba wierzcholkow: " << wierz << endl;
       
        for( i = 0; i < kraw; i++ ) // macierz
        {
            plik >> tab[ i ].wp;
            plik >> tab[ i ].wk;
            plik >> tab[ i ].waga;
            macierz[ tab[ i ].wp ][ tab[ i ].wk ] = tab[ i ].waga;
            macierz[ tab[ i ].wk ][ tab[ i ].wp ] = tab[ i ].waga;
        }
       
        display();
        plik.close();
       
    }
   
}

void listgraf::readfromfile( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str(), ios::in );
   
    int i, j, wp1, wk1, waga1, w1, k1;
    plik >> k1;
    plik >> w1;
    wierz = w1;
    kraw = k1;
   
    tablist = new listakraw *[ wierz ]; // Tworzymy tablicę list sąsiedztwa
    for( i = 0; i < wierz; i++ ) tablist[ i ] = NULL; // Tablicę wypełniamy pustymi listami
   
    for( i = 0; i < kraw; i++ ) // Odczytujemy kolejne definicje krawędzi
    {
        listakraw * temp1 = new listakraw;
        listakraw * temp2 = new listakraw;
        plik >> wp1;
        plik >> wk1;
        plik >> waga1;
        temp1->wk = wk1;
        temp1->waga = waga1;
        temp1->next = tablist[ wp1 ];
        tablist[ wp1 ] = temp1;
        temp2->wk = wp1;
        temp2->waga = waga1;
        temp2->next = tablist[ wk1 ];
        tablist[ wk1 ] = temp2;
    }
   
    display();
    plik.close();
}


void klgraf::display()
{
    int i, j;
    cout << "\n\nWyswietlenie macierzowo:\n\n   ";
    for( i = 0; i < wierz; i++ ) cout << setw( 3 ) << i;
   
    cout << endl << endl;
    for( i = 0; i < wierz; i++ )
    {
        cout << setw( 3 ) << i;
        for( j = 0; j < wierz; j++ ) cout << setw( 3 ) <<( int ) macierz[ i ][ j ];
       
        cout << endl;
    }
   
    int pomoc = 0;
    for( i = 0; i < wierz; i++ ) // Sprawdzenie ilosci "jedynek"
         for( int j = 0; j < wierz; j++ ) if( macierz[ i ][ j ] == 1 ) pomoc++;
   
    cout << endl << endl; // << "Ilosc jedynek: " << pomoc << endl << endl;
   
    system( "pause" );
}

void listgraf::display()
{
    cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n";
    for( int i = 0; i < wierz; i++ )
    {
        listakraw * temp = new listakraw;
        cout << "lista[" << i << "] = ";
        temp = tablist[ i ];
        while( temp )
        {
            cout << setw( 4 ) << temp->wk << "w" << temp->waga;
            temp = temp->next;
        }
        cout << endl;
    }
    cout << endl << endl;
    system( "pause" );
}

void klgraf::createrand( listgraf * obligraf )
{
    int w1, k1, maxkraw, wp1, wk1, n, i, j, waga1;
    n = 0;
    int pomoc = 0;
   
    system( "cls" );
    cout << "Ilu wierzcholkowy graf chcesz stworzyc?: ";
    cin >> w1;
   
    do
    {
        system( "cls" );
        cout << "Liczba wierzcholkow: " << w1 << "\nPodaj gestosc grafu (podaj w %): ";
        cin >> gest;
    } while( gest < 1 && gest > 100 );
   
    wierz = w1;
    system( "cls" );
    cout << "Liczba wierzcholkow: " << wierz << "\nGestosc grafu: " << gest << "%";
    gest = gest / 100;
   
    maxkraw =(( wierz *( wierz - 1 ) ) / 2 );
    k1 = gest * maxkraw;
    kraw = k1;
    cout << "\nMaksymalna liczba krawedzi " << maxkraw << "\nLiczba krawedzi " << kraw << "\nGestosc " << gest << "\nLiczba wierzcholkow " << wierz << endl;
   
    macierz = new char *[ wierz ]; // Tworzymy tablicę wskaźników
    krawedzie tab[ kraw ]; // Tworzymy tablicę krawedzi
   
    for( i = 0; i < wierz; i++ )
         macierz[ i ] = new char[ wierz ]; // Tworzymy wiersze
   
    for( i = 0; i < wierz; i++ ) // Macierz wypełniamy zerami
         for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0;
   
    for( i = 0; i < kraw; i++ )
    {
        if( i < wierz || pomoc == 0 )
        {
            if( i == wierz - 1 )
            {
                pomoc = 1;
                continue;
            }
           
            waga1 =( rand() % 3 );
            wk1 =( rand() %( wierz ) );
            wp1 = n;
            //cout << "\nwk1 " << wk1 << endl << "\nwp1 " << wp1 << endl;
           
            if( wk1 == wp1 )
            {
                i--;
                continue;
            }
            if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 )
            {
                i--;
                continue;
            }
           
            tab[ i ].wp = wp1;
            tab[ i ].wk = wk1;
            tab[ i ].waga = waga1;
            //cout << tab[i].wp << endl << tab[i].wk << endl << tab[i].waga << endl;
            macierz[ wp1 ][ wk1 ] = tab[ i ].waga;
            macierz[ wk1 ][ wp1 ] = tab[ i ].waga;
            n++;
        }
        else if( pomoc == 1 )
        {
            n =( rand() %( wierz ) );
            waga1 =( rand() % 3 );
            wk1 =( rand() %( wierz ) );
            wp1 = n;
           
            if( wk1 == wp1 )
            {
                i--;
                continue;
            }
            if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 )
            {
                i--;
                continue;
            }
           
            tab[ i ].wp = wp1;
            tab[ i ].wk = wk1;
            tab[ i ].waga = waga1;
            //cout << tab[i].wp << endl << tab[i].wk << endl << tab[i].waga << endl;
            macierz[ wp1 ][ wk1 ] = tab[ i ].waga;
            macierz[ wk1 ][ wp1 ] = tab[ i ].waga;
        }
       
    }
    display();
    /*
    obligraf->tablist  = new listakraw *[wierz];
    int to, from, weight;
   
    for ( i=0 ; i<kraw ; i++ )
    {
    to = tab[i].wp;
    from = tab[i].wk;
    weight = tab[i].waga;
    addedge(obligraf->tablist,to,from,weight);
    system("pause");
    }*/
   
}

void addedge( listakraw ** tablist, krawedzie * tab )
{
    int from, to, waga;
   
    for( int i = 0; i < kraw; i++ )
    {
        from = tab[ i ].wp;
        to = tab[ i ].wk;
        waga = tab[ i ].waga;
        tablist[ from ]->wk = to;
        tablist[ to ]->wk = from;
        tablist[ from ]->waga = waga;
        tablist[ to ]->waga = waga;
    }
   
}


int main( int argc, char ** argv )
{
    srand( time( 0 ) );
    klgraf obmacgraf;
    klgraf();
    listgraf obligraf;
   
    menuglowne:
    int wybor;
   
    do
    {
       
        system( "cls" );
        cout << "Kamil Dzialek (209991) - SDIZO Projekt II\n\n"
        << "Wybierz problem, ktory chcesz rozwiazac:\n"
        << "1 - wyznaczanie minimalnego drzewa rozpinajacego\n"
        << "2 - wyznaczanie najkrotszej sciezki w grafie\n"
        << "3 - koniec programu\n\n"
        << "Podaj opcje: ";
        cin >> wybor;
       
        switch( wybor )
        {
        case 1: // MST
            {
                int wyb1;
               
                do
                {
                    mstchoice: system( "cls" );
                   
                    cout << "Co chcesz zrobic?:\n"
                    << "1 - Wczytaj z pliku\n"
                    << "2 - Wygeneruj losowo\n"
                    << "3 - Wyswietl listowo i macierzowo na ekranie\n"
                    << "4 - Algorytm Prima\n"
                    << "5 - Algorytm Kruskala\n"
                    << "0 - Powrot do poprzedniego menu\n\n"
                    << "Podaj opcje: ";
                   
                    cin >> wyb1;
                    system( "cls" );
                   
                    switch( wyb1 )
                    {
                    case 1:
                        {
                            system( "cls" );
                            string nazwa;
                            cout << "Podaj nazwe pliku .txt do wczytania (pamietaj o dodaniu rozszerzenia '.txt'!):\n";
                            cin >> nazwa;
                           
                            obmacgraf.readfromfile( nazwa );
                            obligraf.readfromfile( nazwa );
                            break;
                        }
                    case 2:
                        {
                            system( "cls" );
                            obmacgraf.createrand( & obligraf );
                            obligraf.tablist = new listakraw *[ wierz ];
                            addedge( obligraf.tablist, obmacgraf.tab );
                            break;
                        }
                    case 3:
                        {
                            obmacgraf.display();
                            obligraf.display();
                            break;
                        }
                    }
                } while( wyb1 != 0 );
               
            }
        }
    } while( wybor != 3 );
   
    system( "cls" );
    cout << "KONIEC PROGRAMU\n\n";
    system( "pause" );
    return 0;
}
P-131992
pekfos
» 2015-05-10 13:36:58
Nie mieszaj zmiennych globalnych z polami klas.
P-131993
KamilosD
Temat założony przez niniejszego użytkownika
» 2015-05-10 13:41:53
Why? Inaczej tego nie widzę. Bo w jaki sposób dwie różne klasy mają korzystać z tych samych zmiennych? (wybacz brak wiedzy, nie za wiele czasu spędziłem na kodzeniu xd)
P-131996
pekfos
» 2015-05-10 13:50:26
Ilość krawędzi opisuje rozmiar tablicy z nimi, więc te dwie informacje muszą być razem. Jeśli możesz jakoś działać na tablicy, to będziesz mieć też dostęp do rozmiaru. Obecnie masz do tego jedną zmienną globalną, opisującą rozmiar ostatniej utworzonej tablicy, użycie jej w kontekście jakiejkolwiek innej tablicy jest niepoprawne.
Dodatkowo, ten twój program to jeden wielki wyciek pamięci.
P-132000
KamilosD
Temat założony przez niniejszego użytkownika
» 2015-05-10 13:59:00
Poprawiam program. Kod wygląda na razie tak. Co masz na myśli mówiąc wyciek pamięci? Chodzi Ci może o nie kasowanie zmiennych typu temp1, temp2? Coś jeszcze?

EDIT:
Po wpisaniu cout << endl << from << endl << to << endl << waga; do pętli wyświetla jakieś losowe miejsca w pamięci. Tutaj teraz leży problem.



C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <ctime>
#include <conio.h>

// KAMIL DZIAŁEK - SDIZO PROJEKT II
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

struct krawedzie
{
    int waga, wp, wk;
};

struct listakraw
{
    int wk, waga;
    listakraw * next;
};

class klgraf
{
public:
    int wierz, kraw;
    float gest;
    //friend class listgraf;
    //int wierz, kraw;
    //float gest;
    krawedzie * tab;
    char ** macierz;
    void readfromfile( string nazwa );
    void display();
    void createrand();
};

class listgraf
    : public klgraf
{
public:
    //friend class klgraf;
    //int wierz, kraw;
    listakraw * head;
    listakraw ** tablist;
    void readfromfile( string nazwa );
    void display1();
};

void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab );

void klgraf::readfromfile( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str(), ios::in );
    if( !plik ) cout << "\n\nBLAD WCZYTYWANIA PLIKU! Podano nieprawidlowa nazwe lub plik nie istnieje.\n\n" << endl;
   
    else
    {
        int i, j, wp1, wk1, waga1, w1, k1;
        plik >> k1;
        plik >> w1;
       
        wierz = w1;
        kraw = k1;
        macierz = new char *[ wierz ]; // Tworzymy tablicę wskaźników macierzy
        krawedzie tab[ kraw ];
       
        for( i = 0; i < wierz; i++ )
             macierz[ i ] = new char[ wierz ]; // Tworzymy wiersze macierzy
       
        for( i = 0; i < wierz; i++ ) // Macierz wypełniamy zerami
             for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0;
       
        cout << "\nLiczba krawedzi: " << kraw << "\nLiczba wierzcholkow: " << wierz << endl;
       
        for( i = 0; i < kraw; i++ ) // macierz
        {
            plik >> tab[ i ].wp;
            plik >> tab[ i ].wk;
            plik >> tab[ i ].waga;
            macierz[ tab[ i ].wp ][ tab[ i ].wk ] = tab[ i ].waga;
            macierz[ tab[ i ].wk ][ tab[ i ].wp ] = tab[ i ].waga;
        }
       
        display();
        plik.close();
       
    }
   
}

void listgraf::readfromfile( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str(), ios::in );
   
    int i, j, wp1, wk1, waga1, w1, k1;
    plik >> k1;
    plik >> w1;
    wierz = w1;
    kraw = k1;
   
    tablist = new listakraw *[ wierz ]; // Tworzymy tablicę list sąsiedztwa
    for( i = 0; i < wierz; i++ ) tablist[ i ] = NULL; // Tablicę wypełniamy pustymi listami
   
    for( i = 0; i < kraw; i++ ) // Odczytujemy kolejne definicje krawędzi
    {
        listakraw * temp1 = new listakraw;
        listakraw * temp2 = new listakraw;
        plik >> wp1;
        plik >> wk1;
        plik >> waga1;
        temp1->wk = wk1;
        temp1->waga = waga1;
        temp1->next = tablist[ wp1 ];
        tablist[ wp1 ] = temp1;
        temp2->wk = wp1;
        temp2->waga = waga1;
        temp2->next = tablist[ wk1 ];
        tablist[ wk1 ] = temp2;
    }
   
    display();
    plik.close();
}


void klgraf::display()
{
    int i, j;
    cout << "\n\nWyswietlenie macierzowo:\n\n   ";
    for( i = 0; i < wierz; i++ ) cout << setw( 3 ) << i;
   
    cout << endl << endl;
    for( i = 0; i < wierz; i++ )
    {
        cout << setw( 3 ) << i;
        for( j = 0; j < wierz; j++ ) cout << setw( 3 ) <<( int ) macierz[ i ][ j ];
       
        cout << endl;
    }
   
    int pomoc = 0;
    for( i = 0; i < wierz; i++ ) // Sprawdzenie ilosci "jedynek"
         for( int j = 0; j < wierz; j++ ) if( macierz[ i ][ j ] == 1 ) pomoc++;
   
    cout << endl << endl; // << "Ilosc jedynek: " << pomoc << endl << endl;
   
    system( "pause" );
}

void listgraf::display1()
{
    cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n";
    for( int i = 0; i < wierz; i++ )
    {
        listakraw * temp = new listakraw;
        cout << "lista[" << i << "] = ";
        temp = tablist[ i ];
        while( temp )
        {
            cout << setw( 4 ) << temp->wk << "w" << temp->waga;
            temp = temp->next;
        }
        cout << endl;
    }
    cout << endl << endl;
    system( "pause" );
}

void klgraf::createrand()
{
    int w1, k1, maxkraw, wp1, wk1, n, i, j, waga1;
    n = 0;
    int pomoc = 0;
   
    system( "cls" );
    cout << "Ilu wierzcholkowy graf chcesz stworzyc?: ";
    cin >> w1;
   
    do
    {
        system( "cls" );
        cout << "Liczba wierzcholkow: " << w1 << "\nPodaj gestosc grafu (podaj w %): ";
        cin >> gest;
    } while( gest < 1 && gest > 100 );
   
    wierz = w1;
    system( "cls" );
    cout << "Liczba wierzcholkow: " << wierz << "\nGestosc grafu: " << gest << "%";
    gest = gest / 100;
   
    maxkraw =(( wierz *( wierz - 1 ) ) / 2 );
    k1 = gest * maxkraw;
    kraw = k1;
    cout << "\nMaksymalna liczba krawedzi " << maxkraw << "\nLiczba krawedzi " << kraw << "\nGestosc " << gest << "\nLiczba wierzcholkow " << wierz << endl;
   
    macierz = new char *[ wierz ]; // Tworzymy tablicę wskaźników
    krawedzie tab[ kraw ]; // Tworzymy tablicę krawedzi
   
    for( i = 0; i < wierz; i++ )
         macierz[ i ] = new char[ wierz ]; // Tworzymy wiersze
   
    for( i = 0; i < wierz; i++ ) // Macierz wypełniamy zerami
         for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0;
   
    for( i = 0; i < kraw; i++ )
    {
        if( i < wierz || pomoc == 0 )
        {
            if( i == wierz - 1 )
            {
                pomoc = 1;
                continue;
            }
           
            waga1 =( rand() % 3 );
            wk1 =( rand() %( wierz ) );
            wp1 = n;
            //cout << "\nwk1 " << wk1 << endl << "\nwp1 " << wp1 << endl;
           
            if( wk1 == wp1 )
            {
                i--;
                continue;
            }
            if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 )
            {
                i--;
                continue;
            }
           
            tab[ i ].wp = wp1;
            tab[ i ].wk = wk1;
            tab[ i ].waga = waga1;
            //cout << tab[i].wp << endl << tab[i].wk << endl << tab[i].waga << endl;
            macierz[ wp1 ][ wk1 ] = tab[ i ].waga;
            macierz[ wk1 ][ wp1 ] = tab[ i ].waga;
            n++;
        }
        else if( pomoc == 1 )
        {
            n =( rand() %( wierz ) );
            waga1 =( rand() % 3 );
            wk1 =( rand() %( wierz ) );
            wp1 = n;
           
            if( wk1 == wp1 )
            {
                i--;
                continue;
            }
            if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 )
            {
                i--;
                continue;
            }
           
            tab[ i ].wp = wp1;
            tab[ i ].wk = wk1;
            tab[ i ].waga = waga1;
            //cout << tab[i].wp << endl << tab[i].wk << endl << tab[i].waga << endl;
            macierz[ wp1 ][ wk1 ] = tab[ i ].waga;
            macierz[ wk1 ][ wp1 ] = tab[ i ].waga;
        }
       
    }
    display();
    /*
    obligraf->tablist  = new listakraw *[wierz];
    int to, from, weight;
   
    for ( i=0 ; i<kraw ; i++ )
    {
    to = tab[i].wp;
    from = tab[i].wk;
    weight = tab[i].waga;
    addedge(obligraf->tablist,to,from,weight);
    system("pause");
    }*/
   
}

void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab )
{
    int from, to, waga, ile;
    ile = obmacgraf->kraw;
    cout << "\n\nIle: " << ile << endl << endl;
    system( "pause" );
    for( int i = 0; i < ile; i++ )
    {
        from = tab[ i ].wp;
        to = tab[ i ].wk;
        waga = tab[ i ].waga;
        tablist[ from ]->wk = to;
        tablist[ to ]->wk = from;
        tablist[ from ]->waga = waga;
        tablist[ to ]->waga = waga;
    }
   
}


int main( int argc, char ** argv )
{
    srand( time( 0 ) );
    klgraf obmacgraf;
    klgraf();
    listgraf obligraf;
   
    menuglowne:
    int wybor;
   
    do
    {
       
        system( "cls" );
        cout << "Kamil Dzialek (209991) - SDIZO Projekt II\n\n"
        << "Wybierz problem, ktory chcesz rozwiazac:\n"
        << "1 - wyznaczanie minimalnego drzewa rozpinajacego\n"
        << "2 - wyznaczanie najkrotszej sciezki w grafie\n"
        << "3 - koniec programu\n\n"
        << "Podaj opcje: ";
        cin >> wybor;
       
        switch( wybor )
        {
        case 1: // MST
            {
                int wyb1;
               
                do
                {
                    mstchoice: system( "cls" );
                   
                    cout << "Co chcesz zrobic?:\n"
                    << "1 - Wczytaj z pliku\n"
                    << "2 - Wygeneruj losowo\n"
                    << "3 - Wyswietl listowo i macierzowo na ekranie\n"
                    << "4 - Algorytm Prima\n"
                    << "5 - Algorytm Kruskala\n"
                    << "0 - Powrot do poprzedniego menu\n\n"
                    << "Podaj opcje: ";
                   
                    cin >> wyb1;
                    system( "cls" );
                   
                    switch( wyb1 )
                    {
                    case 1:
                        {
                            system( "cls" );
                            string nazwa;
                            cout << "Podaj nazwe pliku .txt do wczytania (pamietaj o dodaniu rozszerzenia '.txt'!):\n";
                            cin >> nazwa;
                           
                            obmacgraf.readfromfile( nazwa );
                            obligraf.readfromfile( nazwa );
                            break;
                        }
                    case 2:
                        {
                            system( "cls" );
                            obmacgraf.createrand();
                            obligraf.tablist = new listakraw *[ obmacgraf.wierz ];
                            addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab );
                            break;
                        }
                    case 3:
                        {
                            obmacgraf.display();
                            obligraf.display();
                            break;
                        }
                    }
                } while( wyb1 != 0 );
               
            }
        }
    } while( wybor != 3 );
   
    system( "cls" );
    cout << "KONIEC PROGRAMU\n\n";
    system( "pause" );
    return 0;
}
P-132002
pekfos
» 2015-05-10 14:03:05
Rozumiem, że błąd dalej występuje i w tym samym miejscu? Co robisz, żeby go wywołać i jakimi danymi?

Chodzi Ci może o nie kasowanie zmiennych typu temp1, temp2? Coś jeszcze?
Chodzi o niekasowanie żadnej zaalokowanej pamięci.
P-132003
KamilosD
Temat założony przez niniejszego użytkownika
» 2015-05-10 14:14:27
Dodałem kilka destruktorów. Wyrzuca jakieś miejsca w pamięci przy odczytaniu wartości to, from i waga w petli metody addedge.

C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <ctime>
#include <conio.h>

// KAMIL DZIAŁEK - SDIZO PROJEKT II
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

struct krawedzie
{
    int waga, wp, wk;
};

struct listakraw
{
    int wk, waga;
    listakraw * next;
};

class klgraf
{
public:
    int wierz, kraw;
    float gest;
    //friend class listgraf;
    //int wierz, kraw;
    //float gest;
    krawedzie * tab;
    char ** macierz;
    void readfromfile( string nazwa );
    void display();
    void createrand();
};

class listgraf
    : public klgraf
{
public:
    //friend class klgraf;
    //int wierz, kraw;
    listakraw * head;
    listakraw ** tablist;
    void readfromfile( string nazwa );
    void display1();
};

void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab );

void klgraf::readfromfile( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str(), ios::in );
    if( !plik ) cout << "\n\nBLAD WCZYTYWANIA PLIKU! Podano nieprawidlowa nazwe lub plik nie istnieje.\n\n" << endl;
   
    else
    {
        this->~klgraf();
        int i, j, wp1, wk1, waga1, w1, k1;
        plik >> k1;
        plik >> w1;
       
        wierz = w1;
        kraw = k1;
        macierz = new char *[ wierz ]; // Tworzymy tablicę wskaźników macierzy
        krawedzie tab[ kraw ];
       
        for( i = 0; i < wierz; i++ )
             macierz[ i ] = new char[ wierz ]; // Tworzymy wiersze macierzy
       
        for( i = 0; i < wierz; i++ ) // Macierz wypełniamy zerami
             for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0;
       
        cout << "\nLiczba krawedzi: " << kraw << "\nLiczba wierzcholkow: " << wierz << endl;
       
        for( i = 0; i < kraw; i++ ) // macierz
        {
            plik >> tab[ i ].wp;
            plik >> tab[ i ].wk;
            plik >> tab[ i ].waga;
            macierz[ tab[ i ].wp ][ tab[ i ].wk ] = tab[ i ].waga;
            macierz[ tab[ i ].wk ][ tab[ i ].wp ] = tab[ i ].waga;
        }
       
        display();
        plik.close();
       
    }
   
}

void listgraf::readfromfile( string nazwa )
{
    ifstream plik;
    plik.open( nazwa.c_str(), ios::in );
   
    int i, j, wp1, wk1, waga1, w1, k1;
    plik >> k1;
    plik >> w1;
    wierz = w1;
    kraw = k1;
   
    this->~listgraf();
    tablist = new listakraw *[ wierz ]; // Tworzymy tablicę list sąsiedztwa
    for( i = 0; i < wierz; i++ ) tablist[ i ] = NULL; // Tablicę wypełniamy pustymi listami
   
    for( i = 0; i < kraw; i++ ) // Odczytujemy kolejne definicje krawędzi
    {
        listakraw * temp1 = new listakraw;
        listakraw * temp2 = new listakraw;
        plik >> wp1;
        plik >> wk1;
        plik >> waga1;
        temp1->wk = wk1;
        temp1->waga = waga1;
        temp1->next = tablist[ wp1 ];
        tablist[ wp1 ] = temp1;
        temp2->wk = wp1;
        temp2->waga = waga1;
        temp2->next = tablist[ wk1 ];
        tablist[ wk1 ] = temp2;
        delete temp1;
        delete temp2;
    }
   
    display();
    plik.close();
}


void klgraf::display()
{
    int i, j;
    cout << "\n\nWyswietlenie macierzowo:\n\n   ";
    for( i = 0; i < wierz; i++ ) cout << setw( 3 ) << i;
   
    cout << endl << endl;
    for( i = 0; i < wierz; i++ )
    {
        cout << setw( 3 ) << i;
        for( j = 0; j < wierz; j++ ) cout << setw( 3 ) <<( int ) macierz[ i ][ j ];
       
        cout << endl;
    }
   
    int pomoc = 0;
    for( i = 0; i < wierz; i++ ) // Sprawdzenie ilosci "jedynek"
         for( int j = 0; j < wierz; j++ ) if( macierz[ i ][ j ] == 1 ) pomoc++;
   
    cout << endl << endl; // << "Ilosc jedynek: " << pomoc << endl << endl;
   
    system( "pause" );
}

void listgraf::display1()
{
    cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n";
    for( int i = 0; i < wierz; i++ )
    {
        listakraw * temp = new listakraw;
        cout << "lista[" << i << "] = ";
        temp = tablist[ i ];
        while( temp )
        {
            cout << setw( 4 ) << temp->wk << "w" << temp->waga;
            temp = temp->next;
        }
        cout << endl;
    }
    cout << endl << endl;
    system( "pause" );
}

void klgraf::createrand()
{
    int w1, k1, maxkraw, wp1, wk1, n, i, j, waga1;
    n = 0;
    int pomoc = 0;
   
    system( "cls" );
    cout << "Ilu wierzcholkowy graf chcesz stworzyc?: ";
    cin >> w1;
   
    do
    {
        system( "cls" );
        cout << "Liczba wierzcholkow: " << w1 << "\nPodaj gestosc grafu (podaj w %): ";
        cin >> gest;
    } while( gest < 1 && gest > 100 );
   
    wierz = w1;
    system( "cls" );
    cout << "Liczba wierzcholkow: " << wierz << "\nGestosc grafu: " << gest << "%";
    gest = gest / 100;
   
    maxkraw =(( wierz *( wierz - 1 ) ) / 2 );
    k1 = gest * maxkraw;
    kraw = k1;
    cout << "\nMaksymalna liczba krawedzi " << maxkraw << "\nLiczba krawedzi " << kraw << "\nGestosc " << gest << "\nLiczba wierzcholkow " << wierz << endl;
   
    this->~klgraf();
    macierz = new char *[ wierz ]; // Tworzymy tablicę wskaźników
    krawedzie tab[ kraw ]; // Tworzymy tablicę krawedzi
   
    for( i = 0; i < wierz; i++ )
         macierz[ i ] = new char[ wierz ]; // Tworzymy wiersze
   
    for( i = 0; i < wierz; i++ ) // Macierz wypełniamy zerami
         for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0;
   
    for( i = 0; i < kraw; i++ )
    {
        if( i < wierz || pomoc == 0 )
        {
            if( i == wierz - 1 )
            {
                pomoc = 1;
                continue;
            }
           
            waga1 =( rand() % 3 );
            wk1 =( rand() %( wierz ) );
            wp1 = n;
            //cout << "\nwk1 " << wk1 << endl << "\nwp1 " << wp1 << endl;
           
            if( wk1 == wp1 )
            {
                i--;
                continue;
            }
            if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 )
            {
                i--;
                continue;
            }
           
            tab[ i ].wp = wp1;
            tab[ i ].wk = wk1;
            tab[ i ].waga = waga1;
            //cout << tab[i].wp << endl << tab[i].wk << endl << tab[i].waga << endl;
            macierz[ wp1 ][ wk1 ] = tab[ i ].waga;
            macierz[ wk1 ][ wp1 ] = tab[ i ].waga;
            n++;
        }
        else if( pomoc == 1 )
        {
            n =( rand() %( wierz ) );
            waga1 =( rand() % 3 );
            wk1 =( rand() %( wierz ) );
            wp1 = n;
           
            if( wk1 == wp1 )
            {
                i--;
                continue;
            }
            if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 )
            {
                i--;
                continue;
            }
           
            tab[ i ].wp = wp1;
            tab[ i ].wk = wk1;
            tab[ i ].waga = waga1;
            //cout << tab[i].wp << endl << tab[i].wk << endl << tab[i].waga << endl;
            macierz[ wp1 ][ wk1 ] = tab[ i ].waga;
            macierz[ wk1 ][ wp1 ] = tab[ i ].waga;
        }
       
    }
    display();
    /*
    obligraf->tablist  = new listakraw *[wierz];
    int to, from, weight;
   
    for ( i=0 ; i<kraw ; i++ )
    {
    to = tab[i].wp;
    from = tab[i].wk;
    weight = tab[i].waga;
    addedge(obligraf->tablist,to,from,weight);
    system("pause");
    }*/
   
}

void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab )
{
    int from, to, waga, ile;
    ile = obmacgraf->kraw;
    cout << "\n\nIle: " << ile << endl << endl;
    for( int i = 0; i < ile; i++ )
    {
        from = tab[ i ].wp;
        to = tab[ i ].wk;
        waga = tab[ i ].waga;
        cout << endl << from << endl << to << endl << waga;
        system( "pause" );
        tablist[ from ]->wk = to;
        tablist[ to ]->wk = from;
        tablist[ from ]->waga = waga;
        tablist[ to ]->waga = waga;
    }
   
}


int main( int argc, char ** argv )
{
    srand( time( 0 ) );
    klgraf obmacgraf;
    klgraf();
    listgraf obligraf;
   
    menuglowne:
    int wybor;
   
    do
    {
       
        system( "cls" );
        cout << "Kamil Dzialek (209991) - SDIZO Projekt II\n\n"
        << "Wybierz problem, ktory chcesz rozwiazac:\n"
        << "1 - wyznaczanie minimalnego drzewa rozpinajacego\n"
        << "2 - wyznaczanie najkrotszej sciezki w grafie\n"
        << "3 - koniec programu\n\n"
        << "Podaj opcje: ";
        cin >> wybor;
       
        switch( wybor )
        {
        case 1: // MST
            {
                int wyb1;
               
                do
                {
                    mstchoice: system( "cls" );
                   
                    cout << "Co chcesz zrobic?:\n"
                    << "1 - Wczytaj z pliku\n"
                    << "2 - Wygeneruj losowo\n"
                    << "3 - Wyswietl listowo i macierzowo na ekranie\n"
                    << "4 - Algorytm Prima\n"
                    << "5 - Algorytm Kruskala\n"
                    << "0 - Powrot do poprzedniego menu\n\n"
                    << "Podaj opcje: ";
                   
                    cin >> wyb1;
                    system( "cls" );
                   
                    switch( wyb1 )
                    {
                    case 1:
                        {
                            system( "cls" );
                            string nazwa;
                            cout << "Podaj nazwe pliku .txt do wczytania (pamietaj o dodaniu rozszerzenia '.txt'!):\n";
                            cin >> nazwa;
                           
                            obmacgraf.readfromfile( nazwa );
                            obligraf.readfromfile( nazwa );
                            break;
                        }
                    case 2:
                        {
                            system( "cls" );
                            obmacgraf.createrand();
                            obligraf.~listgraf();
                            obligraf.tablist = new listakraw *[ obmacgraf.wierz ];
                            addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab );
                            break;
                        }
                    case 3:
                        {
                            obmacgraf.display();
                            obligraf.display();
                            break;
                        }
                    }
                } while( wyb1 != 0 );
               
            }
        }
    } while( wybor != 3 );
   
    system( "cls" );
    cout << "KONIEC PROGRAMU\n\n";
    system( "pause" );
    return 0;
}
P-132004
pekfos
» 2015-05-10 14:18:11
C/C++
obligraf.~listgraf();
Nie możesz ręcznie wywoływać destruktorów, a jedyne dwie zmienne dla których dopisałeś usuwanie akurat nie powinny być usuwane w tym miejscu.
P-132005
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona