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

Funkcja zwracająca wskaźnik do funkcji

Object Storage Arubacloud
0 głosów
802 wizyt
pytanie zadane 22 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

Hej :)

Rozwiązuje takie oto zadanie:

Napisz funkcję get_function, która na podstawie typu operacji, przekazanego w parametrze, zwraca wskaźnik do funkcji wykonującej tę operację.

Zadeklaruj w tej funkcji tablicę wskaźników na funkcje (funcs) i przypisz do kolejnych komórek adresy poszczególnych funkcji.

Typ operacji powinien być określony zaproponowanym typem enum o nazwie operations_t, który będzie zawierał następujące pola: op_add, op_sub, op_div oraz op_mul odpowiadające poszczególnym operacjom.

Wartość zwracana:

NULL - w przypadku podania błędnych danych wejściowych
wskaźnik na odpowiednią funkcję w przypadku sukces (poprawnych danych wejściowych).
Deklarację funkcji get_function oraz typ wyliczeniowy operations_t umieść w pliku nagłówkowym int_operations.h wraz z deklaracjami funkcji do sumowania (add_int), odejmowania (sub_int), dzielenia (div_int) i mnożenia (mul_int).

Z kolei definicje owych funkcji umieść w pliku int_operations.c.

Przykładowe wywołanie Twojej funkcji powinno wyglądać następująco:

int res =  get_function(op_add)(4, 5);
Napisz program, który przetestuje działanie przygotowanej przez Ciebie funkcji. Program powinien pobrać od użytkownika dwie liczby oraz identyfikator operacji do wykonania:

0 - dodawanie,
1 - odejmowanie,
2 - dzielenie,
3 - mnożenie.
Następnie należy wywołać funkcję get_function z odpowiednim parametrem.

W przypadku podania błędnych danych program powinien wyświetlić komunikat Incorrect input data i zakończyć działanie z kodem błędu 2.
W przypadku wprowadzenia przez użytkownika błędnych znaków program powinien wyświetlić komunikat Incorrect input i niezwłocznie zakończyć działanie z kodem błędu 1.
Uwaga

W programie nie wolno używać operatora [], za wyjątkiem deklaracji tablicy.
Na potrzeby tego zadania przyjmij zero jako wynik dzielenia w przypadku zerowego dzielnika.
Przykładowa interakcja z programem -- dane poprawne:

Enter numbers: 8 3⏎
Choose an operation: 0⏎
Result: 11
Przykładowa interakcja z programem -- błędne dane:

Enter numbers: 7 CXoWATJCDd⏎
Incorrect input
Enter numbers: -6 10⏎
Choose an operation: -1⏎
Incorrect input data
Uwaga

W programie nie wolno używać operatora [] (dotyczy to również komentarzy jak i stringów formatujących)!

Tutaj jeszcze swój kod podrzucam:

a) z pliku int_operations.c:

#include <stdio.h>
#include <stdlib.h>
#include "int_operations.h"
int add_int(int a, int b)
{
    return a + b;
}
int sub_int(int a, int b)
{
    return a - b;
}
int mul_int(int a, int b)
{
    return a * b;
}
int div_int(int a, int b)
{
    if( b == 0 )
    {
        return 0;
    }
    else
    {
        return a/b;
    }
}

b) z pliku nagłówkowego:

#ifndef INT_OPERATIONS_H_INCLUDED
#define INT_OPERATIONS_H_INCLUDED
enum operations_t {op_add = 0, op_sub = 1, op_div = 2, op_mul = 3};
int add_int(int a, int b);
int sub_int(int a, int b);
int mul_int(int a, int b);
int div_int(int a, int b);

#endif // INT_OPERATIONS_H_INCLUDED

c) pliku źródłowego:

#include <stdio.h>
#include <stdlib.h>
#include "int_operations.h"

int main()
{
    printf("Enter numbers: ");
    int a,b;
    if(scanf("%d %d",&a,&b)!=2)
    {
        printf("Incorrect input");
        return 1;
    }
    printf("Choose an operation: ");
    enum operations_t wybor ;
    if(scanf("%d",&wybor)!=1)
    {
        printf("Incorrect input");
        return 1;
    }
    if(wybor < 0 || wybor > 3)
    {
        printf("Incorrect input data");
        return 2;
    }
    return 0;
}

De facto... nie rozumiem o co chodzi z tą funkcja getfunction. Co ona ma robić? Jak rozpisać jej prototyp? Poprzednie zadanie było bardzo podobne do tego, tylko tam w parametrach funkcji oprócz a i b przekazywano wskaźnik na funkcję dodawania, odejmowania itd. . Następnie po sprawdzeniu w samym getfunction na jaką funkcję nasz wskaźnik wskazuje robiłem return-a z wynikiem add(a,b), sub(a,b) itd. A tutaj... co mam zrobić?

2 odpowiedzi

0 głosów
odpowiedź 22 kwietnia 2020 przez Eminiox Obywatel (1,500 p.)
wybrane 22 kwietnia 2020 przez Hubertius
 
Najlepsza

Według mnie chodziło bardziej o to:
 

#include <iostream>

enum OperationType
{
	ADD,
	SUB //i tak dalej
};

int add(int a, int b)
{
	return a + b;
}

typedef int (*function)(int, int);

function getFunction(OperationType operationType)
{
	switch (operationType)
	{
		case ADD: return &add;
	}
}

int main()
{
	int inputA = 3, inputB = 10; //cin >> inputA >> inputB;
	int wynik = getFunction(ADD)(inputA, inputB);
	std::cout << wynik;
}

Chodzi o zwrócenie wskaźnika do funkcji, a nie wywołanie funkcji, a następnie zwrócenie odpowiedniego wyniku

–1 głos
odpowiedź 22 kwietnia 2020 przez Bondrusiek Maniak (61,370 p.)

Witam,

zrobiłem taki przykładowy program. Może Ci pomoże. Ty musisz jeszcze pomyśleć nad zakresami widoczności dla tych funkcji gdyż ja to wrzuciłem do jednego pliku.

#include <iostream>

using namespace std;
int add_int(int a, int b)
{
    return a + b;
}
int sub_int(int a, int b)
{
    return a - b;
}
int mul_int(int a, int b)
{
    return a * b;
}
int div_int(int a, int b)
{
    if( b == 0 )
    {
        return 0;
    }
    else
    {
        return a/b;
    }
}

int get_function( int a, int b, int op ) {
    typedef int (*fn)( int, int );
    static fn funcs[] = { add_int, sub_int, mul_int, div_int };
    return funcs[ op ]( a, b );
}

int main()
{
    cout << "Wpisz a, b i op" << endl;
    int a,b,op;
    cin >> a >> b >> op;
    cout << get_function(a, b, op) << endl;
    return 0;
}

 

komentarz 22 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

get_function powinna zwracać wskaźnik na funkcję a nie wynik operacji.

komentarz 22 kwietnia 2020 przez Bondrusiek Maniak (61,370 p.)
Fakt, nie zauważyłem tego.

Podobne pytania

0 głosów
0 odpowiedzi 553 wizyt
pytanie zadane 20 maja 2020 w C i C++ przez fortuna Początkujący (310 p.)
0 głosów
4 odpowiedzi 4,467 wizyt
pytanie zadane 4 kwietnia 2016 w C i C++ przez esp0x309 Użytkownik (510 p.)
+2 głosów
0 odpowiedzi 894 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...