реклама на сайте
подробности

 
 
> Непонятный typedef
Harvester
сообщение Oct 15 2009, 11:30
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Столкнулся вот с таким переопределением типа:
Код
typedef void (* sys_timeout_handler)(void *arg);

(Это из стека lwIP)
И никак не могу понять, что же из себя представляет переменная h, объявленная как
Код
sys_timeout_handler h;


Буду признателен за подсказку.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Oct 15 2009, 13:42
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Процедуры и функции и прочее - это алгоритмические еденицы. Они есть везде, где есть алгоритмы.

Видимо проблема растёт из "нового" образования в школах/вузах. Раньше, когда в обязательном порядке изучали Паскаль ни у кого бы не возникло отторжение понятия процедуры.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 16 2009, 03:52
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(GetSmart @ Oct 15 2009, 20:42) *
Процедуры и функции и прочее - это алгоритмические еденицы. Они есть везде, где есть алгоритмы.

Да? А вот в языке Verilog, например, есть function и task, процедуров не завезли. sad.gif Как быть?

Нет в языке С процедур. Есть только функции. Это вопрос о терминах. Если хотите, чтобы вас однозначно понимали в какой-то предметной области, будьте добры корректно употреблять легальные устоявшиеся термины. В языке программирования С нет процедур. И в языке программирования С++ нет процедур. В нем же функции-члены классов - это функции члены классов, а не методы, как их многие называют. Методы в С++ - это виртуальные функции. В другом языке, возможно, корректно называть любые функции-члены методами. Но не в С++. Когда я вижу в контексте С++ слово метод, у меня сразу включается восприятие полиморфного поведения данной функции. И очень неприятно потом узнавать, что это была обычная функция-член. Некорректное употребление терминологии - источник для путаницы. И замечание было сделано совершенно уместно.

Цитата(GetSmart @ Oct 15 2009, 20:42) *
Видимо проблема растёт из "нового" образования в школах/вузах. Раньше, когда в обязательном порядке изучали Паскаль ни у кого бы не возникло отторжение понятия процедуры.

Проблема растет из недостаточного знания матчасти и/или небрежного отношения мелочам. И это зря. "Профессионал отличается от любителя отработкой мелочей" (с).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 16 2009, 07:57
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(dxp @ Oct 16 2009, 09:52) *
В нем же функции-члены классов - это функции члены классов, а не методы, как их многие называют. Методы в С++ - это виртуальные функции.


Первый раз слышу о таком разделении. Где такое прописано?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 16 2009, 08:43
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(AHTOXA @ Oct 16 2009, 14:57) *
Первый раз слышу о таком разделении. Где такое прописано?

Терминология идет, как уже было сказано, с ООП языков, но там проще в этом смысле - там все функции объектов являются методами. Что касается С++, то про упомянутое, в частности, есть фраза Б.Страуструпа (The C++ Programming Language, Third Edition by Bjarne Stroustrup. Copyright ©1997 by AT&T.
Published by Addison Wesley Longman, Inc. ISBN 0-201-88954-4., 12.2.6 Virtual Functions):

To allow a virtual function declaration to act as an interface to functions defined in derived
classes, the argument types specified for a function in a derived class cannot differ from the argu-
ment types declared in the base, and only very slight changes are allowed for the return type
(§15.6.2). A virtual member function is sometimes called a method.
A virtual function must be defined for the class in which it is first declared (unless it is declared
to be a pure virtual function; see §12.3).

Думается, Страуструп является авторитетным дяденькой в контексте С++, и он тут не оригинальничает - следует общепринятому подходу. Да, и по смыслу метод - это переопределенное (т.е. измененное в наследниках) действие объекта, и таким свойством обладает как раз (и только) виртуальная функция в С++. А в чистых ООП языках ничего кроме методов и нет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 16 2009, 09:12
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ясно, спасибо. Замечу всё же, что "иногда называют методом" - это весьма нестрого, и не тянет на строгое терминологическое определениеsmile.gif

-----
Я тут ещё вот что подумал...

Цитата(dxp @ Oct 16 2009, 14:43) *
Да, и по смыслу метод - это переопределенное (т.е. измененное в наследниках) действие объекта


Это ведь чисто умозрительно. Если уж речь идёт о точной терминологии, то надо оперировать какими-то более весомыми определениями, чем "по смыслу". Я, например, не нашёл указаний, что метод должен быть обязательно переопределяем.
Вот например, из википедии:
Цитата
Метод в объектно-ориентированном программировании - это функция, принадлежащая какому-то классу или объекту.

Никаких намёков на переопределяемость.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 16 2009, 10:09
Сообщение #7


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(AHTOXA @ Oct 16 2009, 16:12) *
Ясно, спасибо. Замечу всё же, что "иногда называют методом" - это весьма нестрого, и не тянет на строгое терминологическое определениеsmile.gif

Он просто упомянул о том, что виртуальная функция - это то, что называют методом в ООП. Метод - это термин из ООП. Если пройтись по его книге, то слово method там встречается еще не раз, но всегда в ином смысле - как способ. Как обозначение простой функции-члена этот термин не применяется. Это устоявшаяся терминология, и разумно ее придерживаться.

Цитата(AHTOXA @ Oct 16 2009, 16:12) *
Я тут ещё вот что подумал...

Это ведь чисто умозрительно. Если уж речь идёт о точной терминологии, то надо оперировать какими-то более весомыми определениями, чем "по смыслу". Я, например, не нашёл указаний, что метод должен быть обязательно переопределяем.
Вот например, из википедии:

Никаких намёков на переопределяемость.

Ключевое словосочетание: "в объектно-ориентированном программировании". Т.е. задан контекст. В ООП все функции являются переопределяемыми (виртуальными), поэтому нет смысла это специально выделять. А С++ - язык гибридный, в нем сочетаются несколько парадигм программирования, в нем есть и обычные функции, и виртуальные, кои являются методами по ООП терминологии. А путаница возникает оттого, что некоторые люди, не задумываясь, переносят терминологию из ООП на другие парадигмы - в частности, в С++ - на объектную (классы, объекты классов).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 16 2009, 10:20
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(dxp @ Oct 16 2009, 16:09) *
Ключевое словосочетание: "в объектно-ориентированном программировании". Т.е. задан контекст.


Хорошо, почти убедилsmile.gif Осталось развеять мои сомнения только вот в этом:
Цитата(dxp @ Oct 16 2009, 16:09) *
В ООП все функции являются переопределяемыми (виртуальными)

Откуда это следует?

ЗЫ. Я не спорю, я действительно хочу разобраться. Потому что у меня слово "метод" совершенно не ассоциируется с виртуальностью.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 16 2009, 13:41
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(AHTOXA @ Oct 16 2009, 17:20) *
Откуда это следует?

А что по-твоему ООП? smile.gif Чем объектно-ориентированный подход отличается от объектного?

Объектный - это когда ты вместо разрозненных данных и кода используешь законченные сущности - объекты, имеющие представление (закрытую часть, ядро которой представляют данные) и интерфейс (открытую часть, состоящую, обычно, из функций-членов). Интерфейс определяет то, что можно делать с объектом. Т.е. программист на этапе проектирования объекта задает его поведенческую модель, изменить которую при использовании объекта нельзя - в этом суть объектного подхода и его главные свойства: инкапсуляция и абстракция.

Объектно-ориентированный подход - это когда на основе объектов строят иерархию, состоящую из объектов-предков и объектов-потомков, имеющих переопределяемые функции, поведение которых в потомках задается в соответствии с логикой работы объекта-потомка. И эта переопределяемость позволяет использовать общий интерфейс для управления объектами из этой иерархии.

Классический пример - графика. Вот есть полсотни объектов, которые имеют в качестве общего свойства то, что их можно нарисовать - в силу того, что они графические объекты. Поэтому все они имеют переопределяемую в потомках (виртуальную) функцию draw(). Теперь, чтобы нарисовать их все, достаточно пройтись по массиву указателей (в С++) на базовый класс (на тот класс, в котором эта функция draw определена впервые), вызывая для каждого эту функцию. И для каждого объекта будет вызвана его собственная функция. Т.е. код, вызывающий функцию, один и тот же, а функции вызываются каждый раз разные. И без ошибок.

Т.е. ООП - это очень эффективный способ управления множеством объектов, связанных между собой "родственными связями", когда известно, что можно делать, но неизвестно в общем случае как (это "как" в каждом случае свое). И по терминологии ООП это что обзывается термином "метод". Другими словами, у каждого объекта есть одинаковое по смыслу действие, но способ его реализации в каждом случае разный. Способ == метод. Отсюда и происхождение этого термина.

Т.е. у этих "родственных" объектов есть общее, отличающееся по способу/методу реализации. А вот у просто объектов, не связанных "родственными" связями, такого общего свойства нет. У них в общем случае все функции совершенно разные по смыслу, т.е. это не методы реализации одного и того же по целевому смыслу, а просто функции. Поэтому называть их методами некорректно во всех смыслах.

В чистых же ООП языках все объекты являются связанными, в них все функции-члены реализуются как переопределяемые, т.е. являются как раз методами реализации одних и тех же (по целевому смыслу) действий.



Цитата(GetSmart @ Oct 16 2009, 20:29) *
Введите в гугле "процедуры в языке си" и зачитайтесь smile.gif Особенно первой ссылкой
http://www.codenet.ru/progr/cpp/qc/

Это лишь доказывает, что вы не один попали под влияние Паскаля. biggrin.gif К тому же, надо делать скидку, что переводы тоже делают люди. Не случайно А.С.Пушкин называл переводчиков "подставными лошадьми истории". smile.gif Ну, и в конце концов, мало ли что пишут на заборах. Мы тут серьезно разговариваем, т.ч. давайте апеллировать к серьезным источникам, коими являются Стандарт языка и его автор[ы].


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 16 2009, 15:44
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(dxp @ Oct 16 2009, 19:41) *
Т.е. ООП - это очень эффективный способ управления множеством объектов, связанных между собой "родственными связями", когда известно, что можно делать, но неизвестно в общем случае как (это "как" в каждом случае свое). И по терминологии ООП это что обзывается термином "метод". Другими словами, у каждого объекта есть одинаковое по смыслу действие, но способ его реализации в каждом случае разный. Способ == метод. Отсюда и происхождение этого термина.


Всё равно не вижу тождества "метод == виртуальный" smile.gif В той же графике, метод move(x, y), например, вполне может быть одинаков для всех фигур, и состоять из
Код
{
    erase();
    set_pos(x, y);
    draw();
}
, и потому ему совершенно необязательно быть виртуальным.

То есть, (имхо), метод = действие объекта, виртуальный = переопределяемое действие объекта. И эти вещи более или менее ортогональны. Поэтому я всё же склоняюсь к мысли, что название "метод" - это просто краткий способ назвать функцию класса. Ещё более в этом мнении меня утверждает существование термина "Виртуальный метод". Раз есть "виртуальный", то, наверное, должен быть и просто метод? smile.gif

Цитата(dxp @ Oct 16 2009, 19:41) *
Т.е. у этих "родственных" объектов есть общее, отличающееся по способу/методу реализации. А вот у просто объектов, не связанных "родственными" связями, такого общего свойства нет. У них в общем случае все функции совершенно разные по смыслу, т.е. это не методы реализации одного и того же по целевому смыслу, а просто функции. Поэтому называть их методами некорректно во всех смыслах.


А, я наконец понял, откуда идёт эта аналогия. Метод = метод (вариант) реализации? Понятно. Но всё же не соглашусь. Метод - это функция объекта, независимо от того, есть у объекта родственные связи или нет. Единственный вариант(метод) реализации - тоже вариант (метод) smile.gif)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 16 2009, 21:20
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(AHTOXA @ Oct 16 2009, 21:44) *
Всё равно не вижу тождества "метод == виртуальный" smile.gif

Решил таки копнуть поглубжеsmile.gif Поискал по имеющимся книжкам.

1. Bruce Eckel - "Thinking in C++", Глава 10, задание 28:
Цитата
Write static methods to print out the arrays.

- статический, следовательно - невиртуальный, но метод.
Там же, Глава 16:
Цитата
container class has the begin( ) and end( ) methods to produce these iterators.

- при этом из приведённого исходника видно, что ни begin() ни end() - не виртуальные.

2. Dale N. - "C++ plus data structures (3rd edition) (2003)", глоссарий:
Цитата
method: a function declared as member of class object

- ни слова о виртуальности.

3. "Design Patterns":
Цитата
Object-oriented programs are made up of objects. An object packages both data and the procedures that operate on that data. The procedures are typically called methods or operations.

- тоже никакого обособления виртуальных методов.

4. Ален Голуб - "Верёвка достаточной длины":
Цитата
97. Наследование - это процесс добавления полей данных и методов-членов.
В Си++ производный класс может рассматриваться как механизм добавления полей данных и обработчиков сообщений к существующему определению класса - к базовому классу. (Вы можете также смотреть на наследование как на средство изменения поведения объекта базового класса при получении им конкретного сообщения. Я вернусь к такой точке зрения при обсуждении виртуальных функций). В таком случае иерархия классов является просто средством представления полей данных и методов, определяемых для конкретного объекта. Объект содержит все данные и методы, объявленные на его уровне, а также на всех вышележащих уровнях.

- и далее многократно по тексту употребляется слово "метод" в контексте "функция-член".

То есть, похоже, что разделение "виртуальные функции-члены = методы, невиртуальные = просто функции-члены" - не является общепринятой терминологией. Хотя идея неплохаяsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Harvester   Непонятный typedef   Oct 15 2009, 11:30
- - GetSmart   Цитата(Harvester @ Oct 15 2009, 17:30) И ...   Oct 15 2009, 11:33
|- - Harvester   Цитата(GetSmart @ Oct 15 2009, 14:33) Под...   Oct 15 2009, 11:47
|- - andrew_b   Цитата(GetSmart @ Oct 15 2009, 15:33) h -...   Oct 15 2009, 11:50
|- - GetSmart   Цитата(andrew_b @ Oct 15 2009, 17:50) На ...   Oct 15 2009, 11:52
|- - andrew_b   Цитата(GetSmart @ Oct 15 2009, 15:52) про...   Oct 15 2009, 12:04
|- - kurtis   Цитата(andrew_b @ Oct 15 2009, 15:04) В...   Oct 15 2009, 12:08
|- - GetSmart   Цитата(andrew_b @ Oct 15 2009, 18:04) В...   Oct 15 2009, 12:10
|- - andrew_b   Цитата(GetSmart @ Oct 15 2009, 16:10) Не ...   Oct 15 2009, 12:36
|- - GetSmart   Цитата(andrew_b @ Oct 15 2009, 18:36) К ч...   Oct 15 2009, 13:07
|- - andrew_b   Цитата(GetSmart @ Oct 15 2009, 17:07) Дор...   Oct 15 2009, 13:23
|- - demiurg_spb   Цитата(andrew_b @ Oct 15 2009, 17:23) Реч...   Oct 15 2009, 16:03
- - kurtis   Цитата(Harvester @ Oct 15 2009, 14:30) Ст...   Oct 15 2009, 11:52
- - Flexz   Давным-давно в паскале процедурой называлась функц...   Oct 15 2009, 12:12
|- - zltigo   Цитата(Flexz @ Oct 15 2009, 15:12) Давным...   Oct 15 2009, 12:31
- - sigmaN   Да все знают. И ответ топикстартеру был понятен. П...   Oct 15 2009, 12:55
|- - _Pasha   Цитата(sigmaN @ Oct 15 2009, 15:55) Да вс...   Oct 15 2009, 15:12
|- - GetSmart   Цитата(_Pasha @ Oct 15 2009, 21:12) Кодvo...   Oct 16 2009, 21:20
||- - dxp   Цитата(AHTOXA @ Oct 16 2009, 22:44) Всё р...   Oct 17 2009, 05:31
||- - AHTOXA   Цитата(dxp @ Oct 17 2009, 11:31) Если он ...   Oct 17 2009, 08:49
||- - dxp   Цитата(AHTOXA @ Oct 17 2009, 15:49) Если ...   Oct 17 2009, 12:46
||- - AHTOXA   Цитата(dxp @ Oct 17 2009, 18:46) P.S. Что...   Oct 17 2009, 14:14
|- - GetSmart   Цитата(dxp @ Oct 16 2009, 09:52) Да? А во...   Oct 16 2009, 10:15
|- - dxp   Цитата(GetSmart @ Oct 16 2009, 17:15) Под...   Oct 16 2009, 13:08
|- - GetSmart   Цитата(dxp @ Oct 16 2009, 19:08) А где на...   Oct 16 2009, 13:29
|- - GetSmart   Цитата(dxp @ Oct 16 2009, 19:08) Речь не ...   Oct 16 2009, 14:29
|- - _Pasha   Цитата(GetSmart @ Oct 16 2009, 17:29) Это...   Oct 16 2009, 19:18
- - GetSmart   Дайте _Pashе медаль. И ещё одну, за занудство   Oct 15 2009, 15:22
- - ARV   имхо, профессионалу наплевать, как обозвать структ...   Oct 16 2009, 04:33
|- - dxp   Цитата(ARV @ Oct 16 2009, 11:33) имхо, пр...   Oct 16 2009, 06:24
|- - GetSmart   Цитата(dxp @ Oct 16 2009, 12:24) Угу. Дав...   Oct 16 2009, 10:24
- - GetSmart   Спрашивается - зачем так настойчиво выяснять разли...   Oct 18 2009, 03:17
- - dxp   Цитата(GetSmart @ Oct 18 2009, 10:17) Спр...   Oct 18 2009, 04:07
- - GetSmart   Цитата(dxp @ Oct 18 2009, 10:07) Путаница...   Oct 18 2009, 06:32


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01539 секунд с 7
ELECTRONIX ©2004-2016