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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
#1

Как грамотно нтерпретировать ввод нового имени типа, введённого typedef - C++

16.04.2011, 14:32. Просмотров 1886. Ответов 38
Метки нет (Все метки)

Друзья! Дело в том, что вот такой вот код:
C++
1
typedef char  (*char6) [6];
И он значит, что

char6 есть указатель на строку из шести символов.

Это я прочёл в учебнике, то бишь вызубрил, но чуть более сложную конструкцию я сам разобрать не могу. Хотелось бы какой-то общий алгорим прочесть подобно тому, как разбирать сложные объявления функций; благодаря последнему я сам могу кропать "указатель на функцию, возвpащающую указатель на массив из тpёх указателей на функции, возвpащающие значение int"

(Во вложении показано, что я имею ввиду)

Здесь же непонятно как разбирать,интуитивно могу предполагать только, то символам * () [] отводится особая роль, но какая именно сам понять не могу, спасибо кто подскажет.
0
Вложения
Тип файла: txt slozh_ob.txt (3.3 Кб, 34 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2011, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как грамотно нтерпретировать ввод нового имени типа, введённого typedef (C++):

Как правильно пользоваться typedef для декларации типа указателя на функцию? - C++
Мне нужны будут функции, принимающие параметр-указатель на функции с одним и тем же списком параметров и возвращаемым типом. Как правильно...

Переопределение типа(typedef) - C++
Не как не могу разобраться что такое StartDLL/Startup в данном случае typedef void (*Startup)(); Startup StartDll; ...

Определение типа через typedef - C++
То-ли я пересидел, то-ли я просто этого не знаю, но все же. Через typedef определить 1) массив из 7 указателей на целые числа. Как не...

Как ограничить ввод типа данных? - C++
как сделать так чтобы при использовании оператора cin можно было ограничить тип ввода данных. а именно чтобы при вводе символов в выдавала...

как сделать проверку на наличие похожего имени файла и запрос нового имени файла? - PHP
При загрузке изображения присваивается имя foto.jpg. Вопрос, как сделать проверку на то что фото с таким именем существует и если он...

Как проверить соответствие типа введённого в Textbox? - C#
Есть класс с типами, информация о типах поступает динамически. Каждому текстбоксу соответствует своё свойство. Нужно проверить соответствие...

38
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.04.2011, 17:38 #16
Единственное, что я смог придумать. Мне дают объявить функцию типа g, но описать её придётся, используя тип явно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef char (*g());
 
g a;
 
int main()
{
    a();
 
    return 0;
}
 
char *a()
{
    return NULL;
}
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
25.05.2011, 19:04  [ТС] #17
Никто не знает?
0
Evg
Эксперт CАвтор FAQ
17931 / 6156 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
25.05.2011, 19:17 #18
Общий смысл typedef'а такой, что "typedef <существующий тип> <новый тип>". Когда имеем дело со сложными выражениями, то тут особо мудрить не надо - ищем идентификатор, который обозначает новый тип, выкидываем этот идентификатор и слово typedef. То, что осталось - это и есть "существующий тип". Т.е.

C
1
typedef char  (*char6) [6];
идентификатор нового типа - это char6 (потому что больше ничего не попадает под эту категорию). Выкидываем char6 и typedef, а то, что остаётся

C
1
char  (*) [6];
это и есть новый тип, т.е. указатель на массив из шести char'ов
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
25.05.2011, 19:27  [ТС] #19
C++
1
typedef char(*g());
Это как интерпретировать, скажите пожалуйста?
0
Evg
Эксперт CАвтор FAQ
17931 / 6156 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
25.05.2011, 19:33 #20
Точно так же откидываешь typedef и g и получается "char (*())". Самые внешние скобки можно отбросить (как и п остие #18) и получится "char *()". Т.е. тип функции, возвращающей char*, параметры отсутсвуют. Чтобы лишний пробел не смущал, то переписать это как "char* ()". Но не путать с указателем на функцию, потому как у указателя на функцию скобки вокруг звёздочки ставятся.

C
1
2
typedef char(*g());
g h;
еквивалентно

C
1
char* h();
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.05.2011, 19:40 #21
kravam, чем не устроил ответ в 16 посте?

Добавлено через 1 минуту

Не по теме:

Evg опередил)) Но ответ был, по сути, такой же.

0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
25.05.2011, 20:35  [ТС] #22
Нет. Это вы исходите из того, раз компилится, значит есть в этом какой-то смысл. А смысла нет.
По крайней мере, если есть какая-то переменная некоторого типа, то она характеризуется точным размером.

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

То есть не всё золото, что блестит. Не всё, что компилится, имеет смысл.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.05.2011, 21:09 #23
Цитата Сообщение от kravam Посмотреть сообщение
То есть не всё золото, что блестит. Не всё, что компилится, имеет смысл.
А это я вам сказал ещё в посте 14.

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

Цитата Сообщение от kravam Посмотреть сообщение
Какой размер может быть у переменной типа "функция, возвращающей char*, параметры отсутсвуют."?
Никакого, потому что функция - не переменная. Опять же - мы говорим о типах, всего лишь о типах.

Цитата Сообщение от kravam Посмотреть сообщение
Переменная вышеупомянутого так называемого типа не обладает никаким размером.(если не считать размером длину кода, хе). Значит, это не тип, а непонятно что.
И ещё раз - это не переменная. Имя функции - не переменная. У переменной и имени функции общее только одно: и то, и другое - идентификаторы.
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
25.05.2011, 21:16  [ТС] #24
Так-то прикольно.

Типы зажили самостоятельной жизнью. Типы есть, а вот переменных нет. Прямо платонство какое-то у него тоже был мир идей, самостоятельных тык скыть сущностей, независимых от вещей.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.05.2011, 21:18 #25
Хм...

C
1
2
3
4
5
typedef struct
{
    int a;
    double b;
} Foo;
Тип есть. Переменных нет (пока мы их не создадим). Не?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
25.05.2011, 21:41  [ТС] #26
Не. Нужно видеть разницу между похожими вещами.
Ваш пример предполагает, что можно корректно создать переменные a и b. И даже получитьт их адреса и посмотреть в отладчике на эти адреса. Увидеть переменные! Сами же сказали "пока не создадим".

Я же говорю о случае, когда переменую типа такого-то(см. выше) создать невозможно в принципе. Ситуации похожие, но разные.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.05.2011, 21:44 #27
kravam, переменную создать невозможно, но можно объявить функцию. Я не понимаю, чего вы добиваетесь.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
25.05.2011, 21:50  [ТС] #28
Я хочу, чтобы вы согласились, да, эта штука компилиться не должна, как не должна вода быть сухой, а воздух твёрдым
typedef char(*g());
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.05.2011, 21:53 #29
kravam, нет, не соглашусь. Должна. И в 16 посте показано, как это можно использовать. Не понимаю, чего вам не нравится. Почему вы тип связываете с размером? Да, функция не имеет размер (в общем смысле), но зато она вернёт значение, которое будет иметь соответствующий этому типу размер. Как и любая другая функция. Только о других (объявленных стандартным способом) вы почему-то никаких недовольств не выказали.
0
Evg
Эксперт CАвтор FAQ
17931 / 6156 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
25.05.2011, 22:32 #30
Цитата Сообщение от kravam Посмотреть сообщение
Я хочу, чтобы вы согласились, да, эта штука компилиться не должна, как не должна вода быть сухой, а воздух твёрдым
typedef char(*g());
Ты не прав. Эта штука компилиться будет, потому что она объявляет ТИП. Если имеется тип, то вовсе не обязательно, что можно создать переменную такого типа, но в обязательном порядке можно создавать переменную, являющуюся указателем на данный тип. За примером ходить далеко не надо - это обычный void. Переменную типа void создать нельзя, но переменную типа указатель на void - можно. Точно так же и с типом, который является функцией (но не указателем на функцию). Пример смотри тут: http://www.cyberforum.ru/cpp/thread2...ml#post1553517

Добавлено через 9 минут
Или вот такой тип: "typedef int arr_t[];". В стандартном Си ты НЕ можешь объявить переменную такого типа, но можешь объявить указатель или описать внешнюю переменную (пишу именно про стандартный Си, потому что в GNU C это можно сделать). Т.е. опять имеем тип, но не имеем права создать переменную данного типа
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2011, 22:32
Привет! Вот еще темы с ответами:

Как грамотно реализовать многострочный ввод с клавиатуры - C (СИ)
Как грамотно реализовать многострочный ввод с клавиатуры и затем подсчет, сколько раз встречается символ &quot; в введенных данных? void...

Как грамотно работать с переменными типа БитМап? - Visual Basic
Программлю давно и много, основные языки это Дельфя, Си, Перла и Ява! Они-то меня и подводят. Младой неуч попросил подсобить в написании...

Как грамотно организовать проверку типа данных - VBA
Проверяю массив данных на вычисляемость Дан какой-то массив с 1000 строками и 200 столбцами. Заполнен данными навалом. есть столбцы...

Как правильно и грамотно осуществлять проверку на корректный ввод Еmail - C#
Как правильно и грамотно осуществлять проверку на корректный ввод Еmail?


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
25.05.2011, 22:32
Ответ Создать тему
Опции темы

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