[C++] Tablica dwuwymiarowa


(rafalski) #1

Witam!

Po prostu zgłupiałem. Co robię źle, że po wykonaniu tego kodu zwracana wartość to 1 a nie 0. Na dobrą sprawę cały wiersz tab[x][2] jest równy 1.

#include 

#include 

#include 

#include 



using namespace std;


int main(int argc, char *argv[])

{

    ifstream filein;

    int wymiar; 

    int tab[wymiar][wymiar]; 



    filein.open("in.txt");

    if (filein.is_open())

    {

                         filein >> wymiar;

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

                             for (int j=0; j<=wymiar; j++)

                             {

                                 tab[i][j]=0; //wypełnienie tablicy zerami

                             }



                         tab[4][2]=1;

                         cout<

                         cout<<"\n";

                         filein.close();                     

    }

    else

    cout<<"Blad otwarcia pliku wejsciowego\n\n";






    system("PAUSE");

    return EXIT_SUCCESS;

}

(system) #2

--- EDIT ----

#include 

#include 

#include 

#include 

using namespace std;


const unsigned int r = 100;


    int main(int argc, char *argv[])

    {

        ifstream filein;

        int wymiar;

        int tab[r][r];



        filein.open("in.h");

        if (filein.is_open())

        {

                             filein >> wymiar;


                             for (int i=0; i<=wymiar; i++){

                                 for (int j=0; j<=wymiar; j++)

                                 {

                                    tab[i][j]=0; //wypełnienie tablicy zerami

                                 }

                             }


                             cout << endl;         

                             tab[4][2]=1;

                             cout<
                             cout<
                             for (int i=0; i<=wymiar; i++){

                                 for (int j=0; j<=wymiar; j++){

                                     cout << tab[i][j];

                                 }

                                 cout << endl;

                             } 

                             cout<<"\n";

                             filein.close();                     

        }

        else

        cout<<"Blad otwarcia pliku wejsciowego\n\n";





        system("PAUSE");

        return EXIT_SUCCESS;

    }

Teraz, ok? :wink:

Zapomniałem, że zrobiłem to w Dev'ie :D. Teraz powinno być ok


(rafalski) #3

Po uruchomieniu Twojego kodu windows pokazuje "wystąpił problem z aplikacją"


(etam) #4

Co to jest?

int wymiar;

    int tab[wymiar][wymiar];

Zmień Dev-C++ na coś nowszego. Np. Code::Blocks Spróbuj tego:

#include 

#include 

#include 


using namespace std;


int main()

{

    ifstream filein;

    unsigned int wymiar;


    filein.open("in.txt");

    if (!filein.is_open()) {

        cout << "Blad otwarcia pliku wejsciowego" << endl;

        return 1;

    }


    filein >> wymiar;

    vector > tab(wymiar, vector(wymiar)); // zainicjuje wszystkie pola zerami


    tab[4][2] = 1;

    cout << tab[2][2] << endl;

    filein.close();


    cin.sync(); // system("PAUSE"); jest złe!

    cin.get();

    return 0;

}

[/code]

Jeszcze sprawdź zawartość pliku in.txt. Jeżeli na początku ma liczbę mniejszą od 5, to możesz mieć problemy.


(rafalski) #5

Problem w tym, że mam zadanie do wykonania z grafem, które trzeba zacząć od wygenerowania tablicy sąsiedztwa na podstawie pliku z z wierzchołkami incydentnymi:

6

2 4

1 3 4 5

2 4 5 6

1 2 3 5

2 3 4 6

3 5

Pierwsza linia opisuje ile wierzchołków ma graf. Kolejne linie odpowiadają za wierzchołki i ich są siadów. Tak więc np. wierzchołek 1 sąsiaduje z 2 i 4. Tablica sąsiedztwa powinna zostać wygenerowana w taki sposób: tab[linia z pliku][wierzchołek sąsiedni]=1

0000000

0010100

0101110

0010111

0111010

0011101

0001010

(etam) #6

Ty się skupiasz na algorytmie, a błędy masz na dużo niższym poziomie, na które chyba nie zwracasz uwagi.

Pozwól, że sam odpowiem na zadane wcześniej przeze mnie pytanie:

Co tu się dzieje? W trakcie wykonania programu alokowana jest w pamięci zmienna wymiar, której zawartość to jakieś śmieci, które się znajdowały tam wcześniej. Następnie jest alokowana tablica o śmieciowatych wymiarach. Dopiero gdzieś później wczytujesz wartość do zmiennej wymiar. Czy to ma sens? Nie. Gdybyś użył jakiegoś bardziej aktualnego Środowiska i kompilatora (Dev-C++ jest mocno przestarzałe), to byś dostał ostrzeżenia o niezainicjalizowanych zmiennych.

Innymi słowy to co musisz zrobić (i to np. jest w moim przykładzie), to najpierw wczytać wartość wymiar, potem zadeklarować tablicę (lub wektor wektorów, lub cokolwiek innego), a dopiero potem wczytywać informacje o wierzchołkach.