powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / делегаты в языках программирования
25 сообщений из 129, страница 3 из 6
делегаты в языках программирования
    #39058967
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, выше пример про таймер не канает?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058971
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, я плохо понял тот пример.
Можно ли привести пример на уровне программного кода, где будет чётко видно разницу между так называемыми "слоями"? Ваше объяснение хорошее, но я представлял это на уровне того, что некоторая функция высшего порядка принимает другие функции, например, функция бинарного поиска может принимать различные функции сравнения элементов(искать по длине строки, либо сравнивать лексикографически). Вы привели хорошее объяснение на русском языке почему возможные функции параметры называются функциями обратного вызова, и в данном объяснении присутствуют так называемые "уровни", потому мне не очень понятно как это работает на практике.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058975
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнапример, функция бинарного поиска может принимать различные функции сравнения элементов(искать по длине строки, либо сравнивать лексикографически)это не про callback, это про "вычисление интеграла" :)
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058980
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя можно считать функцию бинарного поиска и функцию вычисления интеграла внутренним слоем (базовый функционал), а то, где определены функции сравнения и подынтегральные функции, внешними слоями (расширяющий функционал).
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058983
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAХотя можно считать функцию бинарного поиска и функцию вычисления интеграла внутренним слоем (базовый функционал), а то, где определены функции сравнения и подынтегральные функции, внешними слоями (расширяющий функционал).

Но если все эти функции определены (полностью описан алгоритм данных конкретных функций) в одной единице трансляции, то все эти функции будут находиться в одной глобальной области видимости. Разве не так ? Тогда о каких слоях идёт речь ? О том что вызов функции идёт через параметр в теле функции высшего порядка с локальной областью видимости ? В этом дело ?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39058984
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут неплохой пример
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059002
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryskyANAХотя можно считать функцию бинарного поиска и функцию вычисления интеграла внутренним слоем (базовый функционал), а то, где определены функции сравнения и подынтегральные функции, внешними слоями (расширяющий функционал).

Но если все эти функции определены (полностью описан алгоритм данных конкретных функций) в одной единице трансляции, то все эти функции будут находиться в одной глобальной области видимости. Разве не так ?С чего вдруг?

Давайте рассмотрим очевидную альтернативу в ОО стиле: наследование и полиморфизм. В этом случае функции определяются как переопределение методов базового класса.
Но разве наследники обязаны быть в одной области видимости?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059026
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, подождите, мы ведь не закончили с предыдущим примером.

одна функция будет сравнивать длины строк, а другая сравнивать строки лексикографически. Здесь разные "уровни" о которых вы говорите в том смысле, что описание strcmp находится в string.cpp, а это другая область видимости. Правильно ли я вас понял ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <string.h>


int cmp1(const char* s1, const char* s2)
{
	return strlen(s1) - strlen(s2);
}

//может быть будет использована cmp1,а может быть strcmp
int smth_func(int smth, const char* smth_else, int(*cmp_func)(const char* s1, const char* s2))
{

}
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059050
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, я нигде не писал, что функции сравнения должны быть собраны именно в одном месте, если Вы об этом.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059062
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANASashaMercury, я нигде не писал, что функции сравнения должны быть собраны именно в одном месте...

Вот. В том то и дело что вы говорите о некоторых разных слоях

skyANAПусть F - функция высшего порядка с параметром G функционального типа. Тогда функцию G, задающую параметр (а иногда и саму функцию F), называют функцией обратного вызова (callback функцией).
Термин вполне понятен. Если в некотором внешнем слое функция Q вызывает функцию внутреннего слоя F, то предварительно во внешнем слое следует позаботиться о создании функции G, которая и будет передана F.
Таким образом, функция Q внешнего слоя вызывает функцию F внутреннего слоя, которая, в свою очередь (обратный вызов) вызывает функцию G внешнего слоя. Чтобы эта техника работала, должен быть задан контракт.
Функция высших порядков, написанная во внутреннем слое, задает следующий контракт: "всякая функция, которая собирается меня вызвать, должна передать мне функцию обратного вызова,
принадлежащую определенному мной функциональному классу, следовательно, иметь известную мне сигнатуру".
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059134
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Архитектурные слои имелись в виду. Пользовательский код, вызывающий SetTimer, и библиотека WinAPI, этот таймер реализующая.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059182
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа что такое делегат ?
список указателей на функции.

одно из применений - для подсовывания разных обработчиков к событиям

есть тип делегат,
есть поле класса либо переменная описанная типом делегат (это собственно и есть список),
есть метод, указатель на который добавляется либо убирается из переменной типа делегат (из списка)

апд
в сишарпе.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059186
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинать понимать, как использовать, имхо, лучше с обработчиков нажатия на кнопки,
а не с функций высших порядков.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059197
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример по передаче функции

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
using System;

namespace Lesson_5_Delegate_E2_BubbleSorter
{
    class Program
    {

        public delegate Boolean Comparer(Object elem1, Object elem2);

        static class BubbleSorter
        {
            static public void Sort(Object[] array, Comparer comparer)   //// <- функция которая сортирует
            {
                for (Int32 i = 0; i < array.Length; i++)
                    for (Int32 j = i + 1; j < array.Length; j++)
                        if (comparer(array[j], array[i]))   /// <-   вызов передаваемой функции
                        {
                            Object buffer = array[i];
                            array[i] = array[j];
                            array[j] = buffer;
                        }
            }
        }

        public struct Person
        {
            public String FirstName;
            public String LastName;
            public DateTime Birthday;

            public Person(String firstName, String lastName, DateTime birthday)
            {
                this.FirstName = firstName;
                this.LastName = lastName;
                this.Birthday = birthday;
            }

            public override String ToString()
            {
                return String.Format(
                    "Имя: {0,-10} Фамилия: {1,-10} Дата рождения: {2:d}.",
                    FirstName, LastName, Birthday);
            }
        }

        static public Boolean PersonBirthdayComparer(Object person1, Object person2)// сравнение по дате рождения
        {
            return ((Person)person1).Birthday < ((Person)person2).Birthday;
        }

        static public Boolean PersonFirstComparer(Object person1, Object person2)// ------------- сравнение по имени
        {
            return string.Compare(((Person)person1).FirstName, ((Person)person2).FirstName)> 0;
        }


        static void Main(string[] args)
        {
            Person p0 = new Person("Максим", "Орлов", new DateTime(1989, 5, 12));
            Person p1 = new Person("Иван", "Иванов", new DateTime(1985, 7, 21));
            Person p2 = new Person("Петр", "Петров", new DateTime(1991, 3, 1));
            Person p3 = new Person("Федор", "Федоров", new DateTime(1971, 11, 25));
            Person p4 = new Person("Павел", "Козлов", new DateTime(1966, 8, 6));

            Object[] persons = { p0, p1, p2, p3, p4};

            Console.WriteLine("\nНесортированный список:");
            foreach (Object person in persons) Console.WriteLine(person);

            Console.WriteLine("\nСортированный список:");
            BubbleSorter.Sort(persons, new Comparer(PersonBirthdayComparer));///< ------------------сортировка  по дню рождения

            foreach (Object person in persons) Console.WriteLine(person);

            Console.WriteLine("\n");
            Console.WriteLine("\nСортированный список2:");
            BubbleSorter.Sort(persons, new Comparer(PersonFirstComparer));  ///<------------- сортировка  по имени

            foreach (Object person in persons) Console.WriteLine(person);

        }
    }
}
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059202
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizначинать понимать, как использовать, имхо, лучше с обработчиков нажатия на кнопки,
Там очень трудно ответить на вопрос "нафига всё это уродство вместо простого указателя на функцию". Да и слово callback, которое любят употреблять, окончательно теряет смысл.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059205
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerDaniilSeryiЛюди, объясните нормальному человеку, выросшему на Pascale, QBasice и VBA, зачем в C-подобных языках придумали такое уродство, как делегаты?
Затем, что сначала теоретики кричат "указатели сакс", а потом оказывается, что без них очень хреново. И начинают придумывать функторы, делегаты и всякую прочую муть, которая позволяет замаскировать понятие "указатель".

я бы попросил не катить бочку на Люка Карделли
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059211
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarertchingizначинать понимать, как использовать, имхо, лучше с обработчиков нажатия на кнопки,
Там очень трудно ответить на вопрос "нафига всё это уродство вместо простого указателя на функцию". Да и слово callback, которое любят употреблять, окончательно теряет смысл.

Ага. а кому сейчас легко?
Лично я думаю, затем, чтобы разработчики сишарпа смогли отчитаться перед менеджером проекта
что в языке сишарп нет указателей на функцию.
Их (разработчиков) на работу наняли и сказали избавится от указателей (деструкторов) - они избавились
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059214
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarertchingizначинать понимать, как использовать, имхо, лучше с обработчиков нажатия на кнопки,
Там очень трудно ответить на вопрос "нафига всё это уродство вместо простого указателя на функцию". Да и слово callback, которое любят употреблять, окончательно теряет смысл.
прибилизительно также тяжело как ответить на вопрос зачем слово тарелька пишется без
мягкого знака, а слово сол с мягким знаком?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059331
Adx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Adx
Гость
ЕвгенийВПриспокойно можно сделать так.
Код: c#
1.
 Func<double, double> sin = x => Math.Sin(x);


Где тут экземпляр?

Т.е. как это где? А sin - не экземпляр?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059347
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryiЛюди, объясните нормальному человеку, выросшему на Pascale, QBasice и VBA, зачем в C-подобных языках придумали такое уродство, как делегаты?

В C и даже в С++ нет делегатов, делегаты придумали в C#, и только там они используются и называются таким образом.

Если ты вырос на Pascale, QBasice и VBA, то ты УЖЕ ТОЛЬКО ПОЭТОМУ НЕНОРМАЛЬНЫЙ человек (точнее, человек-то ты наверняка нормальный, но программист -- нет), поэтому объяснять тебе, зачем нужны делегаты, в общем, бессмысленно.

Но если хочешь -- изволь. В конце концов, надежда всегда есть.
Делегаты нужны для того, чтобы функции (т.е. код) в языке стали первоклассными объектами. Это -- термин.
Означает, что с фукнциями можно поступать так же, как и с другими объектами языка. Класть их в структуры данных,
передавать как параметры, распечатывать и т.п. -- всё, что можно делать с другими объектами языка. Т.е. функции
будут данными, код -- это данные.

Далее последует вопрос, ЗАЧЕМ это нужно. Логично, отвечаю -- чтобы иметь возможность в языке реализовать
алгоритмы высших порядков или функции высших порядков (взаимозаменяемые термины).

Зачем нужны функции высших порядков ?
Очень просто -- они очень сильно повышают мощность и выразительность языка.
Т.е. за меньшее время и меньшими усилиями ты можешь на языке сделать больше.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059351
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа что такое делегат ?

По сути -- указатель на функцию, возможно с дополненный какими-то дополнительными данными, передаваемыми при вызове фукнции.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059355
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС похоже слился уже из топика...А я то...
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059432
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это с каких же пор начавшие с бейсика/паскаля перестали быть нормальными программистами?
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059436
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfЭто с каких же пор начавшие с бейсика/паскаля перестали быть нормальными программистами?

Всегда были.
...
Рейтинг: 0 / 0
делегаты в языках программирования
    #39059438
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivRWolfЭто с каких же пор начавшие с бейсика/паскаля перестали быть нормальными программистами?

Всегда были.

Не, если там начали с Синлера и его бейсика -- нормально!
Но кто учит паскаль и влюбляется в него -- 100% ничего путного из них не выходит, если они не переходят на программирование в СУБД.
...
Рейтинг: 0 / 0
25 сообщений из 129, страница 3 из 6
Форумы / Программирование [игнор отключен] [закрыт для гостей] / делегаты в языках программирования
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]