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ść
pekfos
» 2015-05-10 18:26:56
W który miejscu crash?

Wywal te delete temp1, temp2, lepiej nie mieć tam niczego, niż to. Przenieś definicje tych tempów do metod, gdzie są używane.
P-132054
KamilosD
Temat założony przez niniejszego użytkownika
» 2015-05-10 22:05:07
Dobra. Posiedziałem i zauważyłem, że prawidłowo tworzy mi listę przy addedge. Jak widać w załączonym kodzie, dodałem wiadomość "stworzono liste". Przed tym żadnego crashu. Problem występował przy jej wczytaniu, kiedy brało ogromną wartość "wierz" nie wiadomo skąd. Zmieniłem odpowiednio wszystkie funkcje by wartość ta była prawidłowa. I niby jest bo wyświetla w display1 przed pętlą, że wierz jest równy ilości wierzchołków. Mimo tego i tak funkcja wyświetlenia w liście crashuje i tworzy dodatkowe wierzchołki. Np tworząc ich 30, dorabia jeszcze 2 z pustymi wartościami i crash :/

EDIT:
DZIAŁA! :D Jestem mózg. Wybaczcie mi to moje trucie dupy... Jestem chory i do tego kodzę dzisiaj z 10 godzin. Przy wyświetlaniu może panować mały burdel, wyrzucam też na ekran kilka informacji pomocniczych o ilości wierzchołków itd. :) Wielkie dzieki. Ale mimo wszystko prosiłbym jeszcze o nie zamykanie tematu.

EDIT 2:
Jest jeszcze dziwna rzecz. Przy tworzeniu grafu o wielkości 25, 50, 100 itd wszystko ok z listą, zaś przy mniejszej wartości jak np 15 crash :/ Bardzo dziwne

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;
    krawedzie * tab;
    char ** macierz;
    void readfromfile( string nazwa );
    void display();
    void createrand();
};

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

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
        tab = new krawedzie[ 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( klgraf * obmacgraf, 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 
   
    listakraw * temp1, * temp2;
   
    for( i = 0; i < kraw; i++ ) // Odczytujemy kolejne definicje krawędzi
    {
        temp1 = new 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;
    }
   
    display1( obmacgraf );
    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( klgraf * obmacgraf )
{
    cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n";
    cout << endl << "wierz " << obmacgraf->wierz << endl;
    int wierzcholki = obmacgraf->wierz;
   
    listakraw * temp = new listakraw;
    for( int i = 0; i < wierzcholki; i++ )
    {
        cout << "lista[" << i << "] = ";
        temp = tablist[ i ];
        while( temp )
        {
            cout << setw( 4 ) << temp->wk << "w" << temp->waga;
            temp = temp->next;
        }
        cout << "\nWyswietlono " << i + 1 << " element listy\n";
    }
    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
    tab = new krawedzie[ 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 - 1 || pomoc == 0 )
        {
            if( i == wierz - 1 )
            {
                pomoc = 1;
                continue;
            }
           
            waga1 =( rand() % 2 + 2 );
            wk1 = n + 1;
            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 )
        {
            waga1 =( rand() % 2 + 2 );
            wk1 =( rand() %( wierz ) );
            wp1 =( rand() %( wierz ) );
           
            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();
   
}

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


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( & obmacgraf, nazwa );
                            break;
                        }
                    case 2:
                        {
                            system( "cls" );
                            obmacgraf.createrand();
                            obligraf.tablist = new listakraw *[ obmacgraf.wierz ];
                            for( int i = 0; i < obmacgraf.wierz; i++ ) obligraf.tablist[ i ] = NULL;
                           
                            addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab );
                            obligraf.display1( & obmacgraf );
                            break;
                        }
                    case 3:
                        {
                            obmacgraf.display();
                            obligraf.display1( & obmacgraf );
                            break;
                        }
                    }
                } while( wyb1 != 0 );
               
            }
        }
    } while( wybor != 3 );
   
    system( "cls" );
    cout << "KONIEC PROGRAMU\n\n";
    system( "pause" );
    return 0;
}
P-132067
1 2 3 4 « 5 »
Poprzednia strona Strona 5 z 5