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

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

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

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

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

12.02.2010, 06:04. Просмотров 6892. Ответов 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
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 08:23 #2
Есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream.h>
int myfunc(int a){
cout<<a<<'\n';
return 0;
}
 
int main(){
int (*p)(int) = NULL ; //указатель на функцию возвращающую int и имеющую параметр int.
 
p = myfunc;         //берём адрес функции
p(20);                 //вызываем функцию через указатель.
 
return 0;
}
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
12.02.2010, 08:54  [ТС] #3
Мне надо описать именно тип. чтоб потом писать не
C++
1
int (*p)(int);
а
C++
1
TintF p;
. Как сделать именно так?
C++
1
2
typedef TintF (*)(int);
TintF p;
правильно? Или как?
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 08:59 #4
Вот правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream.h>
 
typedef int(*p)(int) ;
 
int myfunc(int a){
cout<<a<<'\n';
return 0;
}
 
int main(){
p pF= NULL ;
 
pF = myfunc;        
pF(20);             
 
return 0;
}
1
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
12.02.2010, 09:02  [ТС] #5
Спасибо. А как сформулировать правлило? Так что ли: "пишем typedef, тип возвращаемого значения, в скобках знак "*" и имя типа, потом в вторых скобках список типов параметров, опуская их имена"?
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:06 #6
Можно и так:
typedef int(*p)(int a);
Главное что в прототипе самой функции есть имена типов параметров.
В указатель можно написать и просто список типов.
1
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
12.02.2010, 09:10  [ТС] #7
Спасибо. Правило такое: "пишем typedef, тип возвращаемого значения, в скобках знак "*" и имя типа, потом в вторых скобках список параметров, при этом можно опустить их имена"?
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:10 #8
typedef int(*p)(int a);
Переводится это так указатель на функцию возвращающую int и имеющую один параметр int
кстати посмотри в код я исправил ошибку. Почему то её компилятор не заметил:
pF(20); вызов функции.
а было так p(20); //компилятор даже не заметил.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
12.02.2010, 09:12  [ТС] #9
Я сразу видел
C++
1
pF(20);
. А если б и с ошибкой, сразу бы понял, как это исправить.
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:15 #10
Может тебе показать как объявить массив указателей на функции.

Добавлено через 56 секунд
От него толку больше бывает: мини-полиморфизм
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
12.02.2010, 09:17  [ТС] #11
C++
1
TIntF p[200];
. Вопрос был только по описанию типа указателя, а как его юзить и комбинировать я и сам знаю.
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:18 #12
Не правильно.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
12.02.2010, 09:19  [ТС] #13
Кстати, я чаще всего юзю именно массивы указателей на подпрограммы, а не отдельные указатели. Но пока пользовался указателями на подпрограммы только на object pascal.
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.02.2010, 09:24 #14
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
#include <iostream.h>
 
typedef int(*p[3])(int);     //массив указателей на функции
 
int myfunc1(int a){
cout<<"myfunc1"<<'\n';
cout<<a<<'\n';
return 0;
}
 
int myfunc2(int a){
cout<<"myfunc2"<<'\n';
cout<<a<<'\n';
return 0;
}
 
int myfunc3(int a){
cout<<"myfunc3"<<'\n';
cout<<a<<'\n';
return 0;
}
 
 
int main(){
p masf = {&myfunc1,&myfunc2,&myfunc3}; //записываем адреса фукнций в массив
 
//Компакт полиморфизм: я его называю мини полиморфизм
int i;
for(i=0;i<3;i++)masf[i](20);       //вызываем очередную функцию через массив указателей.
//-------------------------------------------------------------------------------------------    
 
 
 
return 0;
}
Добавлено через 1 минуту
Как красивый эффект, стиль называется меньше кода больше дела,
или смена поведения программы в реальном времени.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
12.02.2010, 09:27  [ТС] #15
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Не правильно.
Тогда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef int (*TintF)(int);
typedef int (**TintFArray)(int a);
TIntFArray p=NULL;
p=new TintF[10];
p[0]=f1;
p[1]=f2;
p[2]=f3;
p[3]=f4;
p[4]=f5;
p[5]=f6;
p[6]=f7;
p[7]=f8;
p[8]=f9;
p[9]=f10;
. Можно ещё запихать указатель на указатель на функцию в закрытый член класса и перегрузить оператор [] и член Size.
0
12.02.2010, 09:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2010, 09:27
Привет! Вот еще темы с ответами:

Как сконвертировать свой тип в тип 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; ...


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

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

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