Funkcja zwracająca adres- przypisanie do nowego wskaznika.

Funkcja zwracająca adres- przypisanie do nowego wskaznika.
AN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 78
0

Witam! Mam dylemat. Jestem w trakcie czytania książki Grębosza. No i w dziale wskaźniki trochę się zamotałem. Co prawda nie jest to tam poruszone, ale mnie ciekawi.
Powiedzmy, że mamy taką sytuację:

Kopiuj
double funkcja(int a, char b, bool c){
  return a;
}
//teraz funkcja zwracająca adres:
double (*zwrot(int d))(int, char, bool){
{
  if(d==2) cout<<"Brawo!";
  return funkcja;
}
int main()
{
  double (*wsk)(int, char, bool); //tutaj nie jestem pewien, chodzi mi o to, żebym mógł przypisać adres funkcji zwrot do mojego wskaźnika
  wsk = (*zwrot()); //no ale kompilator wyrzuca błąd, że za malo argumentow
  return 0;
}

jak to poprawić, żeby chodziło?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
3

Bo funkcja zwrot ma parametr: d.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

chyba pierwszy raz widze w zyciu takie cos. Dla Twojej informacji. NIGDY czegos takiego nie napiszesz, bo nie bedziesz potrzebowac po prostu

AN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 78
0

dobra, nie zauważyłem u góry :) oki dzięki już rozumiem;

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1
Kopiuj
double (*zwrot(int d))(int, char, bool)

to jest funkcja przyjmująca int, i zwracająca wskaźnik na funkcję double(int,char,bool).

Kopiuj
zwrot()

Wołasz ją z zerem argumentów, pomimo, że oczekuje jednego. Nic dziwnego, że kompilator o tym mówi.

Przy okazji: po co dokonujesz dereferencji otrzymanego wskaźnika?

Kopiuj
double (*zwrot(int d))(int, char, bool){
{

Za dużo klamerek.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
double (*zwrot(int d))(int, char, bool);

Takich potworków się nigdy nie robi.

Rozbija się to na dwie deklaracje: typu zwracanego (wskaźnik na funkcję) i funkcji zwracającej ten typ:

Kopiuj
typedef double (*funkcja_t)(int, char, bool);

funkcja_t zwrot(int d);

I wszystko jasne.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Wolę zapis:

Kopiuj
typedef double funkcja_t(int, char, bool);
funkcja_t *zwrot(int d);
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
3

Jeśli już przy tym jesteśmy to w C++11 może się obyć bez deklaracji osobnych aliasów dla każdego zwracanego typu

Kopiuj
template<typename T>
using function_ptr = typename add_pointer<typename enable_if<is_function<T>::value,T>::type>::type;

function_ptr<double(int,char,bool)> zwrot(int d);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.