Aktywne Wpisy
w_glab_przeszlosci +422
Kult wódy na wsi to chyba najgorsza zaraza. Ja osobiście nie piję od kilka lat i to nie po jakichś tam przejściach tylko po prostu popiłem trochę jako nastolatek i widziałem, że alkohol mi nie służy, bo mam słaby żołądek więc w ogóle przestałem pić. Oczywiście dla wszystkich wokół to jest jak jakaś niepełnosprawność. Patrzą na mnie ze zdziwieniem, zachęcają. Młodzi, starzy, bez różnicy. Nawet moja babka, która całe życie męczyła się
kodecss +55
#zalesie #logikarozowychpaskow #bekazrozowychpaskow
Tylko moja różowa jest taka?
Mamy zmywarkę - w końcu.
No i ona to traktuje jakby to była jakiś czarna dziura
- naczyń można #!$%@?ć ile się chce, jak się chce - potem się 1/3 nie domywa
- w przegrodzie na sztućce da talerze, a w przegrodzie na kubki da talerze jak sie jej trafi
- wraz z naczyniami wrzuca do zmywaki tony żarcia, nawet nie strzepuje resztek do
Tylko moja różowa jest taka?
Mamy zmywarkę - w końcu.
No i ona to traktuje jakby to była jakiś czarna dziura
- naczyń można #!$%@?ć ile się chce, jak się chce - potem się 1/3 nie domywa
- w przegrodzie na sztućce da talerze, a w przegrodzie na kubki da talerze jak sie jej trafi
- wraz z naczyniami wrzuca do zmywaki tony żarcia, nawet nie strzepuje resztek do
Mam kawałek kodu o zrozumienia. command4move.so to biblioteka z klasą command4move która dziedziczy po klasie Command.
...
#include "command.hh"
...
int main()
{
void *pLibHnd_Move = dlopen("command4move.so",RTLD_LAZY);
Command *(*pCreateCmd_Move)(void);
void *pFun;
if (!pLibHnd_Move) {
cerr << "!!! Brak biblioteki: command4move.so" << endl;
return 1;
}
pFun = dlsym(pLibHnd_Move,"CreateCmd");
if (!pFun) {
cerr << "!!! Nie znaleziono funkcji CreateCmd" << endl;
return 1;
}
pCreateCmd_Move = *reinterpret_cast(&pFun);
Command *pCmd = pCreateCmd_Move();
W klasie Command mam metodę statyczną
static Command* CreateCmd();
rozwijaną jako:Command* Command4Move::CreateCmd()
{
return new Command4Move();
}
Oraz w bibliotece command4move.so mam coś takiego:
extern "C" {
Command* CreateCmd(void);
}
Command* CreateCmd(void)
{
return Command4Move::CreateCmd();
}
Moim problemem jest zrozumienie co się dzieje w mainie i jakie rzutowania tam zachodzą.
@kiciek:
Command *(*pCreateCmdMove)(void);
pCreateCmdMove - jest wskaźnikiem na funkcję nie przyjmującą argumentów i zwracającą Command*
oraz z linią:
pCreateCmd_Move = *reinterpret_cast(&pFun);
wyłuskany, za pomocą operatora &, adres pFun (cokolwiek to jest) jest przerzutowany na wskaźnik na wskaźnik na funkcję (o deklaracji Command*(void)). spod tego wskaźnika jest wzięty jest adres funkcji który przypisany jest do pCreateCmd_Move.
tę linię dla większej czytelności można robić na coś takiego:
zaktualizowałem poprzedni komentarz i rozłożyłem tę linijkę na części, jak czegoś nie łapiesz pytaj.
Widzę do czego dążymy. Żeby się dało stosować pCreateCmd_Move jak normalną funkcję.
dlsym zwracający void* daje w tym wywołaniu wskaźnik na funkcję Command* CreateCmd(void) z dołączonej biblioteki, i nie można go jeszcze stosować, bo nie ma tutaj określonych typów. Chociaż wskazuje na coś konkretnego jest traktowany jaki void*.
Przy rzutowaniu ADRES (wskaźnika na void) jest rzutowany na WSKAŹNIK (na wskaźnik na funkcję). Miesza mi się w tej chwili różnica między
co do wyłuskiwania adresu pFun, prawdopodobnie jest to obejście faktu że nie można rzutować zwykłych wskaźników (w tym typu void) na wskaźniki na funkcje.
ktoś chyba nawet miał nawet podobny problem:
http://stackoverflow.com/questions/1096341/function-pointers-casting-in-c