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

Funkcja jako parametr i argumenty

Object Storage Arubacloud
+1 głos
413 wizyt
pytanie zadane 16 marca 2021 w C# przez Avernis Nałogowiec (27,400 p.)

Cześć. Zacząłem się bawić w C# i wykorzystałem Func<double, double> przy obliczaniu całki w Math.NET, ale funkcja ta, przyjmuje tylko jeden argument. Obecnie mój kod wygląda tak:
 

        static int i2 = 0;
        static double T2 = 0;

        static double MyFunction(double t)
        {
            return (t * t) * Math.Cos(2 * Math.PI * (1/T2) * i2 * t);
        }

        static double calculateAi(int i, double T, Func<double, double> func)
        {
            i2 = i;
            T2 = T;
            double result = 0;

            result = 2 / T * SimpsonRule.IntegrateComposite(func, 0, T, 100); 

            return result;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(calculateAi(1, 2, MyFunction)); //tutaj chciałbym przekazać dodatkowe parametry

Zastanawiam się, czy nie da się przekazać pozostałych argumentów jako np. stałe, jeżeli MyFunction miałoby więcej niż 1 parametr, np w ten sposób? Wyglądałoby to np. tak:

 

 static double MyFunction(double t, double i2)
        {
            return (t * t) * Math.Cos(2 * Math.PI * (1 / T2) * i2 * t);
        }

        static void Main(string[] args)
        {
            Console.WriteLine(calculateAi(1, 2, (MyFunction, 2))); 

            Console.ReadKey();
        }

 

2 odpowiedzi

+2 głosów
odpowiedź 16 marca 2021 przez Jacob99 Obywatel (1,840 p.)

Krótko mówiąc: nie w ten sposób.

https://docs.microsoft.com/en-us/dotnet/api/system.func-2?view=net-5.0

Func<T, Result> jest delegatem wskazującym na funkcję jednoargumentową, więc nie możesz mu przekazać funkcji wieloargumentowej. Ale Func<> ma 17 przeładowań dla liczby argumentów od 0 do 16. Więc jeśli chcesz wykorzystać funkcję np. trójargumentową to musisz użyć delegata Func<T, U, V, Result>.

double calculate_sth(double x, double y, int z)
{
    return (x * z / y);
}

double use_calculations(double a, double b, int c, Func<double, double, int, double> func)
{
    return func(a, b, c);
}

Argumenty są przekazywane w momencie wywołania delegata, więc musisz albo wpisać je na stałe w miejscu wywołania, albo użyć argumentów domyślnych, albo przekazać przez dodatkowe parametry w funkcji wywołującej

komentarz 18 marca 2021 przez Avernis Nałogowiec (27,400 p.)
edycja 18 marca 2021 przez Avernis

Wykorzystałbym funkcję trójargumentową, jednak problemem jest to, że 

SimpsonRule.IntegrateComposite

Wymaga funkcji o 1 parametrze

Edit: Trochę poczytałem o funkcjach w c# i znalazłem rozwiązanie, mianowicie funkcje lokalne

+1 głos
odpowiedź 16 marca 2021 przez Wiciorny Ekspert (270,110 p.)

Tak na marginesie : 
 

parametr i argumenty

Parametr- jest to nazewnictwo kiedy deklarujesz funkcje [ w jej prototypie ] , a argumentem nazywamy "to" co przekazujesz w momencie wywołania , jedno i to samo- ale w kontekście wywołania/napisania inaczej  się mówi i jest to istotne :) szczególnie jakby Ci się fuck-up na rozmowie trafił 

komentarz 16 marca 2021 przez Avernis Nałogowiec (27,400 p.)
Dobrze wiedzieć. Wcześniej myślałem, że to synonimy

Podobne pytania

0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 11 stycznia 2020 w JavaScript przez Raivik Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 1,849 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez MercinQ Początkujący (370 p.)
0 głosów
2 odpowiedzi 453 wizyt
pytanie zadane 24 lutego 2018 w JavaScript przez Yashe Dyskutant (7,720 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...