Reklama
Strona 288 z 358 PierwszaPierwsza ... 188238278286287288289290298338 ... OstatniaOstatnia
Pokazuje wyniki od 4,306 do 4,320 z 5367

Temat: Programowanie - temat ogólny

  1. #4306
    Avatar Wielkie Zło
    Data rejestracji
    2008
    Posty
    819
    Siła reputacji
    17

    Domyślny

    Cytuj kuba_k31 napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Kod:
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class klasa{
        public:
            static unsigned int total;
            int ilosc;
            klasa(int n) : ilosc(n) { total += ilosc; cout << "total wynosi: " << total << endl; };
            klasa(const klasa &drugi) { total += drugi.ilosc; this->ilosc = drugi.ilosc; };
            ~klasa() { total -= ilosc; cout << "total wynosi: " << total << endl; };
    };
    
    unsigned int klasa::total = 0;
    
    int main(){
        vector<klasa> vec;
        int q, n;
        while(q != 0)
        {
            cout << "1. Dodaj.\n";
            cout << "2. Usun.\n";
            cout << "3. Wyswietl.\n";
            cout << "0. Wyjdz.\n";
            cin >> q;
            switch(q){
                case 1:
                    {
                        cout << "Dodaj: " << endl;
                        cin >> n;
                        klasa proc(n);
                        vec.push_back(proc);
                        break;
                    }
                case 2:
                    cout << "Usun: " << endl;
                    cin >> n;
                    vec.erase(vec.begin()+n);
                    break;
                case 3:
                    for(int i = 0; i < vec.size(); i++) cout << vec[i].ilosc << endl;
                    break;
            }
        }
    	return 0;
    }
    C++.
    Mam static int w klasie, który sobie zlicza zmienną 'ilosc' w klasie - zwiekszam i zmniejsza ja w konstruktorze i destruktorze. Ale kiedy utworze na przyklad 4 nastepujace obiekty kolejno: 100, 10, 10, 10, i wrzuce je do vectora, a następnie usune z niego pierwszy obiekt (ten z wartoscia 100) to total zmniejsza sie o 10, a nie o 100. Obiekt z wartoscia 100 owszem znika, ale total zmniejsza sie o ostatnio dodana wartosc, a nie o wartosc usuwanego obiektu. Why?
    ilosc to zmienna statyczna, ma ostatnią wartość per klasa, nie per instancja, dlatego też odejmuje 10. Zapisz to sobie gdzieś jako prop instancji i stamtąd odejmuj.
    Cytuj SedaN* napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    kiedys jak bylem gowniarz, jakies 11lat mialem to na quo vadis nie chcieli mnie wpuscic ale bylem z kumplem i jego ojcem wiec zagadal i weszlismy (w scenach hard mielismy oczy zakrywac.. ALE BYLEM TAKI SZALONY, ZE TEGO NIE ROBILEM :])
    Programiści Torga łączcie się! Zapraszamy:
    http://webchat.freenode.net/
    kanal: #torgdevs

  2. #4307
    Avatar kuba_k31
    Data rejestracji
    2006
    Wiek
    29
    Posty
    2,322
    Siła reputacji
    19

    Domyślny

    Cytuj joozioom napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Strzelam że dzieje się tak bo metoda erase pierw kopiuje elementy wcześniej, a później usuwa te z końca xd i to dla tych elementów na końcu vectora wykonywany jest destruktor
    Brzmi to na tyle sensownie, ze jestem sklonny w to uwierzyc. Jakies pomysly jak to fixnac? Moglbym odejmować to 'ręcznie', ale podobała mi się wizja statycznej + wszystko w konstruktorze/destruktorze. Jak nie da rady inaczej to zrobie dodatkowa funkcje, i guess
    Cytuj Wielkie Zło napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    ilosc to zmienna statyczna, ma ostatnią wartość per klasa, nie per instancja, dlatego też odejmuje 10. Zapisz to sobie gdzieś jako prop instancji i stamtąd odejmuj.
    wielki programista a nie wie co to zmienna statyczna kappa
    Ostatnio zmieniony przez kuba_k31 : 16-02-2016, 18:48
    Cytuj Minsafo napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    domknąłem

  3. Reklama
  4. #4308
    Avatar joozioom
    Data rejestracji
    2007
    Posty
    1,460
    Siła reputacji
    17

    Domyślny

    @kuba_k31
    Nie jestem jeszcze specem od C++, ale może coś w tym stylu?
    Kod:
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    template <typename T>
    class MyVector : public vector<T>
    {
    	public:
    	void erase (int position)
    	{
    		//tutaj poprawiona funkcja??? xd
    	}
    };

  5. #4309
    Avatar Chels
    Data rejestracji
    2013
    Wiek
    30
    Posty
    2,824
    Siła reputacji
    13

    Domyślny

    operator przypisania sobie napisz
    i zamiast this uzyj *this
    no i sugerowalbym dynamiczna alokacje pamieci przy tworzeniu obiektu przez new
    Ostatnio zmieniony przez Chels : 16-02-2016, 18:52

  6. #4310
    Avatar Wielkie Zło
    Data rejestracji
    2008
    Posty
    819
    Siła reputacji
    17

    Domyślny

    Cytuj kuba_k31 napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    wielki programista a nie wie co to zmienna statyczna kappa
    Nie posraj się z radości, że komuś dojebałeś, miałem na myśli total, to raz, a dwa, że ten kod jest tak chujowy, że ciężko cokolwiek z niego wyczytać.
    Po co stosujesz wektor jeżeli robisz dużo erase i insert? Do takich rzeczy jest lista ;)
    I jak chcesz cwaniakować, to najpierw dowiedz się kiedy obiekt kończy żywot, usunięcie go z wektora nie zniszczy obiektu automatycznie. Plus przejdź na wskaźniki.

    Cytuj joozioom napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    @kuba_k31
    Nie jestem jeszcze specem od C++, ale może coś w tym stylu?
    Kod:
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    template <typename T>
    class MyVector : public vector<T>
    {
    	public:
    	void erase (int position)
    	{
    		//tutaj poprawiona funkcja??? xd
    	}
    };
    Nie, akurat erase działa tak jak ma działać, co tutaj chcesz "poprawiać"?

    Cytuj Chels napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    operator przypisania sobie napisz
    i zamiast this uzyj *this
    no i sugerowalbym dynamiczna alokacje pamieci przy tworzeniu obiektu przez new
    +1
    Cytuj SedaN* napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    kiedys jak bylem gowniarz, jakies 11lat mialem to na quo vadis nie chcieli mnie wpuscic ale bylem z kumplem i jego ojcem wiec zagadal i weszlismy (w scenach hard mielismy oczy zakrywac.. ALE BYLEM TAKI SZALONY, ZE TEGO NIE ROBILEM :])
    Programiści Torga łączcie się! Zapraszamy:
    http://webchat.freenode.net/
    kanal: #torgdevs

  7. #4311
    konto usunięte

    Domyślny

    Cytuj Chels napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    operator przypisania sobie napisz
    i zamiast this uzyj *this
    no i sugerowalbym dynamiczna alokacje pamieci przy tworzeniu obiektu przez new
    Po co, skoro tam nie ma żadnego przypisania.

    Cytuj Wielkie Zło napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    usunięcie go z wektora nie zniszczy obiektu automatycznie
    Niszczy.

  8. #4312
    Avatar joozioom
    Data rejestracji
    2007
    Posty
    1,460
    Siła reputacji
    17

    Domyślny

    Cytuj Wielkie Zło napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Nie, akurat erase działa tak jak ma działać, co tutaj chcesz "poprawiać"?
    Mały test:
    http://ideone.com/cNphBm

    Usuwa 2 elementy z początku vectora - czyli 100 i 200 -> zmienna statyczna powinna być 1500 - 100 - 200 = 1200 a tu zonk bo jednak wyrzuca 600. A 1500 - 500 - 400 = 600, jaki z tego wniosek? Że przy erase destruktor jest wykonywany dla obiektów które były na końcu struktury, a nie dla tych obiektów, których faktycznie chcieliśmy się pozbyć.

  9. #4313
    konto usunięte

    Domyślny

    Cytuj joozioom napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Mały test:
    http://ideone.com/cNphBm

    Usuwa 2 elementy z początku vectora - czyli 100 i 200 -> zmienna statyczna powinna być 1500 - 100 - 200 = 1200 a tu zonk bo jednak wyrzuca 600. A 1500 - 500 - 400 = 600, jaki z tego wniosek? Że przy erase destruktor jest wykonywany dla obiektów które były na końcu struktury, a nie dla tych obiektów, których faktycznie chcieliśmy się pozbyć.
    Zobacz, co tu sie naprawdę dzieje...

    http://ideone.com/ow05xR
    oraz
    http://ideone.com/Ndp4IN
    @joozioom ;
    2. link.
    Ostatnio zmieniony przez szulak : 16-02-2016, 20:04

  10. #4314
    Avatar joozioom
    Data rejestracji
    2007
    Posty
    1,460
    Siła reputacji
    17

    Domyślny

    Cytuj szulak napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Zobacz, co tu sie naprawdę dzieje...
    http://ideone.com/ow05xR
    Pierwszy for zgadza się takie są wartości w vectorze:
    100
    200
    300
    400
    500
    Usuwam później 2 pierwsze, zostaje:
    300
    400
    500
    Też się zgadza, tylko że suma tych elementów to 1200, a w zmiennej statycznej, która zlicza sume zostaje 600

    Nie rozumiem "co tu się na prawdę dzieje". Gdzie błąd w moim rozumowaniu.

  11. #4315
    konto usunięte

    Domyślny

    Cytuj joozioom napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Pierwszy for zgadza się takie są wartości w vectorze:
    100
    200
    300
    400
    500
    Usuwam później 2 pierwsze, zostaje:
    300
    400
    500
    Też się zgadza, tylko że suma tych elementów to 1200, a w zmiennej statycznej, która zlicza sume zostaje 600

    Nie rozumiem "co tu się na prawdę dzieje". Gdzie błąd w moim rozumowaniu.
    Ta suma jest zle obliczana. Tutaj jest poprawnie: http://ideone.com/WRAL9q

  12. #4316
    Avatar Wielkie Zło
    Data rejestracji
    2008
    Posty
    819
    Siła reputacji
    17

    Domyślny

    Cytuj szulak napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Niszczy.
    Nie zniszczy, jeżeli jest to wskaźnik ;) Obiekt zainicjalizowany w sposób podany wyżej zostanie usunięty jak wyjdzie ze scope, vide case w switchu. I tyle w tym temacie..
    Cytuj SedaN* napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    kiedys jak bylem gowniarz, jakies 11lat mialem to na quo vadis nie chcieli mnie wpuscic ale bylem z kumplem i jego ojcem wiec zagadal i weszlismy (w scenach hard mielismy oczy zakrywac.. ALE BYLEM TAKI SZALONY, ZE TEGO NIE ROBILEM :])
    Programiści Torga łączcie się! Zapraszamy:
    http://webchat.freenode.net/
    kanal: #torgdevs

  13. #4317
    konto usunięte

    Domyślny

    Cytuj Wielkie Zło napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Nie zniszczy, jeżeli jest to wskaźnik ;) Obiekt zainicjalizowany w sposób podany wyżej zostanie usunięty jak wyjdzie ze scope, vide case w switchu. I tyle w tym temacie..
    Niszczy (wywołuje metodke delete ze standardowego alokatora vectora, ktora ma specjalizacje dla typow skalarnych - ktora nic nie robi) - więc semantycznie, niszczy ;)

    Ponizej ta specjalizacja:

    Kod:
    template<class _Alloc> inline
    	void _Destroy_range(typename _Alloc::pointer _First,
    		typename _Alloc::pointer _Last, _Alloc& _Al,
    		_Scalar_ptr_iterator_tag)
    	{	// destroy [_First, _Last), scalar type (do nothing)
    	}
    Ostatnio zmieniony przez szulak : 16-02-2016, 21:06

  14. #4318
    Avatar Wielkie Zło
    Data rejestracji
    2008
    Posty
    819
    Siła reputacji
    17

    Domyślny

    Cytuj szulak napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Niszczy (wywołuje metodke delete ze standardowego alokatora vectora, ktora ma specjalizacje dla typow skalarnych - ktora nic nie robi) - więc semantycznie, niszczy ;)

    Ponizej ta specjalizacja:

    Kod:
    template<class _Alloc> inline
    	void _Destroy_range(typename _Alloc::pointer _First,
    		typename _Alloc::pointer _Last, _Alloc& _Al,
    		_Scalar_ptr_iterator_tag)
    	{	// destroy [_First, _Last), scalar type (do nothing)
    	}
    Wywołuje metodę, która niszczy, a de facto nic nie robi, bo gdyby zwalniała daną pamięć na którą wskazuje wskaźnik, to spowodowałoby to więcej syfu niż korzyści. Reasumując, faktycznie można nazwać to niszczeniem (niszczenie bez niszczenia). Żelazna logika. Równie dobrze można oprzeć program o puste funkcje/stuby i powiedzieć, że realizuje dany problem, bo przecież jest metoda odpowiadająca danemu problemowi :)
    Cytuj SedaN* napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    kiedys jak bylem gowniarz, jakies 11lat mialem to na quo vadis nie chcieli mnie wpuscic ale bylem z kumplem i jego ojcem wiec zagadal i weszlismy (w scenach hard mielismy oczy zakrywac.. ALE BYLEM TAKI SZALONY, ZE TEGO NIE ROBILEM :])
    Programiści Torga łączcie się! Zapraszamy:
    http://webchat.freenode.net/
    kanal: #torgdevs

  15. #4319
    Avatar kuba_k31
    Data rejestracji
    2006
    Wiek
    29
    Posty
    2,322
    Siła reputacji
    19

    Domyślny

    Cytuj Wielkie Zło napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Nie posraj się z radości, że komuś dojebałeś, miałem na myśli total, to raz, a dwa, że ten kod jest tak chujowy, że ciężko cokolwiek z niego wyczytać.
    Po co stosujesz wektor jeżeli robisz dużo erase i insert? Do takich rzeczy jest lista ;)
    I jak chcesz cwaniakować, to najpierw dowiedz się kiedy obiekt kończy żywot, usunięcie go z wektora nie zniszczy obiektu automatycznie. Plus przejdź na wskaźniki.
    Ktoś tutaj chyba nie wie co to kappa. Kappa = hehe zarcik = doskonale wiedzialem ze po prostu zle przeczytales. Ale nie zwalaj winy na kod, bo byl naprawde krotki, prosty i w miare czytelny.

    Cytuj szulak napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Ta suma jest zle obliczana. Tutaj jest poprawnie: http://ideone.com/WRAL9q
    Oprócz stworzenia konstruktora przypisania zmieniło się coś jeszcze w stosunku do tego co ja miałem?

    Also, czemu *this a nie this?
    Cytuj Minsafo napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    domknąłem

  16. #4320
    konto usunięte

    Domyślny

    Cytuj kuba_k31 napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Also, czemu *this a nie this?
    Bo operator przypisania zwraca referencję na obiekt, więc potrzebna jest dereferencja wskaznika this. Zmieniłem troszke sposób tworzenia tych obiektow, i zarezerwowalem troche miejsca dla vectora.
    Ostatnio zmieniony przez szulak : 16-02-2016, 21:29 Powód: typos

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Star Wars: The Old Republic - temat ogólny
    Przez Mefistos w dziale Inne gry
    Odpowiedzi: 106
    Ostatni post: 21-11-2012, 14:28
  2. League of Legends //dla potomnosci: League of Legends - temat ogolny.
    Przez ZinC w dziale Inne gry
    Odpowiedzi: 30145
    Ostatni post: 24-03-2012, 02:33
  3. Cities XL 2012 - temat ogólny
    Przez Bezdomny w dziale Inne gry
    Odpowiedzi: 0
    Ostatni post: 20-10-2011, 18:11
  4. Dragon Ball Legend temat ogólny
    Przez Mugenoo w dziale Tematy serwerów
    Odpowiedzi: 20
    Ostatni post: 02-03-2011, 16:47

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •