• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźnik funkcyjny jako parametr w innej funkcji.

VPS Starter Arubacloud
+1 głos
636 wizyt
pytanie zadane 2 września 2016 w C i C++ przez Mrcixx Początkujący (290 p.)

Witam.

Piszę prosty silnik pod gry karciane w C++ Builderze 6 i mam kolejny problemik.

A mianowicie mam klasę Cards, w której jest funkcja:

public:
createCard(int Left,intTop,??)
{
TImage *Karta;
Karta = new TImage(Form1);
Karta->Parent = Form1;
Karta->OnDblClick = ??;
}

I tam, gdzie jest ?? mam problem... Jak to zrobić, aby przekazać funkcję (lub wskaźnik do niej).

Wiem, że trzeba stworzyć: 

typedef void (*WSK) (_fastcall *(_closure)(TObject *))(TObject *);
lub po prostu 
void (*WSK) (_fastcall *(_closure)(TObject*))(TObject *);

i potem to przekazać:

Cards x;
x.createCards(12,12,WSK);

ale co wpisac w ?? w deklaracji funkcji?

Wiem, że problem jest zawiły, ja mam problemy ze wskaźnikami i że nie umiem perfekcyjnie opisywać problemu.

Dziękuję za pomoc.

PS. Próbowałem już zrobić:

createCard(int Left,int Top, void (*func)(_fastcall *(_closure)(TObject *))(TObject *))
{
//Tu tworzenie TImage
Karta->OnDblClick = &func; //zwykłe func też nic nie daje
}

ale nie pomaga.

createCard(int Left,int Top, void (*func)())
{
//Tu tworzenie TImage
Karta->OnDblClick = &func; //zwykłe func też nic nie daje
}

też nie działa.

komentarz 2 września 2016 przez Patrycjerz Mędrzec (192,320 p.)
Pokaż deklarację funkcji, której adres chcesz przekazać.
komentarz 2 września 2016 przez Mrcixx Początkujący (290 p.)

przekazać chcę funkcję:

(w pliku unit.cpp wygląda ona tak \/)
void __fastcall TForm1::Klikniecie(TObject *S)
{
//funckja OnDblClick
}
(a w pliku unit.h \/)
void __fastcall Klikniecie(TObject *S);

 

komentarz 3 września 2016 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli funkcja znajduje się w obiekcie, to jaki problem przesłać tylko obiekt?
komentarz 3 września 2016 przez Mrcixx Początkujący (290 p.)
Funkcja nie znajduje sie w obiekcie, tylko ja chce tą funkcje przypisać do nowo tworzonego obiektu, którego tworzę w "createCard(int,int,void)".

Ale żeby ją przypisać muszę ją przesłać do funkcji createCard(int,int,void) (bo funkcja znajduje sie w odrębnym pliku, a include'owanie unit.h nie bedzie mialo sensu, jak mam #include "CF.h" w unit.h).
komentarz 3 września 2016 przez Patrycjerz Mędrzec (192,320 p.)

Mam rozumieć, że zmienna OnDblClick to wskaźnik na funkcję?

Ogólnie ten pomysł jest irracjonalny. Korzystasz z klas, obiektów i używasz wskaźników na funkcje.

Z moich testów wynika, że niemożliwe jest pobranie adresu metody.

Jeśli mocno potrzebujesz tego wskaźnika, stwórz zwykłą funkcję - one nie mają takich zastrzeżeń.

1 odpowiedź

0 głosów
odpowiedź 2 września 2016 przez Patrycjerz Mędrzec (192,320 p.)

W parametrach funkcji wpisujesz deklarację wskaźnika - to wszystko.

Twoje zapisy w stylu:

void (*WSK)(_fastcall *(_closure)(TObject*))(TObject *);

są niepoprawne, gdyż schemat tworzenia wskaźnika to:

typ_nazwa (*nazwa)(typ_param1 param1, ...);

czyli jeden nawias za dużo.

Wydaję mi się także, że słowo __fastcall  (nie _fastcall) nie powinno być w takiej deklaracji. Konwencja wywołania nie jest elementem języka i nie jest potrzebna do stworzenia wskaźnika.

komentarz 2 września 2016 przez Mrcixx Początkujący (290 p.)

Jeżeli zmienna OnDblClick w TImage przyjmuje tylko:

void (__fastcall *(_closure)(TObject *))(TObject *)

i właśnie taką funkcję muszę przekazać to jak muszę zapisać parametry funkcji?? 

void (*func) (__fastcall *(_closure),(TObject *),(TObject *))

? Czy jakoś innaczej?

I sorka za tylko jedną podłogę w __fastcall'u. Wtedy pisalem na telefonie (kabel do internetu padł, a wifi na moim lapku nie ma :( ) i jako iż w builderze __fastcall sie pogrubia i __ wyglada jak _ to mogłem się pomylić. :)

komentarz 3 września 2016 przez Patrycjerz Mędrzec (192,320 p.)
Ten zapis jest jakiś mocno udziwniony... musiałbym zobaczyć fragment kodu, aby zrozumieć, o co ci chodzi.
komentarz 3 września 2016 przez Mrcixx Początkujący (290 p.)

mogę wrzucić link do pobrania plików c++Buildera6 :)

http://skilletss.cba.pl/links

Podobne pytania

0 głosów
1 odpowiedź 858 wizyt
pytanie zadane 8 kwietnia 2016 w C i C++ przez emilime Nowicjusz (220 p.)
0 głosów
1 odpowiedź 563 wizyt
+1 głos
1 odpowiedź 780 wizyt
pytanie zadane 12 sierpnia 2015 w Rozwój zawodowy, nauka, praca przez Patrycjerz Mędrzec (192,320 p.)

92,959 zapytań

141,921 odpowiedzi

321,152 komentarzy

62,293 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...