C wykonanie funkcji o nazwie pobranej z bazy danych mysql


(arekk-99) #1

Witam. Mam takie pytanko, czy jakbym np miał zdeklarowaną funkcję np test, i ona znajdowałaby się w tabelce funkcje w bazie danych. Czy jakbym pobrał nazwę test to czy mógłbym w jakiś sposób wykonać tą funkcję pobierając jej nazwę z bazy danych?


(Pablo_Wawa) #2

Ale chodzi Ci tylko o pobranie samej nazwy funkcji, której kod masz napisany w C, czy też o pobranie też całej treści (kodu) tej funkcji z bazy i wykonanie?

Jeśli chodzi o pierwszy (prostszy) przypadek, to możesz przygotować sobie przy pomocy switch/case listę możliwych nazw funkcji i odpowiednie ich wywyływanie w kodzie C.


(Fizyda) #3

Nie zrobisz tego jak w przypadku np php. Nazwy funkcji w C po kompilacji są zmieniane tak by była w samej nazwie ilość argumentów, zwracany typ i jakieś tam jeszcze rzeczy. Jest to zapisane w jakieś tablicy która wiąże nazwę z adresem w pamięci gdzie znajduje się kod danej funkcji. To jak ta nazwa jest kodowana zależy od kompilatora, więc po zaktualizowaniu kompilatora i zbudowaniu takiego projektu należałoby jeszcze zaktualizować dane w bazie danych. Z C++ jest jeszcze więcej “zabawy” bo tam to już w ogólne nazwy funkcji są mało ludzkie to raczej ciąg znaków który coś oznacza dla kompilatora i komputera.

Jedyną sensowną ucieczką od tego jest rozwiązanie jakie zaproponował Pablo_wawa.

W sumie jak tak teraz sobie myślę to przy importowaniu dll/so dynamicznie można pobrać adres jakiejś funkcji z tej biblioteki i ją wywołać. Może to też jakieś rozwiązanie.


(Pablo_Wawa) #4

Nie robiłem takich rzeczy w C, ale może to zadziała - w każdym razie w JavaScript działa:

robisz sobie tablicę asocjacyjną, której indeksami są nazwy funcji, a wartościami adresy (wskaźniki) tych funkcji.

tablica["test"] = test;
tablica["test2"] = test2;

funkcja = "test"; // pobrana dana z bazy MySQL
tablica[funkcja](); // lub *tablica[funkcja]()

 


(slepcu) #5

w jakimkolwiek języku byś to chciał zrobić - robisz to źle! Jest to potencjalna dziura w aplikacji.

Musisz na sztywno określić nazwy funkcji, które mogą być wywołane.

W każdym języku obiektowym rozwiązaniem mogą być wzorce projektowe np. FactoryMethod i Strategy.

W C możesz mieć tablicę wskazników do funkcji i powiązać ją z nazwami tych funkcji.


(arekk-99) #6

Ta aplikacja i tak nie byłaby przeznaczona do użytku przez zwykłego użytkownika. Program wywoływałby jeszcze inny program, który miałby na celu komunikacje z użytkownikiem.