Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
Результаты опроса: Ну кто так считает:
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Если каждую итерацию разом
Согласен с утверждением 3 42.86%
Не согласен с утверждением 4 57.14%
Голосовавшие: 7. Вы ещё не голосовали в этом опросе

 
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.78
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Процедурный тип - C++

12.02.2010, 06:04. Просмотров 6817. Ответов 44
Метки нет (Все метки)

Не заню, как в c++, в других языках есть понятие "процедурный тип". Процедурным типом называется тип указателя на подпрограмму. Для object pascal есть рекомендация, как описывать такие типы:
при описании процедурного типа, после его имени и знака равенства пишут оператор procedure или function в зависимости от типа подпрограммы, далее в скобках описывают формальные параметры, как в заголовке подпрограммы, причём, имена параметров указываются, но значения не имеют, а имя самой подпрограммы опускается, в типе указателя на функцию после закрывающей скобки указывается тип возвращаемого значения. А для c++ кто нибудь может дать подобную рекомендацию, чтоб прочитать и под любой прототип функции быстро, но качественно слепить процедурный тип? Пример:
Delphi
1
2
3
4
5
6
7
8
9
function f1(x:integer):integer;
begin
        if x>0 then f1:=f1*(x-1) else f1:=1;
end;
function f2(x:integer):integer;
begin
        f2:=x*x;
end;
type a=function (x:integer):integer;
Delphi
1
2
3
4
5
6
var d:a;
e:integer;
begin
       d:=f1;
       e:=d(4);
end;
. Здесь a - процедурный тип. В данном случае, тип указателя на целую функцию с одним целым параметром. Как это делать на c++? Запостите сюда правило + пример.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2010, 06:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Процедурный тип (C++):

Процедурный тип на функцию содержащую указатель на массив - C++
void WriteEl(stack (*temp), float qwerty, int kol) помогите описать указатель на процедуру :(

тип cout-a ostrieam? соответствено тип cin-a istream? - C++
тип cout-a ostrieam? соответствено тип cin-a istream?

Восьмибитный тип переменной (что за тип, но не BYTE и не CHAR? - C++
Вроде давно занимаюсь программированием на С++, но встала проблема... Есть некий массив переменных имеющих 8 битный размер... без знака...

Какой символьный тип использует тип std::string? - C++
Какой тип данных использует класс String? Char? И написано ли это в в документе #include <string>?

Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? - C++
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не...

Узнать тип значения, зная тип указателя - C++
Здравствуйте! Есть такой код: template<class Iter> void func(Iter first, Iter last) { //... Iter_value_type = *first;...

44
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:28 #16
Поясняю как происходит вызов функции:
masf[0](20) ; //вызывается 1 функция
masf[1](20); //вторая
masf[3](20); //третья

Запомни прототип указателя, должен совпадать с прототипом функции: адрес которой он собирается хранить.
Прототип это возвращаемое знач и параметры.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2010, 09:34  [ТС] #17
Цитата Сообщение от Genius Ignat Посмотреть сообщение
C++
1
typedef int(*p[3])(int); //массив указателей на функции
Толку от такого типа нет совсем:
C++
1
2
3
4
typedef int(*p3[3])(int);
typedef int (*p40[20])(int);
typedef int (*p40[40])(int);
typedef int (*p2[2])(int);
и т.д. объявляешь тип для каждого массива и потом гадаешь, как всё это упорядочить, если вдруг число элементов начнёт меняться.

Добавлено через 58 секунд
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Запомни прототип указателя, должен совпадать с прототипом функции: адрес которой он собирается хранить.
Это я знаю.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:37 #18
taras atavin:
Я сомневаюсь, что количество функций растёт во время выполнения программы,
или ты не логично хочешь напихивать массив адресам одно и той же функции.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2010, 09:50  [ТС] #19
Цитата Сообщение от Genius Ignat Посмотреть сообщение
p masf = {&myfunc1,&myfunc2,&myfunc3};
А это вообще не понятно, зачем. Процедурный тип нужен для того, чтобы можно было менять функцию во время исполнения программы. Представь себе калькулятор с функциональными кнопками, флажками и т.д. при использовании которых должны меняться функции основных кнопок. Обработчик кнопки вызывает
C++
1
p[2][1]();
,
C++
1
p[3][4])();
, где индексы определяются положением кнопок. Как поменять функцию? Правильный ответ:
C++
1
p[3][4]=f1;
в обработчике одного флага и
C++
1
p[3][4]=f2;
- другого. А ты что предлагаешь?
C++
1
2
3
4
5
6
switch (Mode)
{
 case 1:return p1[3][4]();
 case 2:return p2[3][4]();
 case 3:return p3[3][4]();
}
. Где сдесь полиморфизм? Зачем вообще понадобились указатели? Тогда уж проще по именам.

Добавлено через 1 минуту
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Я сомневаюсь, что количество функций растёт во время выполнения программы,
Не во время выполнения, а просто несколько массивов с разным числом функций и мо мере разработки начинаешь соображать, что 20 надо поменять на 18, 40 на 50 и т.д.

Добавлено через 1 минуту
Цитата Сообщение от Genius Ignat Посмотреть сообщение
или ты не логично хочешь напихивать массив адресам одно и той же функции.
Такую глупость я не смог сморозить. Надо в "наглядные пособия" запостить.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
C++
1
2
3
4
typedef int(*p3[3])(int);
typedef int (*p40[20])(int);
typedef int (*p40[40])(int);
typedef int (*p2[2])(int)
;
имеется ввиду:
C++
1
2
3
4
typedef int(*p3[3])(int);
typedef int (*p20[20])(int);
typedef int (*p40[40])(int);
typedef int (*p2[2])(int)
;
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:50 #20
//Компакт полиморфизм: я его называю мини полиморфизм
int i;
for(i=0;i<3;i++)masf[i](20); //вызываем очередную функцию через массив указателей.

И попробуй вызвать каждую функцию в цикле по каждому имени.
Условие: Три вызова сразу в теле делать нельзя нельзя.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2010, 09:56  [ТС] #21
А это нафига? Зачем мне последовательно вызывать несколько функций? Функция всегда нужна одна.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:56 #22
switch (Mode)
{
case 1:return p1[3][4]();
case 2:return p2[3][4]();
case 3:return p3[3][4]();
}
. Где сдесь полиморфизм? Зачем вообще понадобились указатели? Тогда уж проще по именам.
Однозначно здесь нет.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2010, 09:58  [ТС] #23
Что ты и предлагаешь под видом полиморфизма.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 10:02 #24
нужна одна.
Тогда о полиморфизме говорить не стоит.

Добавлено через 3 минуты
Представь себе калькулятор с функциональными кнопками, флажками и т.д. при использовании которых должны меняться функции основных кнопок. Обработчик кнопки вызывает.
Такие операции можно произвести и без массива указателей.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2010, 10:03  [ТС] #25
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Тогда о полиморфизме говорить не стоит.
Как ты умудрился сделать такой вывод? Функция всегда нужна одна, но каждый раз функция может быть нужна разная. Ты же предлагаешь вызывать каждый раз несколько функций, причём, одних и тех же. Так как функции одни и теже, то полиморфизмом как раз не пахнет, а из-за вызова нескольких функций бестолку гоняется стек. Результат: на долю процента сокращается скорость счёта (производительность программы) и больше ни каких эффектов.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 10:10 #26
Полиморфи́зм (в языках программирования) — взаимозаменяемость функций или объектов с функциями с одинаковым интерфейсом.

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

Добавлено через 3 минуты
А с чего ты взял, что это пример какой то серьезной программы: это демонстрация полиморфного поведения.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2010, 10:11  [ТС] #27
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Такие операции можно произвести и без массива указателей.
Можно свичем. Но свичи придётся повторять во всех кнопках, а в кнопке "=" свич становится совсем уж гигантским, так как для неё функциональными будут все кнопки, да ещё от нормальных функциональных появляются комбинации. А если ещё несколько кнопок, выполняющих вычисления, зависящие от других кнопок, то этот свич многократно дублируется. Если при этом надо не тупо несколько равенств, а какие-то модификации, то даже выносом свича в специальную функцию ситуацию не исправишь. А так переписал указатели и никаких гвоздёв.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 10:12 #28
У меня есть интересные программы, но выкладывать их здесь, я не вижу выгоды.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2010, 10:15  [ТС] #29
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Полиморфи́зм (в языках программирования) — взаимозаменяемость функций или объектов с функциями с одинаковым интерфейсом.
Вот именно. А вовсе не зацикливание одинаковых функций в фиксированную последовательность. Заменяемость, а не вызов вместо одной функции, всех с тем же интерфейсом.

Добавлено через 57 секунд
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».
А не "одна реализация интерфейса сразу ко всем функциям с одним прототипом".

Добавлено через 1 минуту
Цитата Сообщение от Genius Ignat Посмотреть сообщение
А с чего ты взял, что это пример какой то серьезной программы
Я такого не говорил.
Цитата Сообщение от Genius Ignat Посмотреть сообщение
это демонстрация полиморфного поведения
Поведение как раз изоморфно.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 10:15 #30
Ладно короче не буду тему раздувать: спорить и т.д.
0
12.02.2010, 10:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2010, 10:15
Привет! Вот еще темы с ответами:

Как сконвертировать свой тип в тип double? - C++
Можно ли конвертировать свой тип в тип doble? Если да, то каким способом?

Не могу преобразовать тип char в тип double - C++
Вся загвоздка в str1 и str2; #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include&quot;stdlib.h&quot; #include &quot;cstdlib&quot; #include &lt;iostream&gt; ...

Перечисляемый тип данных.Символьный тип. - C++
1.type месяц = ( янв, фев, мар, апр, май, июн, июл, авг, сен, окт, ноя, дек ); год = (високосный, невисокосный); var d:28..31;...

clrscr(); не определен данный тип и const MAX_ELEMENTS = 4; отсутсвует тип int когда я его туда вписываю у меня больше ошибок вылазит - C++
#include &quot;stdafx.h&quot; #include &lt;ctime&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int main() { const MAX_ELEMENTS = 4; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru