Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Przekazywanie połączeń do vectora/kontenera

Ostatnio zmodyfikowano 2013-04-15 19:20
Autor Wiadomość
RazzorFlame
Temat założony przez niniejszego użytkownika
[SFML] Przekazywanie połączeń do vectora/kontenera
» 2013-02-14 11:27:58
Witam. Chciałbym się zapytać czy jeśli zrobię np. tak:
C/C++
vector < sf::SocketTCP > Clients;

Listener.Accept(...);
Clients.push_back( client );
to czy client utraci coś i jeśli będe się odwolywal: Clients[..].Receive/Send to czy to zadziała bez szwanku, czy też trzeba to przez referencje dodać do vectora :P
P-76260
DejaVu
» 2013-02-14 14:18:59
Poprawnie będzie tak:
C/C++
vector < sf::SocketTCP * > Clients;

P-76269
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-14 16:11:21
Mógłbyś wytłumaczyć dlaczego?
P-76273
kubawal
» 2013-02-14 16:15:38
Jeśli wstawiasz do kontenera klas bazowych obiekt klasy pochodnej i
sizeof( Bazowa ) < sizeof( Pochodna )
, to obiekt zostanie pocięty.

/edit: wygląda to tak
Pamięć po:
C/C++
vector < Bazowa > vecA;
vecA.push_back( Bazowa(...) );
//itd.
vector < Bazowa > vecB;
vecB.push_back( Pochodna(...) );
//itd.
Układ pamięci:

vecA: |Bazowa|Bazowa|Bazowa|Bazowa|...
vecB: |Pochodna|Pochodna|Pochodna|Pochodna|...
I jeśli użyjesz takiej instrukcji:
C/C++
cout << vecB[ 1 ];
To zostanie wykorzystany fragment pamięci:

a|Poch
Czyli zostanie pocięty!
P-76275
pekfos
» 2013-02-14 16:40:20
Uwaga: post wyżej jest bez sensu!

Obiekt typu pochodnego zostanie przycięty do rozmiaru typu bazowego.

"Układ pamięci"
vecA: |Bazowa|Bazowa|Bazowa|Bazowa|...
vecB: |Pochod|Pochod|Pochod|Pochod|...

Dlatego przypisując obiekt klasy pochodnej do tablicy obiektów klasy bazowej nie musimy się martwić, że dojdzie do uszkodzenia innych elementów i przepełnienia bufora (które wyraźnie widać na tych układach).
P-76276
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-14 17:51:56
Ok rozumiem, ale jeśli mam własną klasę:
C/C++
class GameClient;

class GamePlayer
{
public:
    GameClient mClient;
    //jakies dane gracza
};

class GameClient
{
public:
    sf::IPAddress mAddress;
    sf::SocketTCP mSocket;
};

vector < GamePlayer > players;
To to zadziała?
BTW. Robie gre mmo, i mam problem. Uznałem że to nadaje się do umieszczenia w tym temacie bo mam podobny uklad klas do przykladu powyżej. I tak. Kiedy wysylam dane z Servera do Clienta wszystko działa. Kiedy client wysyla polecenie do Serwera (chodzenie postacią) to też działa. Tyle że jest jeden szkopuł. Ogólnie dostaje wiadomość z komendą nawet sprawdzałem, więc dzieje sie to co chce (chodzi że potwierdza się np. command=="PLAYER_GO_UP") w serwerze też sobie wypisuje aktualną pozycje gracza i jest dobrze. Co obieg petli wysylam paczke do clienta, to też działa ale nie w pełni. Domyślną pozycje gracza ustawiłem na (300,300) i dobrze, wyświetla się. Kiedy jednak naciskam klawisz strzalki do góry, wypisuje poprawnie to co powinno wypisać. Jak mówiłem na serwerze wszystko jest dobrze i zmienia się pozycja. Wtedy są wysyłane dane do Clienta. Client pomyślnie odbiera, ale pozycja jest zawsze ta domyślna. Nigdzie w kodzie ani clienta, ani serwera nie resetuje tego. I prosze was, oszczędźcie sobie mówienia: "Ojoj to za trudne, nie dasz rady." <- to już moja sprawa. Kiedyś już mnie ktoś tak potraktował, ale nie pamiętam czy to na tym forum, ale tylko tak na przyszłość mówie :] Myśle że jasno wyjaśniłem problem, a dodałem go tu bo wydaje mi się że coś w vectorze szwankuje bo czytałem troche o tym, miedzy innymi w przypadku menedżera tekstur w SFML że sie nie nadaje vector.

EDIT:
W między czasie coś popróbuje to rozwiązać i będę informował na bieżąco.
P-76281
pekfos
» 2013-02-14 18:04:01
"Ojoj to za trudne, nie dasz rady"

..opisać poprawnie problemu. Gdyby to był oddzielny temat (a powinien być), to by trafił do bezużytecznych. Opisałeś ogólnie (i w sposób niezrozumiały) program, podałeś niezwiązany z problemem kod i czego właściwie oczekujesz?
P-76283
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-02-14 19:27:30
Oczekuje zwykłej odpowiedzi. Wytłumacze jeszcze raz:
Mój program robi tak:

SERWER
-> Sprawdz czy sa nowe polaczenia
-> Jesli tak dodaj nowe polaczenie do vectora
-> Petla obslugi wszystkich polaczen
^  -> Spakuj dane o aktualnym graczu
|  -> Wyslij dane o aktualnym graczu
|  -> Wyczysc paczke /\
|  -> Odbierz dane od clienta
|  -> Wykonaj operacje na pozycji gracza (komendy)
| <-> Nastepny Gracz


CLIENT
-> Sprobuj polaczyc z serwerem
-> Jesli polaczono to
   ->Wyswietl okno
   ->Odbierz paczke z danymi o graczu <<<<< Tu cos szwankuje, tzn zawsze jest pozycja 300, 300 (pozycja podana w konstruktorze klasy Gracza.
   ->Wyslij zadanie dla serwera (komende)
   ->Ustaw pozycje obrazka w odebranej od serwera pozycji
   ->Wyswietl obrazki

Edit:
Po wykonaniu zadania dla odpowiedniej komendy (np idz_w_prawo) normalnie serwer pokazuje dobra pozycje. Przy wysylaniu też. Kiedy jednak ją odczytam w Cliencie to jak pisałem wyskakuje x=300, y=300
P-76289
« 1 » 2
  Strona 1 z 2 Następna strona