Strona 3 z 3 PierwszyPierwszy 123
Pokaż wyniki 21 do 28 z 28

Temat: Wczytywanie danych z pliku do wektora

  1. #21

    Domyślnie

    Chyba chodziło Ci o suma.dane[i * kolumny +j].
    No chyba, że przeciążyłaś operator[] dla Macierz by zwracał referencję do odpowiedniego elementu tablicy wskazywanej przez pole dane.
    zgadza sie, juz poprawilam.

    Natomiast w linijce
    Kod:
    return suma
    Otrzymuje uwage: reference to local variable ‘suma’ returned

    Czy wszysto na pewno dziala poprawnie?

  2. #22

    Post

    Cytat Napisał Gosik Zobacz post
    Natomiast w linijce
    Kod:
    return suma
    Otrzymuje uwage: reference to local variable ‘suma’ returned
    (Domyślam się, że chodzi o metodę Macierz:: operator+?) A jak wygląda prototyp funkcji? Liczy się zadeklarowany typ zwracany, do return możesz dać cokolwiek co się może na niego niejawnie konwertować. Powinnaś zwracać obiekt a nie referencję do niego, coś w tym stylu:
    Kod:
    Macierz Macierz:: operator + (const Macierz &r)
    Bez & przy typie zwracanym.

    PS. Trochę odbiegamy od oryginalnego tematu tego wątku
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  3. #23

    Domyślnie

    Zgadza sie, nie zwrocilam na to uwagi.

    Chcialabym sie jeszcze zapytac o wspomniany przez Ciebie temat przeladowania operatora [].
    Kod:
    double & Macierz::operator[] (size_t wiersz)
    {
            return dane [wiersz * kolumny];
    }
    Zdaje mi sie, ze nie mozemy sie odwolywac do niego
    Kod:
    macierz[nr_wiersza][nr_kolumny]
    Jako, ze mamy postac wektora. Chociaz byloby to calkiem, calkiem, by za pomoca przeladowania operatora wyswietlic zadany element z tablicy np. t[1][2].
    Kod:
    int main()
    {
    Macierz t("wyniki.txt");
    cout<<t[1][2]<<endl;
    }
    PS. Trochę odbiegamy od oryginalnego tematu tego wątku
    Oj tam, oj tam. My go tylko rozwijamy.


    Wroce jeszcze do pierwotnego tematu. Mozemy rowniez stosowac tablice wielowymiarowe.
    Czy spotkales sie moze z wczytywaniem danych do tablicy 4-wym?
    Zastanawiam sie jak takie dane zapisywane sa w pliku.
    Moja inwencja tworcza jest nastepujaca:
    Kod:
    (1 1 2, 2 3 4) (1 2 3, 0 3 2) (1 23 0, 2 2 2) (2 34 0, 3 2 2)
    (1 2 4, 5 2 2) (23 2 2, 2 2 2) (2 2 0, 2 8 2) (2 23 2, 3 6 6)
    i bylaby to tablica t[1][3][2][2];

    No nie wiem...
    Ostatnio edytowane przez Gosik : 04-03-2013 - 17:15

  4. #24

    Post

    Cytat Napisał Gosik Zobacz post
    Chcialabym sie jeszcze zapytac o wspomniany przez Ciebie temat przeladowania operatora [].
    Kod:
    double & Macierz::operator[] (size_t wiersz)
    {
            return dane [wiersz * kolumny];
    }
    Zwracasz referencję do pierwszego elementu w danym wierszu. Lepiej, tak jak pisałem, zwrócić wskaźnik do tego elementu
    Kod:
    double * Macierz::operator[] (size_t wiersz)
    {
    	return & dane [wiersz * kolumny];
    }
    lub
    Kod:
    double * Macierz::operator[] (size_t wiersz)
    {
    	return dane + wiersz * kolumny;
    }
    Wtedy na zwróconym wskaźniku możesz użyć następnego [] do uzyskania dostępu do danego elementu względem początku wiersza.
    Możesz też dopisać wersję const aby używać tego operatora też na stałych obiektach (tylko do odczytu).
    Kod:
    const double * Macierz::operator[] (size_t wiersz) const
    {
    	return dane + wiersz * kolumny;
    }
    Oczywiście po zwróceniu wskaźnika do stałej nie będziesz mogła zapisywać do wskazywanej pamięci, ale brak możliwości zapisu to jedna z cech stałych obiektów
    Możesz mieć jednocześnie w klasie zarówno wersję const jak i nie-const tej samej metody. Kompilator decyduje o użyciu odpowiedniej wersji na podstawie zadeklarowanej dostępności do obiektu.
    Jeśli masz tylko wersję const metody to może być ona też używana na niestałych obiektach ale nadal nie może zmieniać ich zawartości; natomiast jeśli masz tylko wersję nie-const to nie możesz jej używac na stałych obiektach (nawet jeśli nie modyfkują one zawartości obiektu).
    Do kompletu można jeszcze dorzucić volatile i const volatile, ale volatile używa się tylko w specyficznych sytuacjach i zazwyczaj dla typów prostych lub prostych struktur, nie spotkałem się jeszcze z użyciem volatile dla "dużych" obiektów.

    Cytat Napisał Gosik Zobacz post
    Czy spotkales sie moze z wczytywaniem danych do tablicy 4-wym?
    Chyba nie
    Cytat Napisał Gosik Zobacz post
    Zastanawiam sie jak takie dane zapisywane sa w pliku.
    Normalnie, jako seria danych. Jeśli rozmiary danych są stałe lub określone przez dodatkowe dane to podziały na linie czy dodawanie ozdobników służy głównie poprawie czytelności. Opcjonalnie jeśli rozmiary są nieokreślone parser może liczyć je na podstawie ograniczników (tych ozdobników).
    Cytat Napisał Gosik Zobacz post
    Moja inwencja tworcza jest nastepujaca:
    Kod:
    (1 1 2, 2 3 4) (1 2 3, 0 3 2) (1 23 0, 2 2 2) (2 34 0, 3 2 2)
    (1 2 4, 5 2 2) (23 2 2, 2 2 2) (2 2 0, 2 8 2) (2 23 2, 3 6 6)
    i bylaby to tablica t[1][3][2][2];
    Chyba raczej t[2][4][2][3]. 2 wiersze po 4 kolumny, w każdej 2 grupy po 3 liczby
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  5. #25

    Domyślnie

    Z przeladowanie operatora [] jest to swietny trick!

    Mam jeszcze dodatkowe pytania:

    1. Dlaczego w funkcji main przy dodawaniu wyskakuje informacja: Segmentation fault. Wychodze poza zakres tablicy, ale nie wiem dlaczego
    Kod:
    int main()
    {
            Macierz nr1("wyniki.txt");
            Macierz nr2("wyniki2.txt");
            nr1.wczytaj();
            nr1.wyswietl();
            nr2.wczytaj();
            Macierz nowa = nr1;
            nowa + nr2;
    }
    2.. Czy operator + nie moze byc 2 argumentowy?
    Zrobilam cos takiego:
    Kod:
    Macierz Macierz:: operator+ (const Macierz &r, const Macierz &p)
    {
    
            if(r.wiersze != p.wiersze || r.kolumny !=p.kolumny)
                    throw invalid_argument("Niekompatybilne macierze");
    
            Macierz suma(r.wiersze,r.kolumny);
    
            for(int i = 0; i < r.wiersze; ++i)
                    for(int j = 0; j < r.kolumny; ++j)
                            suma.dane[i * r.kolumny +j] = r.dane[i * r.kolumny +j] + p.dane[i *p.kolumny + j];
            return suma;
    }
    I wyskakuje mi informacja, ze operator powinien byc 0 lub 1 argumentowy.

  6. #26

    Lightbulb

    1. Bez całości kodu trudno powiedzieć co się dokładnie dzieje. Prawdziwy błąd może znajdować sie wcześniej, coś Ci uszkodziło obiekt a przy dodawaniu się objawia. Debuguj Gynvael's Debug (PL) - YouTube

    2. Są dwa operatory +
    - jednoargumentowy, występujący dla sysmetrii z jednoargumentowym -, w przeciwieństwie do -, który powinien dawać obiekt przeciwny, + powinien dawać taki sam obiekt
    - dwuargumentowy, służący do dodawania
    Niestatyczne metody oprócz jawnych argumentów dostają jeszcze niejawny argument this będący wskaźnikiem na obiekt, na którym została wywołana metoda. W przypadku dwuargumentowych operatorów this wskazuje na lewy operand.
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  7. #27

    Domyślnie

    Znalazlam blad!!! Debugger bardzo sie przydal!

  8. #28

    Domyślnie

    Pojawil mi sie w tym zadaniu jeszcze jeden problem. Wyknalam mnozenie macierzy, co sie udalo i teraz chcialabym zastosowac biblioteke BLAS.
    Zrobilam to zgodnie z dokumentacja http://www.netlib.org/blas/dgemm.f

    Kod:
    Macierz Macierz:: operator* (const Macierz &other)
    {
            Macierz AxB(wiersze, other.kolumny);
    
            char TRANSA = 'N';
            char TRANSB = 'N';
            int M = wiersze;
            int N = other.kolumny;
            int K = kolumny;
            int LDB = other.wiersze;
            double alpha = 1.0;
            double beta = 0.0;
    
    dgemm_(&TRANSA,
            &TRANSB,
            &M,
            &N,
            &K,
            &alpha,
            dane,
            &M,
            other.dane,
            &LDB,
            &beta,
            AxB.dane,
            &M);
    
    return AxB;
    }
    Ale cos sie pozypalo.
    Mnoze 2 macierze:
    Kod:
    NR1
    d[0][0]= 1	d[0][1]= 2	d[0][2]= 2
    d[1][0]= 1	d[1][1]= 0	d[1][2]= 0
    d[2][0]= 2	d[2][1]= 2	d[2][2]= 1
    d[3][0]= 3	d[3][1]= 1	d[3][2]= 5
    
    NR4
    d[0][0]= 1	d[0][1]= 2	d[0][2]= 1	d[0][3]= 1
    d[1][0]= 1	d[1][1]= 1	d[1][2]= 2	d[1][3]= 2
    d[2][0]= 0	d[2][1]= 0	d[2][2]= 1	d[2][3]= 1
    o otrzymuje:
    Kod:
    nr5
    d[0][0]= 2	d[0][1]= 5	d[0][2]= 7	d[0][3]= 10
    d[1][0]= 2	d[1][1]= 5	d[1][2]= 5	d[1][3]= 8
    d[2][0]= 2	d[2][1]= 4	d[2][2]= 8	d[2][3]= 6
    d[3][0]= 1	d[3][1]= 3	d[3][2]= 3	d[3][3]= 7
    Czy moglabym prosic o wskazanie, gdzie lezy moj blad w rozumowaniu?

Strona 3 z 3 PierwszyPierwszy 123

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj