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

 
 
> Непонятный 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
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 43)
GetSmart
сообщение Oct 15 2009, 11:33
Сообщение #2


.
******

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



Цитата(Harvester @ Oct 15 2009, 17:30) *
И никак не могу понять, что же из себя представляет переменная h, объявленная как
Код
sys_timeout_handler h;


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

Подсказка:
h - указатель на процедуру без типа: procedure(void *arg), где "procedure" - может быть любым именем.

Сообщение отредактировал GetSmart - Oct 15 2009, 11:35


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


Местный
***

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



Цитата(GetSmart @ Oct 15 2009, 14:33) *
Подсказка:
h - указатель на процедуру без типа: procedure(void *arg), где "procedure" - может быть любым именем.

Спасибо огромное


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 15 2009, 11:50
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(GetSmart @ Oct 15 2009, 15:33) *
h - указатель на процедуру без типа

На что, простите?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 15 2009, 11:52
Сообщение #5


.
******

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



Цитата(andrew_b @ Oct 15 2009, 17:50) *
На что, простите?

процедуру/функцию без возваращаемого типа = просто на процедуру smile.gif


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


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Цитата(Harvester @ Oct 15 2009, 14:30) *
Столкнулся вот с таким переопределением типа:

может будет полезно - http://unixwiz.net/techtips/reading-cdecl.html
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 15 2009, 12:04
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(GetSmart @ Oct 15 2009, 15:52) *
процедуру/функцию без возваращаемого типа = просто на процедуру smile.gif
В языке Си нет понятия "процедура".


Go to the top of the page
 
+Quote Post
kurtis
сообщение Oct 15 2009, 12:08
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Цитата(andrew_b @ Oct 15 2009, 15:04) *
В языке Си нет понятия "процедура".

Чем понятие "процедура" разительно отличается от понятия "функция" ?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 15 2009, 12:10
Сообщение #9


.
******

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



Цитата(andrew_b @ Oct 15 2009, 18:04) *
В языке Си нет понятия "процедура".

Не знал lol.gif


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


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Давным-давно в паскале процедурой называлась функция, которая не возвращает переменных, ключевый слова разные были..
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 15 2009, 12:31
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Flexz @ Oct 15 2009, 15:12) *
Давным-давно в паскале процедурой называлась функция, которая не возвращает переменных, ключевый слова разные были..

Поклоники кошерных функций считают, что функции, в отличие от процедур, еще не должны получать параметры по ссылкам.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 15 2009, 12:36
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(GetSmart @ Oct 15 2009, 16:10) *
Не знал lol.gif
К чему этот смайл?

Цитата(Flexz @ Oct 15 2009, 16:12) *
Давным-давно в паскале процедурой называлась функция, которая не возвращает переменных, ключевый слова разные были..
Мы же вроде не о Паскале говорим.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 15 2009, 12:55
Сообщение #13


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Да все знают. И ответ топикстартеру был понятен.
Просто придрались к слову, потому и смайл

P.S. Sorry, не сдержался.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 15 2009, 13:07
Сообщение #14


.
******

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



Цитата(andrew_b @ Oct 15 2009, 18:36) *
К чему этот смайл?

Дорогой andrew_b, понятия процедуры и функции есть во всех языках программирования. По сути это одно и то же понятие, только отличаются возвратом переменной (типа). В паскале есть даже индивидуальные ключевые слова для этих понятий, в си нет именно ключевых слов, но понятия есть.


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


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(GetSmart @ Oct 15 2009, 17:07) *
Дорогой andrew_b, понятия процедуры и функции есть во всех языках программирования.
Речь идёт конкретно про Си. Реквестирую цитату из стандарта Си, где определяется "процедура".
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 15 2009, 13:42
Сообщение #16


.
******

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



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

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


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


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(sigmaN @ Oct 15 2009, 15:55) *
Да все знают. И ответ топикстартеру был понятен.

Только про ответ- на нормальном языке это должно быть так:
h - указатель на функцию без возвращаемого значения с одним аргументом в виде (void *arg)
т.е.
Код
void somefunc(void *param);// объявили
.................................................................
sys_timeout_handler h;
int main(void)
{
h = &somefunc;
........BUBUBU.....
h(NULL);
}

пардон за занудство, но иногда это уместно.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 15 2009, 15:22
Сообщение #18


.
******

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



Дайте _Pashе медаль. И ещё одну, за занудство smile.gif


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


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(andrew_b @ Oct 15 2009, 17:23) *
Речь идёт конкретно про Си. Реквестирую цитату из стандарта Си, где определяется "процедура".
Вы же умный человек. Зачем за слова цепляться. В Си процедура и функция - едино, как любовь и Родинаsmile.gif Русский язык богат на синонимы. А слышали вы когда-нибудь о термине "процедурный тип программирования"? Да стандарт написан на английском языке и что... Они, когда о грудном ребёнке говорят, используют It (оно) - нас же коробит. Нужна адаптация. Я вот недавно в книжном магазине был, предварительно прочитав книгу Роберта Хайнлайна "Чужак в чужой стране", так теперь на полках стоят и "Чужак в чужой земле" и "Чужак в стране чужой" - так я не могу их читать после оригинала. Тут есть о чём поспорить, пообсуждать, остальное - "пыль для моряка"...
Цитата(GetSmart @ Oct 15 2009, 19:22) *
Дайте _Pashе медаль. И ещё одну, за занудство smile.gif
Агаsmile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 16 2009, 03:52
Сообщение #20


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
ARV
сообщение Oct 16 2009, 04:33
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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

кстати, наличие разной терминологии для описания одного и того же явления как раз порождается именно желанием выделиться из общей массы. ООП, если я не ошибаюсь, пошло не от С++, а от смолтока (smalltalk) - казалось бы: все последующие "производные" ООП-языков должны использовать "классическую" терминологию - ан нет, каждый норовит ввести нечто свое... ничего при этом не меняя по сути.

Зри в корень! © К.Прутков

P.S. Когда нечего сказать - спроси: "а где в стандарте это прописано?" - дискуссия гарантирована smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 16 2009, 06:24
Сообщение #22


Adept
******

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



Цитата(ARV @ Oct 16 2009, 11:33) *
имхо, профессионалу наплевать, как обозвать структурную единицу - процедурой, методом, функцией... он понимает суть.

Угу. Давайте транзисторы называть триодами (это даже короче), компиляторы языков С/C++ - трансляторами (а чем плохо?), процессоры - микросхемами (и таких встречал). Веселое будет общение. Попробуйте хотя бы с транзисторами. biggrin.gif

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

Цитата(ARV @ Oct 16 2009, 11:33) *
а пытающийся выглядеть профессионалом аппелирует к строгой терминологии, из-за отсутствия которой у него могут быть проблемы с пониманием сути.

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

Цитата(ARV @ Oct 16 2009, 11:33) *
кстати, наличие разной терминологии для описания одного и того же явления как раз порождается именно желанием выделиться из общей массы. ООП, если я не ошибаюсь, пошло не от С++, а от смолтока (smalltalk) - казалось бы: все последующие "производные" ООП-языков должны использовать "классическую" терминологию - ан нет, каждый норовит ввести нечто свое... ничего при этом не меняя по сути.

Класс! Да будет вам известно, что в языке SmallTalk абсолютно все основано на ОПП, и там любая функция объекта является виртуальной, т.е. является методом. В то время как в языке C++, виртуальными являются только функции, специально объявленные с квалификатором virtual, и они - да, являются методами, но все остальные нестатические функции-члены классов являются просто обыкновенными функциями-членами и никакими методами не являются. И называть их методами - есть проявление безграмотности.

Можете сами сделать вывод о связи терминологии с профессионализмом. biggrin.gif


Цитата(ARV @ Oct 16 2009, 11:33) *
Зри в корень! © К.Прутков

Вот именно!

Цитата(ARV @ Oct 16 2009, 11:33) *
P.S. Когда нечего сказать - спроси: "а где в стандарте это прописано?" - дискуссия гарантирована smile.gif

Когда нечего сказать по сути, лучше помолчать. А стандарты придуманы не для любителей флуда, а для людей, которые хотят общаться на одном языке. Адекватное владение терминологией в любой области - основа профессионализма.


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


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

Группа: Свой
Сообщений: 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
Сообщение #24


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
Сообщение #25


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

Группа: Свой
Сообщений: 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
Сообщение #26


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
GetSmart
сообщение Oct 16 2009, 10:15
Сообщение #27


.
******

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



Цитата(dxp @ Oct 16 2009, 09:52) *
Да? А вот в языке Verilog, например, есть function и task, процедуров не завезли. sad.gif Как быть?

Сэкономили smile.gif
Цитата(dxp @ Oct 16 2009, 09:52) *
Нет в языке С процедур. Есть только функции. Это вопрос о терминах. Если хотите, чтобы вас однозначно понимали в какой-то предметной области, будьте добры корректно употреблять легальные устоявшиеся термины. В языке программирования С нет процедур. И в языке программирования С++ нет процедур.
...
Проблема растет из недостаточного знания матчасти и/или небрежного отношения мелочам. И это зря. "Профессионал отличается от любителя отработкой мелочей" (с).

Поддерживаю тезис ARV, что профессионал видит в первую очередь суть.

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


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


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

Группа: Свой
Сообщений: 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
GetSmart
сообщение Oct 16 2009, 10:24
Сообщение #29


.
******

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



Цитата(dxp @ Oct 16 2009, 12:24) *
Угу. Давайте транзисторы называть триодами (это даже короче), компиляторы языков С/C++ - трансляторами (а чем плохо?), процессоры - микросхемами (и таких встречал).

Не передёргивайте. Я не назвал по-другому. Я дифференцировал термин. Я не процессор назвал микросхемой, а микросхему - процессором, в случае когда в стандарте есть только один термин "микросхема".


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


Adept
******

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



Цитата(GetSmart @ Oct 16 2009, 17:15) *
Поддерживаю тезис ARV, что профессионал видит в первую очередь суть.

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

Цитата(GetSmart @ Oct 16 2009, 17:15) *
Вы когда вызываете "процедуру" написанную к примеру на асме или ещё на чём в "ступор" не входите?

А где на асме процедуры? Что там понимается под процедурой? Сначала определите термины четко, потом на их основе излагайте информацию. На асме такого рода терминов вообще мало. То, что вы подразумеваете под "процедурой" на асме называется, как правило, "подпрограммой" (subroutine). Это куда более уместный термин. И более устоявшийся. Надо полагать, по этой самой причине.

Цитата(GetSmart @ Oct 16 2009, 17:15) *
Не стану критиковать создателей Си за кастрацию, но лично я, уж точно не чайник в программировании, намеренно дифференцирую процедуры и функции. И меня немного коробит (хотя иногда пользуюсь) когда применяют функцию (именно функцию), а результат никуда не используют.

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

Цитата(GetSmart @ Oct 16 2009, 17:15) *
Во всяком случае эта ситуация обращает на себя внимание на подсознательном уровне. И я даже рад, что меня в вузе учили именно разделять алгоритмические еденицы на процедуры и функции. В этом есть смысл. Во всяком случае я знаю достаточно хорошо и Си и Паскаль и не впадаю в ступор, когда одна и та же алг. еденица называется в стандартах разных языков по-разному.

Речь не о ступоре, а о некорректном использовании терминов, что вносит просто путаницу и затрудняет восприятие/общение. Люди оперируют понятиями. Понятие - это однозначное отображение образа и его лексического выражения (т.е. словами). Когда человек слышит слово (словосочетание), то в его мозгу происходит процесс поиска соответствующего образа - если образ найден, то возникает понимание слова. Если образ не найден или обнаружена неоднозначность - т.е. найдено более одного образа и выбор не произведен, то понимания не возникает. Кстати, слово "сообразить", смысл которого вполне ясен, как раз и отражает этот процесс - когда образ уловил, так сразу и понимание возникло, что это слово и обозначает.

Пример. Слово "лук". Это что? Лук репчатый? Или лук для стрельбы? Поэтому всегда важен контекст, на основе которого и происходит выборка правильного образа - в кулинарной книге образ будет один, а в книжке про Робина Гуда - второй.

В нашем случае, если слово "процедура" употребляется в контексте языка Паскаль, то у меня оное слово вызывает образ вызываемого исполняемого кода, не возвращающего значения. В контексте языка С/C++ слово "процедура" вызывает совсем иной образ - например, "процедура обмена сигнатурами..." или "процедура подготовки данных...", т.е. это обозначение алгоритмической единицы, но не языка, а непосредственно алгоритма программы.

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

У вас процесс восприятия происходит точно так же, как у всех:

Цитата(GetSmart @ Oct 16 2009, 17:15) *
Во всяком случае эта ситуация обращает на себя внимание на подсознательном уровне.


Т.е. как раз и ищется соответствие слова и образа. Только вот контекст в некоторых случаях выбран неверно - при рассмотрении вопросов программирования на С, контекст восприятия у вас паскальный.


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


.
******

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



Цитата(dxp @ Oct 16 2009, 19:08) *
А где на асме процедуры? Что там понимается под процедурой? Сначала определите термины четко, потом на их основе излагайте информацию. На асме такого рода терминов вообще мало. То, что вы подразумеваете под "процедурой" на асме называется, как правило, "подпрограммой" (subroutine). Это куда более уместный термин. И более устоявшийся. Надо полагать, по этой самой причине.

Введите в гугле "процедуры в языке си" и зачитайтесь smile.gif Особенно первой ссылкой
http://www.codenet.ru/progr/cpp/qc/
Цитата
Quick C - Компилятор с языка СИ фирмы Микрософт
Вызов процедур на языке Ассемблер из языка СИ. С.3. Вызов языка СИ из языка Ассемблер. С.4. Сегментная модель фирмы Microsoft. ...
www.codenet.ru/progr/cpp/qc/ - Сохранено в кэше - Похожие


Сообщение отредактировал GetSmart - Oct 16 2009, 13:33


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


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
GetSmart
сообщение Oct 16 2009, 14:29
Сообщение #33


.
******

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



Цитата(dxp @ Oct 16 2009, 19:08) *
Речь не о ступоре, а о некорректном использовании терминов, что вносит просто путаницу и затрудняет восприятие/общение.
Это скорее на совести авторов терминологии языка Си, т.к. именно они расширили термин "функция" (в корыстных целях, кстати) на ситуацию когда она может не возвращать результат. В общем смысле этого понятия результат обязателен.

Цитата(dxp @ Oct 16 2009, 19:08) *
В нашем случае, если слово "процедура" употребляется в контексте языка Паскаль, то у меня оное слово вызывает образ вызываемого исполняемого кода, не возвращающего значения. В контексте языка С/C++ слово "процедура" вызывает совсем иной образ - например, "процедура обмена сигнатурами..." или "процедура подготовки данных...", т.е. это обозначение алгоритмической единицы, но не языка, а непосредственно алгоритма программы.

И когда в этом контексте излагающий под "процедурой" имеет в виду паскальную процедуру, то это вызывает неоднозначность, и приходится тратить дополнительные усилия на то, чтобы по дополнительным элементам контекста понять, что в данном случае имелось в виду - часть алгоритма или элемент языка программирования. Ну, и зачем это? Ведь это не что иное как намеренное (пусть в большинстве случаев и неосознанное) внесение путаницы безо всякой причины.

Нету тут никакой путаницы у профессионалов. И у вас в данных примерах всё корректно соотносится с понятием процедуры. Можете назвать свои образы даже "функция обмена сигнатурами..." или "функция подготовки данных...". Для вас это было бы даже логичней. Но нет, вы называете эти еденицы именно процедурами, т.к. результата они не возвращают, а только выполняют некий алгоритм.

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

Цитата(dxp @ Oct 16 2009, 19:41) *
Это лишь доказывает, что вы не один попали под влияние Паскаля. biggrin.gif К тому же, надо делать скидку, что переводы тоже делают люди. Не случайно А.С.Пушкин называл переводчиков "подставными лошадьми истории". smile.gif Ну, и в конце концов, мало ли что пишут на заборах. Мы тут серьезно разговариваем, т.ч. давайте апеллировать к серьезным источникам, коими являются Стандарт языка и его автор[ы].

Какие нафик заборы? Речь идёт о Майкрософте! "Quick C - Компилятор с языка СИ фирмы Микрософт"

Цитата(dxp @ Oct 16 2009, 19:41) *
К тому же, надо делать скидку, что переводы тоже делают люди.

А оригиналы пишут Боги biggrin.gif Если Бог сказал - функция, значит хоть убейся, но это будет функция, даже если это процедура smile.gif

Сообщение отредактировал GetSmart - Oct 16 2009, 14:30


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


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

Группа: Свой
Сообщений: 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
_Pasha
сообщение Oct 16 2009, 19:18
Сообщение #35


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(GetSmart @ Oct 16 2009, 17:29) *
Это скорее на совести авторов терминологии языка Си, т.к. именно они расширили термин "функция" (в корыстных целях, кстати) на ситуацию когда она может не возвращать результат. В общем смысле этого понятия результат обязателен.

Сформулируйте тогда альтернативное понятие (свободное от навязанных си и паскалем). Правда,оч интересно.
ЗЫ: медаль съел(обе), спасибо, невкусно smile.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 16 2009, 21:20
Сообщение #36


.
******

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



Цитата(_Pasha @ Oct 15 2009, 21:12) *
Код
void somefunc(void *param);// объявили
.................................................................
sys_timeout_handler h;
int main(void)
{
h = &somefunc;
........BUBUBU.....
h(NULL);
}

Заберите у _Pashи медаль smile.gif Он накосячил в вызове функции/процедуры по указателю. Надо так:

Код
int main(void)
{
h = &somefunc;
........BUBUBU.....
(*h)(NULL);
}


Цитата(_Pasha)
Сформулируйте тогда альтернативное понятие (свободное от навязанных си и паскалем). Правда,оч интересно.

Да нормально всё определено в Паскале. Вирту - респект. Мне такая дифференциация очень помогает в работе. Но навязывать что-то другим не собираюсь. В общении с особо озабоченными сишниками буду стараться говорить на их "языке". Не факт что получится smile.gif Но в моих мозгах понятия процедуры и функции никогда не сольются в одно общее понятие функции.

Сообщение отредактировал GetSmart - Oct 16 2009, 21:57


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


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

Группа: Свой
Сообщений: 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
dxp
сообщение Oct 17 2009, 05:31
Сообщение #38


Adept
******

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



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

Если он одинаков у неких разных объектов, то просто это означает, что некоторые производные классы используют родительский метод. Но никто и ничто не мешает какому-нибудь из производных переопределить свой способ реализации - и него будет уже свой метод выполнить действие "move".


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

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

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

Если это просто самостоятельное действие - то так и называть надо. Термин "метод" не просто так введен, в этом есть определенный смысл. Если не нравится длинное название "функция-член", ну придумай более адекватный термин - например, "действие". Не очень красивое слово в данном контексте, но зато точно отражает суть - действие, выполняемое в контексте класса.

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

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


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


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

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



Цитата(dxp @ Oct 17 2009, 11:31) *
Если он одинаков у неких разных объектов, то просто это означает, что некоторые производные классы используют родительский метод.

Да!
Цитата
Но никто и ничто не мешает какому-нибудь из производных переопределить свой способ реализации - и него будет уже свой метод выполнить действие "move".

Если метод не объявлен виртуальным, то у них ничего не выйдетsmile.gif
Давай я так скажу - виртуальные методы - те, которые потомки могут изменить, невиртуальные - которые не должны меняться. В этом состоит гибкость наследования. Но и те и другие - методы.
То есть, разработчик базового класса управляет возможностью переопределения методов этого класса.
Скажем, есть метод AddRef() у хитрого указателя. Его переопределять опасно, он должен действовать одинаково для всех потомков. Поэтому он будет невиртуальным. Но ведь он не перестанет от этого быть методом?

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

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

Цитата
Если это просто самостоятельное действие - то так и называть надо. Термин "метод" не просто так введен, в этом есть определенный смысл. Если не нравится длинное название "функция-член", ну придумай более адекватный термин - например, "действие". Не очень красивое слово в данном контексте, но зато точно отражает суть - действие, выполняемое в контексте класса.


smile.gif Мы же с тобой сейчас заняты не изобретением новой терминологии. а выяснением существующей. Той. что применяется сейчас.

Цитата
Что касается ссылок на книжки, то в том-то и беда, что много людей, которые даже давно пользуются многими средствами С++ (в том числе и ООП), оказываются не знакомыми с нюансами обсуждаемой терминологии. sad.gif


То есть, все неправы? smile.gif Книжки вроде очень уважаемые. Я вчера ещё у Александреску нашёл употребление слова метод по отношению к невиртуальной функции.

По-моему, единственное упоминание у Страуструпа (причём очень нечёткое) не тянет на устоявшуюся терминологию.

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


Во-первых, где это чёткое определение? Приведи пожалуйста. А во-вторых, почему это чёткое определение относится только к виртуальным функциям С++? Невиртуальные функции разве не наследуются? Разве они не являются точно таким же механизмом ООП?


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


Adept
******

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



Цитата(AHTOXA @ Oct 17 2009, 15:49) *
Если метод не объявлен виртуальным, то у них ничего не выйдетsmile.gif

Конечно! Потому, что если функция не виртуальная - то это не метод!

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
Давай я так скажу - виртуальные методы - те, которые потомки могут изменить, невиртуальные - которые не должны меняться. В этом состоит гибкость наследования. Но и те и другие - методы.

Виртуальные методы - это масло масленное. smile.gif Если функция гарантировано не переопределяется, то это не метод для потомка, это просто унаследованный код. Методом оно станет только тогда, когда потомок имеет возможность реализовать эту функцию своим способом - т.е. у него свой способ = метод, отличающийся от споcоба/метода родителя.

Например:

Код
class TSlon
{
public:
    ...
    void set_data(int x);
    virtual void set_request() { if(...) PORT0 ^= ...;}
    ...
};


class TMamont : public TSlon
{
public:
    ...
    int blink_led();
    virtual void set_request() { for(...) { ... } }
    ...
}


Ну, и какие же TSlon::set_data и TMamont::blink_led методы, если у них целевое назначение совершенно разное? Они - просто разнокачественный код. Обычный код, никак не связанный между собой по смыслу. А вот их виртуальные функции set_request - это функции, которые имеют одинаковое целевое назначение (сделать запрос), но способ реализации этого у них совершенно разный. Методы достижения разные. Поэтому они - методы.

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
То есть, разработчик базового класса управляет возможностью переопределения методов этого класса.
Скажем, есть метод AddRef() у хитрого указателя. Его переопределять опасно, он должен действовать одинаково для всех потомков. Поэтому он будет невиртуальным. Но ведь он не перестанет от этого быть методом?

Перестает. Потому, что тут нету никакого способа/метода. Есть просто статический код, который не меняется во всей иерархии.


Цитата(AHTOXA @ Oct 17 2009, 15:49) *
Почему не связанный? Он очень даже связан. Он может вызывать другие виртуальные методы в нужном порядке. Он может обеспечивать общую для всей иерархии логику. Он - метод, просто неизменяемый, инвариантный. И это не метод реализации (это уже немного другая область, и другой термин), а метод класса. В смысле - действе.

Вдумайся в смысл слов "метод" и "действие". Чувствуешь разницу? smile.gif Вот "действие" - адекватное обозначение для термина "функция-член". А "метод" - это всегда по смыслу способ. А не действие.

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
Что касается "метода реализации" - это уже другая область, типа паттерны проектирования.

Э, нет. Паттерн проектирования - это совокупность приемов, применяемых для достижения. В некотором смысле это - да, метод, но это не метод реализации общего для родственных классов действия, а метод - способ, достигающий с помощью определенных организационно-программыных подходов нужного результата.

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
То есть, все неправы? smile.gif Книжки вроде очень уважаемые.

В этом вопросе, к сожалению, да. Программисты, там, может, и сильные, но ООП - это отдельная кухня, там свои правила. И не самая часто применяемая парадигма в С++. Все применяется к месту.

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
Я вчера ещё у Александреску нашёл употребление слова метод по отношению к невиртуальной функции.

В оригинальном тексте или в переводе?

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
По-моему, единственное упоминание у Страуструпа (причём очень нечёткое) не тянет на устоявшуюся терминологию.

Устоявшаяся она в ООП. Оттуда и ноги растут. И в контексте С++ мнение Страуструпа вполне перетягивает все остальное. smile.gif

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
Во-первых, где это чёткое определение? Приведи пожалуйста. А во-вторых, почему это чёткое определение относится только к виртуальным функциям С++?

Ты сам нарыл его в педивикии. smile.gif Копать надо в источниках по ОО, а не в просто книжках по С++, где и ООП-то рассматривается весьма поверхностно.

Цитата(AHTOXA @ Oct 17 2009, 15:49) *
Невиртуальные функции разве не наследуются? Разве они не являются точно таким же механизмом ООП?

Наследуются. Но механизмом ООП не являются. Механизмы ООП ориентированы на возможности управления множеством разных объектов единообразным способом, и базируется такая возможность на "родственности" этих разных объектов. Обычные невиртуальные функции-члены тут мимо кассы.

P.S. Что-то мне думается, что дискуссия на эту тему вряд ли кому-то еще тут интересно. Поэтому, дабы не захламлять форум, предлагаю перенести обсуждение в асю/джаббер. smile.gif Ты как?


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


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

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



Цитата(dxp @ Oct 17 2009, 18:46) *
P.S. Что-то мне думается, что дискуссия на эту тему вряд ли кому-то еще тут интересно. Поэтому, дабы не захламлять форум, предлагаю перенести обсуждение в асю/джаббер. smile.gif Ты как?

Ок smile.gif Написал в личку.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 18 2009, 03:17
Сообщение #42


.
******

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



Спрашивается - зачем так настойчиво выяснять различия между методом и функцией, если в хелпе компилятора по какому-либо классу будет список методов, в котором будут и невиртуальные "методы". Или хелпописатели тоже все чайники. Или это уже паранойя.

Если бы было принципиально называть виртуальные функции методами, то авторы обязательно бы на этом заострили внимание. Даже если не в первой версии стандарта, то в следующей. Но этого не делают и не собираются. Потому как принципиально ничего не изменится после этого. Единственное на что это влияет - на некий образ, который воображает программер. Правда этот же образ может выйти "боком" тому же программеру. Потому как будет "функция-класс" отдельным термином и "метод" отдельным термином, а собирательного термина не будет. Вот и трындец smile.gif

ЗЫ. И незачем в рот смотреть авторам терминологии. В их терминологии не факт, что всё гладко. Именно поэтому:
Цитата(ARV @ Oct 16 2009, 10:33) *
имхо, профессионалу наплевать, как обозвать структурную единицу - процедурой, методом, функцией... он понимает суть. а пытающийся выглядеть профессионалом аппелирует к строгой терминологии, из-за отсутствия которой у него могут быть проблемы с пониманием сути.


Сообщение отредактировал GetSmart - Oct 18 2009, 03:24


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


Adept
******

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



Цитата(GetSmart @ Oct 18 2009, 10:17) *
Спрашивается - зачем так настойчиво выяснять различия между методом и функцией, если в хелпе компилятора по какому-либо классу будет список методов, в котором будут и невиртуальные "методы". Или хелпописатели тоже все чайники. Или это уже паранойя.

Если бы было принципиально называть виртуальные функции методами, то авторы обязательно бы на этом заострили внимание. Даже если не в первой версии стандарта, то в следующей. Но этого не делают и не собираются. Потому как принципиально ничего не изменится после этого. Единственное на что это влияет - на некий образ, который воображает программер. Правда этот же образ может выйти "боком" тому же программеру. Потому как будет "функция-класс" отдельным термином и "метод" отдельным термином, а собирательного термина не будет. Вот и трындец smile.gif

ЗЫ. И незачем в рот смотреть авторам терминологии. В их терминологии не факт, что всё гладко. Именно поэтому:

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

Способность четко и однозначно излагать мысли - это культура мышления прежде всего, которую всегда полезно развивать. И проявление уважения к собеседникам.

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

На этом свое участие в данной дискуссии прекращаю. Всего вам хорошего. И всем спасибо. smile.gif


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


.
******

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



Цитата(dxp @ Oct 18 2009, 10:07) *
Путаница в словах является отражением путиницы в голове, хотя в большинстве случаев индивид этого и не осознает. Но главная проблема не в этом, а в том, что такой индивид, будучи под властью неверных стереотипов, считает свое мнение безальтернативно правильным. И это делает его необучаемым, а эту путаницу в голове и словах - устойчивой.

Путаница в словах так же является признаком того, что человек мыслит не словами, а образами. И уже вспешке "конвертируя" их в слова не всегда тратит время на их 100% совпадение. В то же время этот человек может замечать гораздо более тонкие нюансы относительно человека, мыслящего словами. Поэтому не факт, что этот стереотип верный:
Цитата(dxp @ Oct 18 2009, 10:07) *
"Кто ясно мыслит, ясно излагает" (с). Обратное тоже верно.

Хотя, если считать обратным == "Кто ясно мыслит, не всегда ясно излагает" => то я не спорю smile.gif

Цитата(dxp @ Oct 18 2009, 10:07) *
Но главная проблема не в этом, а в том, что такой индивид, будучи под властью неверных стереотипов, считает свое мнение безальтернативно правильным. И это делает его необучаемым, а эту путаницу в голове и словах - устойчивой.
Долой стереотипы! smile.gif

Цитата(dxp @ Oct 18 2009, 10:07) *
...дабы остальные участники сразу понимали смысл однозначно без необходимости включать дедуктивные способности.
Опять передёргиваете. Если автор темы и вопроса сразу же понял суть, то очевидно, что не было никакой двусмысленности или неопределённости. Во всяком случае, проблему создали авторы терминологии Си не обеспечив совместимости с другими языками. И даже то, что Си является одним из лучших языков не обязывает забывать дифференциацию процедур и функций. По крайней мере, если в Си этот термин свободный, то он наследует свойства от предыдущих языков smile.gif ООП smile.gif

Цитата(dxp @ Oct 18 2009, 10:07) *
На этом свое участие в данной дискуссии прекращаю. Всего вам хорошего. И всем спасибо. smile.gif

Вам тоже спасибо. Приятно пообщаться с умным человеком smile.gif

Сообщение отредактировал GetSmart - Oct 18 2009, 07:05


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:23
Рейтинг@Mail.ru


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