Aktywne Wpisy

gejuszmapkt +478
#grubaimanlet
xd
xd
źródło: GZ9jCqcbIAA8S1J
Pobierz
Polejmnie +69
W straży miejskiej zapracowani po pachy. To wszystko po to by obywatelom żyło się lepiej.
Jak taka osoba, może po pracy spojrzeć w lustro bez obrzydzenia?
#polska #prawo #strazmiejska
Jak taka osoba, może po pracy spojrzeć w lustro bez obrzydzenia?
#polska #prawo #strazmiejska
źródło: 1000020029
Pobierz




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
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 adresem, a
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