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

Funkcja jako parametr i argumenty

VPS Starter Arubacloud
+1 głos
393 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 (269,120 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ź 172 wizyt
pytanie zadane 11 stycznia 2020 w JavaScript przez Raivik Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 1,809 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez MercinQ Początkujący (370 p.)
0 głosów
2 odpowiedzi 445 wizyt
pytanie zadane 24 lutego 2018 w JavaScript przez Yashe Dyskutant (7,720 p.)

92,452 zapytań

141,262 odpowiedzi

319,074 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...