Przekazywanie wskaźnika do funkcji

dział ogólny

Przekazywanie wskaźnika do funkcji

Nowy postprzez Koziol » poniedziałek, 26 października 2009, 15:24

W jaki sposób przekazać wskaźnik do funkcji do innej funkcji?
np.
biblioteka1.dll eksportuje funkcje foo1(cośtam) i jest ładowana statycznie do projekt1.exe
biblioteka2.dll eksportuje funkcje foo2(cośtam2) i również jest ładowana statycznie do projekt1.exe

i teraz pytanie jak powinno wyglądać cośtam2 i czy w projekcie biblioteka2.dll trzeba zadeklarować funkcje foo1?
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez polymorphism » poniedziałek, 26 października 2009, 16:06

Kod: Zaznacz cały
void foo1(const char*,int) { ... }

void foo2(void (*fn)(const char*,int))
{
   fn("test",666);
}

...

foo2(foo1);
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Koziol
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez Koziol » poniedziałek, 26 października 2009, 16:23

Dziękuje pięknie :)
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez Koziol » wtorek, 27 października 2009, 01:18

Zastanawia mnie czy nie można było by uzyskać tego efektu prościej, jeżeli chcieli byśmy przekazać bardzo dużo funkcji np z jednej biblioteki do drugiej np:

ObsługaDanych.dll (bardzo dużo funkcji)
i kilka innych bibliotek
a.dll
b.dll
c.dll
itd.
każda biblioteka ładowana statycznie.
Jak można ominąć przekazywanie wskaźnika tak żeby bezpośrednio każda biblioteka miała dostęp do funkcji w ObsługaDanych.dll?
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez polymorphism » wtorek, 27 października 2009, 10:58

A co stoi na przeszkodzie statycznego dołączenia ObsługaDanych.dll do bibliotek a.dll, b.dll i c.dll?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez Koziol » wtorek, 27 października 2009, 11:06

Jest to rozwiązanie ale jest "duże ale".

W ObsługaDanych.dll masz klasę i kilka eksportowanych funkcji do ów klasy, jeżeli by się statycznie podłączyło tą biblioteke do każdej z bibliotek (a,b,c itd.) musiał byś wywołać konstruktor dla każdej biblioteki.

No chyba że dało by się zrobić to w sposób:
w ObsługaDanych.dll
funkcja
void * ReturnVoidHandle()
(nie wiem czy można przekonwertować wskaźnik na klasę do void *) żeby ominąc problem z nagłówkami klas itd.
Wywoływało by się tą metode w programie "matczynym".
druga funkcja
void SetVoidHandle(void * Handle)
wywoływana w bibliotekach a, b, c itd. (w celu nie wywoływania konstruktora, ale konwersji juz istniejącego wskaźnika)
Nie wiem czy dobrze myśle.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez polymorphism » wtorek, 27 października 2009, 11:42

jeżeli by się statycznie podłączyło tą biblioteke do każdej z bibliotek (a,b,c itd.) musiał byś wywołać konstruktor dla każdej biblioteki.
No nie musiałbym. Zresztą, żeby korzystać z takiej klasy, bez statycznego linkowania, czyli nieeksportowaną z ObsługaDanych.dll, musisz mieć ją w pełni zdefiniowaną w każdej bibliotece. No a wtedy idea eksportu klasy jest zupełnie bez sensu.
Ostatnio edytowano wtorek, 27 października 2009, 11:54 przez polymorphism, łącznie edytowano 1 raz
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez Koziol » wtorek, 27 października 2009, 11:54

Temat klas w dll był wielokrotnie poruszany na forum...

Sytuacja ma się tak:
class {
i tu jwszystko odnośnie tej klasy etc.
}

a następnie eksportowane funkcje (nie należące do klasy, ale mogące nią sterować).
Kod: Zaznacz cały
void * __stdcall ReturnVoidHandle() // <- wygląda jak by należała do klasy oO
{
return (void *) ObsługaDanych->GetHandle(); // <- i czy jakoś tak się da to uzyskać bo mi wywalało błąd że nie można konwertować z TObslugaDanych* do void*
}

i w podobny sposób konwersja ale w drugą strone w :
Kod: Zaznacz cały
TObslugaDanych * ObslugaDanych;
void __stdcall SetVoidHandle(void* Handle)
{
ObslugaDanych = (TObslugaDanych *) Handle; // Tu też wywala błąd (bo powinno)
}

da się jakoś obejść te błędy?



PS. Kod pisany na szybko więc może zawierać błędy merytoryczne.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez polymorphism » wtorek, 27 października 2009, 12:05

Temat klas w dll był wielokrotnie poruszany na forum...

Wiem, w jednym brałem aktywny udział.

i czy jakoś tak się da to uzyskać bo mi wywalało błąd że nie można konwertować z TObslugaDanych* do void*

Dziwne, bo nie powinno być z tym problemu - rzutowanie na void* jest dopuszczalne prawie zawsze (w drugą stronę też). Musiałbyś dać pełną treść błędu (choć wydaje mi się, że chodzi o warning'a).

Jak rozumiem, ReturnVoidHandle jest eksportowana z ObsługaDanych.dll, a SetVoidHandle z a, b i c, tak?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez Koziol » wtorek, 27 października 2009, 12:14

Nie dokońca. Obie są w ObsługaDanych (SetVoidHandle jest wywoływane w "funkcji głównej" każdej biblioteki - a,b,c itd., a jednym z argumentów ów głównej funkcji jest właśnie void *) troche to zakręcone... Pogrzebie coś zobacze czemu to rzutowanie sprawiało problemy i zamieszcze kod. może się komuś przyda :)
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przekazywanie wskaźnika do funkcji

Nowy postprzez polymorphism » wtorek, 27 października 2009, 13:06

troche to zakręcone

Tak to tłumaczysz, że faktycznie jest to zakręcone, choć podejrzewam, że sprawa jest banalna. Przedstaw problem nieco bardziej szczegółowo, bo przy tym poziomie ogólności trudno coś sensownego napisać ponad to, co już zostało napisane.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości