Dawka83 Opublikowano 27 Sierpnia 2012 Udostępnij 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 27 Sierpnia 2012 Udostępnij Opublikowano 27 Sierpnia 2012 Napisz co chcesz uzyskać, może tak Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij 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; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij 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; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij 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; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij 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 ) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij Opublikowano 27 Sierpnia 2012 Przeciążenie operatora? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij Opublikowano 27 Sierpnia 2012 bool operator ==( const Player & P ) { return true; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij Opublikowano 27 Sierpnia 2012 Niestety nadal ten error ;/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij Opublikowano 27 Sierpnia 2012 Żałuje że zapytam ale gdzie dałeś ten kod? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij Opublikowano 27 Sierpnia 2012 Em do klasy Player? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij Opublikowano 27 Sierpnia 2012 Dzieki za starania! Czekam wiec z projektem do jutra ^^ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Floodnik Opublikowano 27 Sierpnia 2012 Udostępnij Opublikowano 27 Sierpnia 2012 Przeciążyłeś operator dla przypadku, gdy porównujesz dwóch graczy. bool operator ==( bool zmienna ) { return true; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij Opublikowano 27 Sierpnia 2012 -_- Nie myślę dzisiaj, ale to chyba przez wakację :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij 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). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij Opublikowano 27 Sierpnia 2012 Bo masz dodać obiekt a nie funkcję. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij Opublikowano 27 Sierpnia 2012 Nadal coś źle robię?: Player player; players.Add(player); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 27 Sierpnia 2012 Udostępnij Opublikowano 27 Sierpnia 2012 Teraz powinno być dobrze, nadal ten sam bład? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Sierpnia 2012 Autor Udostępnij Opublikowano 27 Sierpnia 2012 No niestety, nadal dokładnie taki sam... ;/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 28 Sierpnia 2012 Udostępnij 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; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Floodnik Opublikowano 28 Sierpnia 2012 Udostępnij 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 28 Sierpnia 2012 Udostępnij 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Floodnik Opublikowano 28 Sierpnia 2012 Udostępnij 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
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ę