Dawka83 Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Siemka! Potrzebuje jakieś struktury danych do której bd się mógł odwołać poprzez str[5].zmienna. Coś jak wektory tyle, że po usunięciu danego wiersza, pozostałe nie bd wskakiwały na jego miejsce lecz pole zostanie wolne i bd oczekiwało aż ponownie jego miejsce zostanie zajęte.
Makary155 Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Napisz co chcesz uzyskać, może tak
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Powinno działać template< class Type > class structure { private: Type *zmienna; size_t size; public: structure() { zmienna = new Type[0]; size = 0; } ~structure() { delete [] zmienna; } void Add(Type var) { size++; Type *temp = new Type[size]; for( int i = 0; i < size-1; i++ ) { temp[i] = zmienna[i]; } temp[size-1] = var; delete [] zmienna; zmienna = temp; } void Delete(size_t el) { zmienna[el] = NULL; } size_t Size() { return size; } Type & operator [] (size_t el) { return zmienna[el]; } }; Użycie: structure<int> lol; lol.Add(4); lol.Add(2); lol.Add(6); lol.Delete(0); lol[1] = 5; cout << lol[0] << endl; cout << lol[1] << endl; cout << lol[2] << endl;
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Opublikowano 27 Sierpnia 2012 A czy jeżeli wywołam coś takiego lol.Add(100); lol.Delete(0); lol.Add(500); To na miejsce 100 wskoczy 500? Dobra już sobie przerobiłem, prawdopodobnie powinno działać :D : int add(Type var) { Type *temp = new Type[size]; bool _add = false; int id; for( int i = 0; i < size; i++ ) { temp[i] = zmienna[i]; if (temp[i] == NULL) { temp[i] = var; _add = true; id = i; } } if (_add == false) { temp[size] = var; id = size; size++; } delete [] zmienna; zmienna = temp; return id; }
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Tamto chyba nie będzie działać, a jeśli tak to nie potrzebnie alokujesz miejsce, moje wersja: int add(Type var) { bool _add = false; int id; for( int i = 0; i < size; i++ ) { if( zmienna[i] == NULL ) { zmienna[i] = var; id = i; _add = false; break; } } size += _add; Type *temp = new Type[size]; for( int i = 0; i < size-_add; i++ ) temp[i] = zmienna[i]; if( _add ) { temp[size - 1] = var; id = size; } delete [] zmienna; zmienna = temp; return id; }
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Opublikowano 27 Sierpnia 2012 Hmm jeszcze mam taki problem ze gdy zdeklaruje sb tą strukturę z moją klasą Player to nie działa ;/ Dokładnie: struct.h(25): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Player' (or there is no acceptable conversion) Ta linijka: if( zmienna[i] == NULL )
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Bo w tych szpiczastych nawiasach( zapomniałem nazwy xD) dajesz typ zmiennej, czyli: structure<player> nazwa; EDIT: Dodaj do klasy player przeciążenie operatora '==' zwracającom this, albo bool true, teraz nie pamiętam.
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 bool operator ==( const Player & P ) { return true; }
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Opublikowano 27 Sierpnia 2012 Niestety nadal ten error ;/
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Żałuje że zapytam ale gdzie dałeś ten kod?
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 W takim razie jak zwykle coś zj****em, niestety nie mam dostępu do kompa, więc dopiero jutro to sprawdz co jest źle.
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Opublikowano 27 Sierpnia 2012 Dzieki za starania! Czekam wiec z projektem do jutra ^^
Floodnik Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Przeciążyłeś operator dla przypadku, gdy porównujesz dwóch graczy. bool operator ==( bool zmienna ) { return true; }
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 -_- Nie myślę dzisiaj, ale to chyba przez wakację :D
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Opublikowano 27 Sierpnia 2012 Teraz niby wszystko ok sie kompiluje jednak przy wywołaniu players.Add(Player()); program się wywala... ;/ Kompilator wywala zupełnie nic nie znaczące errory: First-chance exception at 0x002f6fe4 in program.exe: 0xC0000005: Access violation reading location 0x583a9a04. Unhandled exception at 0x002f6fe4 in program.exe: 0xC0000005: Access violation reading location 0x583a9a04. The program '[2528] program.exe: Native' has exited with code -1073741819 (0xc0000005).
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Bo masz dodać obiekt a nie funkcję.
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Opublikowano 27 Sierpnia 2012 Nadal coś źle robię?: Player player; players.Add(player);
ediepl Opublikowano 27 Sierpnia 2012 Opublikowano 27 Sierpnia 2012 Teraz powinno być dobrze, nadal ten sam bład?
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Opublikowano 27 Sierpnia 2012 No niestety, nadal dokładnie taki sam... ;/
ediepl Opublikowano 28 Sierpnia 2012 Opublikowano 28 Sierpnia 2012 Teraz powinno działać( u mnie działa ): int Add(Type var) { bool _add = true; int id; for( int i = 0; i < size; i++ ) { if( zmienna[i] == NULL ) { cout << i <<endl; zmienna[i] = var; id = i; _add = false; break; } } size += _add; Type *temp = new Type[size]; for( int i = 0; i < size-_add; i++ ) temp[i] = zmienna[i]; if( _add ) { temp[size - 1] = var; id = size; } delete [] zmienna; zmienna = temp; return id; }
Floodnik Opublikowano 28 Sierpnia 2012 Opublikowano 28 Sierpnia 2012 Przyjrzałem się nieco bliżej temu rozwiązaniu i nie ma ono zbytniego sensu. Popatrz przykładowo na to: void Delete(size_t el) { zmienna[el] = NULL; } Dane pole nie jest usuwane, "wycinane", a jedynie zerowane. Co, jeśli użytkownik struktury chciałby mieć element o wartości zero? Wtedy metoda Add(type var) rozumiałaby to tak, że to pole nie istnieje(== NULL). Oprócz tego "zmienna[el] = NULL" nie powinno się skompilować w przypadku klasy takiej jak Player. Ja użyłbym tablicy wskaźników: private: Type** zmienna; Dzięki temu będziemy w stanie odróżnić "stan" pola(istnieje bądź nie) od jego wartości.
Will Opublikowano 28 Sierpnia 2012 Opublikowano 28 Sierpnia 2012 Wszystkie fragmenty kodu w tym temacie są całkowicie bez sensu. Błąd jest spowodowany mazianiem po pamięci. Usunąć wszystko i jeszcze raz przemyśleć. Najważniejsza sprawa to nie tworzyć od nowa tablicy przy każdym dodaniu nowego elementu+ odróżnić stertę od stosu a najlepiej użyć wektora do czasu poprawienia swoich umiejętności na tyle aby rozumieć pisany przez siebie kod.
Floodnik Opublikowano 28 Sierpnia 2012 Opublikowano 28 Sierpnia 2012 Najważniejsza sprawa to nie tworzyć od nowa tablicy przy każdym dodaniu nowego elementu Dodam, że chcąc się do tego ustosunkować, możnaby zaczerpnąć rozwiązanie z stla - w wektorze pamięć alokowana jest "co jakiś czas", tzn. robiony jest zapas w momencie, gdy zabraknie miejsca.
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się