Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массив функций 
:(
    Опции темы
neprofi
Дата 7.4.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Всем привет! Если кто-нибудь сталкивался с созданием массива функций, помогите, пожалуйста. мне необходимо создать этот массив, а затем передать его в другую функцию. Н-р у меня есть 4 функции такого плана
Код

double f(double x, double[] y, int n)
{...}


Как мне создать массив из них и вообще возможно это или нет?
PM MAIL   Вверх
QryStaL
Дата 7.4.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



Используйте для этого делегаты


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
-Mikle-
Дата 7.4.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



Цитата(neprofi @  7.4.2009,  17:53 Найти цитируемый пост)
Н-р у меня есть 4 функции такого плана

Если все ваши 4 ф-ии одинаковые, т.е. имеют одинаковое число и тип параметров и если я правильно вас понял, то вот пример:
Код

        // допустим вот такие 4 ф-ии у тебя
        private double f1(double x, double[] y, int n)
        {
            return 1;
        }
        private double f2(double x, double[] y, int n)
        {
            return 2;
        }
        private double f3(double x, double[] y, int n)
        {
            return 3;
        }
        private double f4(double x, double[] y, int n)
        {
            return 4;
        }

        // объвляем делегат для них (вместо этого, можно было бы использовать дженерик делегат Func<double, double[], int, double>)
        delegate double MyFuncHandler(double x, double[] y, int n);

        // тестовый метод, который создает объединенный делегат на ф-ии f1, f2, f3, f4
        private void button1_Click(object sender, EventArgs e)
        {
            MyFuncHandler allFunctions = (MyFuncHandler)Delegate.Combine((MyFuncHandler)f1, (MyFuncHandler)f2, (MyFuncHandler)f3, (MyFuncHandler)f4);

            // Вызываем все ф-ии одним вызовом. В result будет результат только последней ф-ии (f4 в данном случае)
            double result = allFunctions(0, null, 0);

            // Если нужно знать результат каждого вызова, то тогда так
            foreach (MyFuncHandler func in allFunctions.GetInvocationList())
                result = func(0, null, 0);
        }





--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
QryStaL
Дата 7.4.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



MyFuncHandler allFunctions = (MyFuncHandler)Delegate.Combine((MyFuncHandler)f1, (MyFuncHandler)f2, (MyFuncHandler)f3, (MyFuncHandler)f4);

лучше заменить на

MyFuncHandler allFunctions = f1 + f2 +f3 + f4;
=)


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
-Mikle-
Дата 7.4.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



тогда так:
Код

            MyFuncHandler allFunct = (MyFuncHandler)f1 + f2 + f3 + f4;




--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Mascon
Дата 10.4.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.6.2006

Репутация: нет
Всего: нет



А вот так нельзя?

Код

MyFuncHandler[] fArray =  new MyFuncHandler[4];
   fArray[0] = f1;
   fArray[1] = f2;
   fArray[2] = f3;
   fArray[3] = f4;
fArray[3]
вызов функций по индексам, типа x = fArray[2](...);
PM MAIL   Вверх
QryStaL
Дата 10.4.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



Mascon, можно, такой код полезен в случаях, когда нужно вызывать методы в произвольном порядке.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
neprofi
Дата 13.4.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Мне посоветовали использовать списки, не знаю насколько это правильно. но так программа вроде компилируется smile 

Код


delegate double MyFuncHandler(double x, double[] y, int n);

....
private void расчётToolStripMenuItem_Click(object sender, EventArgs e)
{
    ...
    List<MyFuncHandler> f = new List<MyFuncHandler>();

            f.Add(new MyFuncHandler(f1));
            f.Add(new MyFuncHandler(f2));
            f.Add(new MyFuncHandler(f3));
            f.Add(new MyFuncHandler(f4));

    Metod(x, x_n,  y, f, h);
}

PM MAIL   Вверх
-Mikle-
Дата 13.4.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



Цитата(neprofi @  13.4.2009,  14:24 Найти цитируемый пост)
не знаю насколько это правильно. но так программа вроде компилируется 

Компилироваться будет, а вот правильно или нет - понятие растяжимое. Все предложенные здесь способы (включая твой) правильные и пригодны для использования. Что конкретно использовать зависит от тебя. Лично я, не стал бы использовать списки делегатов, если бы в этом не было особой необходимости.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0809 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.