Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - waz0n

Strony: [1] 2 3 4
1
C++ / Odp: [C++] Pula obiektów klasy z kilkoma konstruktorami.
« dnia: Grudzień 09, 2010, 14:23:14 »
Dab, masz rację - można. Tylko ja konstruktor traktuje jako dekorator i i chciałbym wszystkie elementy klasy w nim "udekorować" (pomijam otwieranie plików i inne rzeczy, które mogą rzucić wyjątkami). Tymbardziej, że nie będą się one zmieniały przez cały okres życia obiektu.

hashedone, rozwiązanie mnie satysfakcjonuje :).

Dzięki Panowie za wypowiedzi i pomoc. Pozdrawiam!

2
C++ / [C++] Pula obiektów klasy z kilkoma konstruktorami.
« dnia: Grudzień 09, 2010, 11:14:59 »
Witam,
potrzebuje w swoim programie zrobić w miarę uniwersalną pule obiektów. Otóż mam powiedzmy coś takiego:

template<typename T>
class objectsPool_t {
public:
objectsPool_t() {}

objectsPool_t(size_t count) {
for(size_t i = 0; i < count; ++i) {
m_pool.push_back(new T());
}
}

virtual ~objectsPool_t() {
for(size_t i = 0; i < m_pool.size(); ++i) {
delete m_pool[i];
}
}

private:
std::vector<T*> m_pool;
};

No i powiedzmy, że tworzę pule obiektów dla dwóch klas - jedna ze standardowym konstruktorem, druga bez.

class creature_t {
public:
creature_t();
virtual ~creature_t();

// ...
private:
// ...
};

objectsPool_t<creature_t> pool(100);

class user_t {
public:
user_t(const callback_t &receiveCallback,
const callback_t &closeCallback,
const callback_t &connectCallback);
virtual ~user_t();

// ...
private:
user_t();
// ...
};

objectsPool_t<user_t> pool(10); // i tutaj w jakis sposob chcialbym przekazac referencje na delegaty do callbackow.

Czy istnieje coś w rodzaju jakiegoś alokatora, gdzie mógłbym zdefiniować w jaki sposób dany obiekt ma być inicjalizowany w puli? Czy po prostu jedyne wyjście, to zrobić pule usersPool_t, która dziedziczyłaby po objectsPool_t i implementowała odpowiedni konstruktor do alokowania obiektów user_t?

Z góry dziękuje za pomoc. Pozdrawiam.

3
Szkółka / Odp: boost::function1, boost::bind i dziedzieczenie.
« dnia: Lipiec 08, 2010, 21:56:05 »
Faktycznie, Twój pomysł działa :). Dziękuje serdecznie :).


Zastanawia mnie jednak, dlaczego sprawdza się coś takiego dla typu zwracanego:

typedef boost::function0<socketContext_t*> getNewContextCallback_t;

class tcpServer_t {
tcpServer_t(logger_t &logger,
iocpEngine_t &iocpEngine,
unsigned short listenPort,
const getNewContextCallback_t &getNewContextCallback);
};

connectServerUser_t* getFreeContext();

void connectServer_t::initTcpServer(unsigned short listenPort) {
m_logger.in(eMUCore::logger_t::_MESSAGE_INFO) << "Starting tcp server on port " << listenPort << "."; m_logger.out();
m_tcpServer = new eMUCore::tcpServer_t(m_logger,
*m_iocpEngine,
listenPort,
boost::bind(&connectServer_t::getFreeContext, this));
}


4
Szkółka / boost::function1, boost::bind i dziedzieczenie.
« dnia: Lipiec 08, 2010, 20:36:59 »
Witam,
mam kolejny problem z boost::bind i boost::function. Otóż mam kod:

class socketContext_t {
// ....
};

class iocpEngine_t {
typedef boost::function1<void, socketContext_t&> callback_t;

iocpEngine_t(logger_t &logger,
const callback_t &onAttachCallback,
const callback_t &onReceiveCallback,
const callback_t &onCloseCallback);
};

class connectServerUser_t: public socketContext_t {
// ....
};

class connectServer_t {
// ......
void onAttach(connectServerUser_t &user);
void onReceive(connectServerUser_t &user);
void onClose(connectServerUser_t &user);
};

void connectServer_t::initIocpEngine() {
m_iocpEngine = new eMUCore::iocpEngine_t(m_logger,
boost::bind(&connectServer_t::onAttach, this, _1),
boost::bind(&connectServer_t::onReceive, this, _1),
boost::bind(&connectServer_t::onClose, this, _1));
}

I dostaje blad

Cytuj
2>connectserver.cpp
2>c:\program files\boost\boost_1_42\boost\bind\bind.hpp(313) : error C2664: 'R boost::_mfi::mf1<R,T,A1>::operator ()<connectServer_t>(const U &,A1) const' : cannot convert parameter 2 from 'eMUCore::socketContext_t' to 'connectServerUser_t &'
2>        with
2>        [
2>            R=void,
2>            T=connectServer_t,
2>            A1=connectServerUser_t &,
2>            U=connectServer_t *
2>        ]
2>        c:\program files\boost\boost_1_42\boost\bind\bind_template.hpp(32) : see reference to function template instantiation 'void boost::_bi::list2<A1,A2>::operator ()<F,boost::_bi::list1<eMUCore::socketContext_t &>>(boost::_bi::type<T>,F &,A &,int)' being compiled
2>        with
2>        [
2>            A1=boost::_bi::value<connectServer_t *>,
2>            A2=boost::arg<1>,
2>            F=boost::_mfi::mf1<void,connectServer_t,connectServerUser_t &>,
2>            T=void,
2>            A=boost::_bi::list1<eMUCore::socketContext_t &>
2>        ]
2>        c:\program files\boost\boost_1_42\boost\function\function_template.hpp(153) : see reference to function template instantiation 'void boost::_bi::bind_t<R,F,L>::operator ()<eMUCore::socketContext_t>(A1 &)' being compiled
2>        with
2>        [
2>            R=void,
2>            F=boost::_mfi::mf1<void,connectServer_t,connectServerUser_t &>,
2>            L=boost::_bi::list2<boost::_bi::value<connectServer_t *>,boost::arg<1>>,
2>            A1=eMUCore::socketContext_t
2>        ]
2>        c:\program files\boost\boost_1_42\boost\function\function_template.hpp(147) : while compiling class template member function 'void boost::detail::function::void_function_obj_invoker1<FunctionObj,R,T0>::invoke(boost::detail::function::function_buffer &,T0)'
2>        with
2>        [
2>            FunctionObj=boost::_bi::bind_t<void,boost::_mfi::mf1<void,connectServer_t,connectServerUser_t &>,boost::_bi::list2<boost::_bi::value<connectServer_t *>,boost::arg<1>>>,
2>            R=void,
2>            T0=eMUCore::socketContext_t &
2>        ]
2>        c:\program files\boost\boost_1_42\boost\function\function_template.hpp(913) : see reference to class template instantiation 'boost::detail::function::void_function_obj_invoker1<FunctionObj,R,T0>' being compiled
2>        with
2>        [
2>            FunctionObj=boost::_bi::bind_t<void,boost::_mfi::mf1<void,connectServer_t,connectServerUser_t &>,boost::_bi::list2<boost::_bi::value<connectServer_t *>,boost::arg<1>>>,
2>            R=void,
2>            T0=eMUCore::socketContext_t &
2>        ]
2>        c:\program files\boost\boost_1_42\boost\function\function_template.hpp(722) : see reference to function template instantiation 'void boost::function1<R,T0>::assign_to<Functor>(Functor)' being compiled
2>        with
2>        [
2>            R=void,
2>            T0=eMUCore::socketContext_t &,
2>            Functor=boost::_bi::bind_t<void,boost::_mfi::mf1<void,connectServer_t,connectServerUser_t &>,boost::_bi::list2<boost::_bi::value<connectServer_t *>,boost::arg<1>>>
2>        ]
2>        d:\projekty\emu\src\connectserver\connectserver.cpp(36) : see reference to function template instantiation 'boost::function1<R,T0>::function1<boost::_bi::bind_t<R,F,L>>(Functor,int)' being compiled
2>        with
2>        [
2>            R=void,
2>            T0=eMUCore::socketContext_t &,
2>            F=boost::_mfi::mf1<void,connectServer_t,connectServerUser_t &>,
2>            L=boost::_bi::list2<boost::_bi::value<connectServer_t *>,boost::arg<1>>,
2>            Functor=boost::_bi::bind_t<void,boost::_mfi::mf1<void,connectServer_t,connectServerUser_t &>,boost::_bi::list2<boost::_bi::value<connectServer_t *>,boost::arg<1>>>
2>        ]

Męcze się z tym już 3 godziny i kompletnie nie mogę znaleźć sposobu. Szczerze, to rozwalają mnie błędy w kompilacji z boosta, bo nic nigdy nie mogę z nich wyczytać... Bardzo proszę o pomoc i z góry dziękuje. Pozdrawiam.

5
Szkółka / Odp: boost::function0 - jak użyć?
« dnia: Maj 25, 2010, 22:26:39 »
Proste i najlepsze :). Dziekuje bardzo :).

Co do tej komplikacji... Szczerze mówiąc, nie lubie boosta, ale musiałem skorzystać z lexical_cast'a. Stąd już niedaleko było do functions i bind. Staram się ograniczyć ilość obcego kodu w moim projekcie, a jeśli już, to chciałem żeby był z jednego źródła :). Dlatego stąd ta zmiana, chociaż z FastDelegate nie miałem takich problemów ;).

Jeszcze raz dziękuje, złoty z Ciebie Człowiek :).

6
Szkółka / boost::function0 - jak użyć?
« dnia: Maj 25, 2010, 21:22:17 »
Witam,
od jakiś dwóch godzin próbuję użyć boost::function0. Wcześniej korzystałem z fastdelegate, ale wykorzystuje w projekcie kilka bibliotek z boost i wiem, że oferuję on taką funkcjonalność jak fastdelegate. W związku z tym, chciałbym ograniczyć liczbę obcych bibliotek do minimum, więc postanowiłem zrezygnować z fastdelegate na rzecz boost::function0.

Otóż robię to tak:

typedef boost::function0<socketContext_t*> getNewContextCallback_t;

class myClass {
public:
    myClass(getNewContextCallback_t &getNewContextCallback):
    m_callback(getNewContextCallback) {}

private:
    getNewContextCallback_t m_callback;
};

class server_t {
public:
// .......
    socketContext_t* getFreeContext();
// .....

private:
    myClass m_some;
};

Próba użycia:

server_t::server_t():
m_some(boost::bind(&server_t::getFreeContext, this)) {
}

i dostaje

Cytuj
error C2664: 'eMUCore::tcpServer_t::tcpServer_t(eMUCore::logger_t &,eMUCore::iocpEngine_t &,unsigned short,eMUCore::tcpServer_t::getNewContextCallback_t &)' : cannot convert parameter 4 from 'boost::_bi::bind_t<R,F,L>' to 'eMUCore::tcpServer_t::getNewContextCallback_t &'
1>        with
1>        [
1>            R=eMUCore::socketContext_t *,
1>            F=boost::_mfi::mf0<eMUCore::socketContext_t *,connectServer_t>,
1>            L=boost::_bi::list1<boost::_bi::value<connectServer_t *>>
1>        ]

Jak użyć tego zestawu poprawnie dla metody klasy, która zwraca jakiś wskaźnik i nie przyjmuje żadnych argumentów? Z góry dziękuje za pomoc.

7
Szkółka / Odp: Sterta i WSARecv().
« dnia: Maj 21, 2010, 21:41:25 »
Dobra Panowie, problem rozwiązany.

Przyznam się, przynajmniej potomni nie zjedzą sobie zębów.

Otóż przy "Overlapped sockets" jest taka struktura jak WSAOVERLAPPED. Przechowuje ona różne rzeczy, np. hEvent. Jak wiadomo przy niezainicjowanych obiektach są w nich śmieci - zwłaszcza w tych, które tworzone są na stercie. Coś mnie tknęło, żeby przejrzeć jak wygląda cały "zdeserializowany obiekt" gameServerUser_t po utworzeniu w zasięgu globalnym i na stercie. W zasięgu globalnym wszystkie niezaincjowane w konstruktorze rzeczy miały ładnie 0x00 ;). Na stercie były to ciągi bliżej mi nieokreślonych bajtów - również w hEvent. W MSDN napisane jest

Cytuj
hEvent

    If an overlapped I/O operation is issued without an I/O completion routine (the operation's lpCompletionRoutine parameter is set to null), then this parameter should either contain a valid handle to a WSAEVENT object or be null. If the lpCompletionRoutine parameter of the call is non-null then applications are free to use this parameter as necessary.

Więc stąd ten INVALID_HANDLE_VALUE. Po wyzerowaniu struktury WSAOVERLAPPED wszystko hula. Nie wiem jak na to wpadłem...

Tyle w kwestii wyjaśnień. Dziękuje wszystkim za zainteresowanie :). A teraz pora się na*eb... na piwo :).

8
Szkółka / Odp: Sterta i WSARecv().
« dnia: Maj 21, 2010, 20:58:08 »
Problem jest ogólnie tego typu, że jeśli przekazuje do DLL wskaźnik na pamięć zaalokowaną w EXE, to WSARecv() zwraca INVALID_HANDLE_VALUE. W przypadku, kiedy wskaźnik wskazuje na jakąś zmienną globalną lub statyczną, to wszystko jest w porządku. Debugowałem program. Do zaalokowanej pamięci jest normalny dostęp R/W - nic się nie wywala, etc. Nie mam bladego pojęcia o co chodzi, że WSARecv zwraca INVALID_HANDLE_VALUE, skoro socket jest w porządku.

9
Szkółka / Sterta i WSARecv().
« dnia: Maj 20, 2010, 23:27:56 »
Witam Szanownych Forumowiczów. Mam problem - jak zwykle ;). Przejdę od razu do konkretów.

Mam sobię klasy:

class gameServerUser_t {
public:
eMUCore::socketContext_t m_socketContext;
int m_index;
};

class gameServer_t {
public:
gameServer_t(std::string logFileName,
size_t maxStoredLogsCount,
unsigned short listenPort,
size_t objectsMax);
virtual ~gameServer_t();

void onAttach(eMUCore::socketContext_t &socketContext);
void onReceive(eMUCore::socketContext_t &socketContext);
void onClose(eMUCore::socketContext_t &socketContext);
eMUCore::socketContext_t* getNewContext();

private:
eMUCore::logger_t m_logger;
eMUCore::iocpEngine_t *m_iocpEngine;
eMUCore::tcpServer_t *m_tcpServer;
gameServerUser_t *m_serverUsers;
size_t m_objectsMax;
};

składowa m_serverUsers to wskaźnik na tablicę, którą alokuje w konstruktorze gameServer_t

m_logger.in(eMUCore::logger_t::_MESSAGE_INFO) << "Starting " << m_objectsMax << " server users objects.";
m_logger.out();

m_serverUsers = new gameServerUser_t[m_objectsMax];
for(size_t i = 0; i < m_objectsMax; i++) {
m_serverUsers[i].m_index = static_cast<int>(i);
}

I teraz trochę teorii. Mam bibliotekę DLL, w której napisałem sobie Serwer TCP, Klienta TCP, silnik IOCP, Loggera - moduły te będą wykorzystywane w kilku aplikacjach serwerowych i chciałem je oddzielić. W silniku IOCP jest metoda attach(), która pobiera wskaźnik na wolny obiekt typu gameServerUser_t za pomocą metody getNewContext(). Metoda attach najpierw wiążę za pomocą CreateIoCompletionPort() port kompletacji z zaakceptowanym przez serwer TCP socketem, a potem za pomocą WSARecv() uruchamia tzw. "Overlapped operation." i czeka w workerze na sygnał jego wykonania. Problem jest taki, że to nieszczęsne WSARecv zwraca mi error 6, czyli ERROR_INVALID_HANDLE kiedy przesyłam do attach() wskaźnik na obiekt, który jest na zaalokowanej stercie.

Kiedy robię sztuczkę tego typu, że definiuje globalną tablicę:

gameServerUser_t g_users[50];

i ustawiam wskaźnik gameServer_t::m_serverUsers na jej adres:

m_logger.in(eMUCore::logger_t::_MESSAGE_INFO) << "Starting " << m_objectsMax << " server users objects.";
m_logger.out();

//m_serverUsers = new gameServerUser_t[m_objectsMax];
m_serverUsers = g_users;
m_objectsMax = 50;
for(size_t i = 0; i < m_objectsMax; i++) {
m_serverUsers[i].m_index = static_cast<int>(i);
}

to cała aplikacja hula. Być może jestem niedoinformowany jak to jest ze stertą, bibliotekami DLL, itd. Bardzo bym prosił o jakieś wytłumaczenie dlaczego tak się dzieję. Problem trochę zawiły i aplikacja trochę duża, ale mam nadzieję, że przedstawiłem wszystko jak należy. Pozdrawiam :).

10
Projekty rozpoczęte / Odp: Symulator hackera online (MMORPG)
« dnia: Maj 12, 2010, 18:42:35 »
Kurcze, świetny pomysł :).

Troszkę bardziej rozwinąć design w kwestii ataku na komputer - żeby było trudniej niż tylko zeskanować port, odkryć backdoora i połączyć się przez niego :). Można by np. zostawić port 80 i 21, żeby użytkownik np. mógł w jakiś sposób dotrzeć do wersji oprogramowania serwera HTTP i FTP, odkryć, że jest w niej luka, która pozwala użyć exploita i zdobyć remote roota :). Ale to już kwestia fabuły :).

Życzę powodzenia, bo projekt na prawdę spoko :).

P.S. też grałem w Up-link'a :).

11
Szkółka / Odp: std::map sekwencyjnie?
« dnia: Maj 11, 2010, 23:04:20 »
A mój wyżej opisany sposób?

Jeśli nie uda się rozwiązać problemu przy pomocy jednego kontenera, to Twoje rozwiązanie wydaje mi się najbardziej przejrzyste :).

12
Szkółka / Odp: std::map sekwencyjnie?
« dnia: Maj 11, 2010, 22:09:07 »
Kos, pierwsze słyszę, ale chętnie się zaznajomie :).

yarpen, chodzi o to, że  pobieram z MySQL pewne dane, które są posortowane przez zapytanie - coś a'la ranking. Każdy rekord posiada kolumnę z pewnym numerem (recordId), który jest jednocześnie kluczem w std::map. Do przechowywania ich w programie wykorzystuje std::map z racji łatwego dostępu do danych i ich zapisu. Niestety po ich obróbce potrzebuje zapisać je do innej tabeli w takiej samej sekwencji, jak je pobrałem (jak posortowała je baza). Niestety std::map troszkę mi to uniemożliwia.


Powiedzmy, że mam kolumnę w bazie:

DevilSquareRanking:

|playerID|Experience|

Pobieram dane z bazy

SELECT playerId, Experience, SUMA_EXP FROM DevilSquareRanking WHERE (DevilSquareRanking / SUMA_EXP) * 100) > 30 ORDER BY Experience DESC
SUMA_EXP to laczna suma experience zdobyta przez wszystkich graczy.

i teraz zapisuje je w mapie w postaci

std::map<int, std::pair<int, int> > ranking; -> skladowa klasy.

Klasa ma kilka metod:
jedna rozdaje czary, druga itemki, trzecia rozdaje LevelPoints + bonus za aktywność. Na końcu musze zapisać do tabeli DevilSquareSummary informacje o graczu, jakie czary dostał, itemki, punkty i bonus. Summary wyświetlane byłoby od najlepszego gracza do najgorszego - gdyby map nie wprowadziłoby swojego sortowania.

Z map korzystam, bo chce mieć szybki dostęp do danych ze względu na playerId. Łatwiej mi zrobic mapa[playerId[ niz iterować cały czas po wektorze i szukać.

13
Szkółka / Odp: std::map sekwencyjnie?
« dnia: Maj 11, 2010, 19:27:37 »
Pytanie czy wydajność za bardzo na tym nie ucierpi?

cybek, potrzebuje przechowywać dane według klucza, ale zależy mi na tym, aby odczytać je w takiej samej kolejności jak je zapisałem. Może jest do tego jakiś inny kontener? W STL, ew. w Boost?

14
Szkółka / std::map sekwencyjnie?
« dnia: Maj 11, 2010, 19:13:47 »
Witam,
w jaki sposób da się ominąć automatyczne sortowanie std::map według klucza? Pobieram z bazy danych posortowane dane i zapisuje je do std::map. Niestety to automatyczne sortowanie wszystko mi mota ;).

Mam powiedzmy taki kod:

#include <map>

struct ASD {
public:
int m_a;
int m_b;
};

void main() {
ASD a = {11, 22};
ASD b = {13, 44};
ASD c = {12, 33};
std::map<int, ASD> dd;

dd[7] = a;
dd[4] = b;
dd[1] = c;

for(std::map<int, ASD>::iterator i = dd.begin(); i != dd.end(); i++) {
std::cout << "[" << i->first << "][" << i->second.m_a << "][" << i->second.m_b << "]." << std::endl;
}
}

W jaki sposób odczytać z std::map wszystkie elementy w porządku, w jakim się je zapisało. Ewentualnie jak odczytywać te elementy ze względu na np. ASD::m_b - od największej do najmniejszej wartości. Szukam i w internecie i w książkach, ale mam obecnie 1000 spraw na głowie i sami wiecie... Z góry dziękuje za pomoc.

15
Projektowanie kodu / Odp: Zależności klas.
« dnia: Kwiecień 20, 2010, 00:44:03 »
A powiedzmy, że mam w aplikacji około 7000 zapytań do bazy. Jedne używane częściej, drugie rzadziej. Musiałbym stworzyć te 7000 obiektów z zapytaniami, ustawić im referencję na obiekt bazy danych, ustawić string z zapytaniem, itp. Czy to nie będzie zbyt wielki narzut?

Strony: [1] 2 3 4