Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709

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

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

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

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

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

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

Здесь же непонятно как разбирать,интуитивно могу предполагать только, то символам * () [] отводится особая роль, но какая именно сам понять не могу, спасибо кто подскажет.
Вложения
Тип файла: txt slozh_ob.txt (3.3 Кб, 35 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2011, 14:32
Ответы с готовыми решениями:

Typedef void F(); typedef для типа функции через идентификатор
Здравствуйте цитата из typedef MSDN в интернете мне удалось нарыть только один конкретный пример: class A { typedef void F(); ...

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

Как грамотно реализовать многострочный ввод с клавиатуры
Как грамотно реализовать многострочный ввод с клавиатуры и затем подсчет, сколько раз встречается символ " в введенных данных? ...

38
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 19:40
Студворк — интернет-сервис помощи студентам
kravam, чем не устроил ответ в 16 посте?

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

Не по теме:

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

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

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

То есть не всё золото, что блестит. Не всё, что компилится, имеет смысл.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 21:09
Цитата Сообщение от kravam Посмотреть сообщение
То есть не всё золото, что блестит. Не всё, что компилится, имеет смысл.
А это я вам сказал ещё в посте 14.

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

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

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

Типы зажили самостоятельной жизнью. Типы есть, а вот переменных нет. Прямо платонство какое-то у него тоже был мир идей, самостоятельных тык скыть сущностей, независимых от вещей.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 21:18
Хм...

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

Я же говорю о случае, когда переменую типа такого-то(см. выше) создать невозможно в принципе. Ситуации похожие, но разные.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 21:44
kravam, переменную создать невозможно, но можно объявить функцию. Я не понимаю, чего вы добиваетесь.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.05.2011, 21:50  [ТС]
Я хочу, чтобы вы согласились, да, эта штука компилиться не должна, как не должна вода быть сухой, а воздух твёрдым
typedef char(*g());
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 21:53
kravam, нет, не соглашусь. Должна. И в 16 посте показано, как это можно использовать. Не понимаю, чего вам не нравится. Почему вы тип связываете с размером? Да, функция не имеет размер (в общем смысле), но зато она вернёт значение, которое будет иметь соответствующий этому типу размер. Как и любая другая функция. Только о других (объявленных стандартным способом) вы почему-то никаких недовольств не выказали.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.05.2011, 22:32
Цитата Сообщение от kravam Посмотреть сообщение
Я хочу, чтобы вы согласились, да, эта штука компилиться не должна, как не должна вода быть сухой, а воздух твёрдым
typedef char(*g());
Ты не прав. Эта штука компилиться будет, потому что она объявляет ТИП. Если имеется тип, то вовсе не обязательно, что можно создать переменную такого типа, но в обязательном порядке можно создавать переменную, являющуюся указателем на данный тип. За примером ходить далеко не надо - это обычный void. Переменную типа void создать нельзя, но переменную типа указатель на void - можно. Точно так же и с типом, который является функцией (но не указателем на функцию). Пример смотри тут: https://www.cyberforum.ru/cpp/... ost1553517

Добавлено через 9 минут
Или вот такой тип: "typedef int arr_t[];". В стандартном Си ты НЕ можешь объявить переменную такого типа, но можешь объявить указатель или описать внешнюю переменную (пишу именно про стандартный Си, потому что в GNU C это можно сделать). Т.е. опять имеем тип, но не имеем права создать переменную данного типа
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.05.2011, 22:48  [ТС]
Хорошо. Пусть бывает собственно тип переменной, а пусть бывает тип не знаю даже как назвать. Моих мозгов хватает на то, что после "тип" должно идти существительное в родительном падеже. Тип человека, тип функции, тип переменной. Это ладно.

Но вернёмся к истокам. Другой вопрос. Как интерпретировать сложные объявления?:

C++
1
typedef char(*g());
Вы сказали, как. Но тут одна загвоздка. Дабы применить к подобным сложным выражениям правила интерпретации, надо сперва осознать, что они сложные. А чтобы осознать, что они сложные, их надо интерпретировать, а чтобы их интерпретировать, надо осознать, что они сложные...
+++++++++++++++++++
Или какое-то двойное правило?:

C
1
typedef char char_;
Интерпретируем так: отбрасываем typedef, оставляем(!) имя и всё, что левее и говорим: имя есть синоним типа "называем что левее имени"

ОК, а этот пример интерпретируем по вашим правилам.
C++
1
typedef char(*g());
Добро коли так. Дело за малым. Осталось формализировать различия. То есть чётко сказать: сложное объявление это такое, где есть то-то то-то и то-то в таком-то то количестве (я имею ввиду скобки, звёздочки ну и прочая.)

А простое... Это другое какое-то.

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

(На всякий случай: интерпретация сложных объявлений, что я в приложении дал действительно формализовано и как бы стандартизировано. Сколь угодно сложные (ЛЮБЫЕ!) обявления можно с успехом интерпретировать по приведённым правилам.)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 22:52
Цитата Сообщение от kravam Посмотреть сообщение
(На всякий случай: интерпретация сложных объявлений, что я в приложении дал действительно формализовано и как бы стандартизировано. Сколь угодно сложные (ЛЮБЫЕ!) обявления можно с успехом интерпретировать по приведённым правилам.)
А вот теперь перечитайте эту строку и делайте это до полного просветления.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.05.2011, 22:59  [ТС]
Не, ситуации разные.
C++
1
typedef char char_
Даёт нам право char заменять char_-ом

C++
1
typedef char(*g());
Не имеем права X заменять Y-ом. И где та степень сложности, при которой начинается "не имеем права X заменять Y-ом" я не знаю.

Добавлено через 50 секунд
Кстати, где X и Y я тоже не знаю, но это ладно, потом разберусь

Добавлено через 36 секунд
А в первом примере всё ясно, X это char, Y это char_
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 23:02
Да нет степеней сложности. Компилятор оба выражения по одному алгоритму интерпретирует. Просто в первом случае алгоритм заканчивается, только начавшись. А во втором типу char *() ставится в соответствие псевдоним g.

Добавлено через 48 секунд
X - char *() (функция без параметров, возвращающая указатель на char), Y - g.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.05.2011, 23:18  [ТС]
Ну так-то понятно. Получается, все переопределения типов надо интерпретиовать по правилам введённым Evg, не ошибёмся. Но он там написал:

Точно так же откидываешь typedef и g и получается "char (*())". Самые внешние скобки можно отбросить (как и п остие #18) и получится "char *()". Т.е. тип функции, возвращающей char*, параметры отсутсвуют. Чтобы лишний пробел не смущал, то переписать это как "char* ()". Но не путать с указателем на функцию, потому как у указателя на функцию скобки вокруг звёздочки ставятся.

typedef-то надо отбрасывать, а g не надо; последнее должно учавствовать в конечном словесном определении. Это понятно.

++++++++++++++++++++++++++++++++++++++++ +++++++++++++++

Возник вопрос. Почему в таком случае сие не компилится?
C++
1
typedef char(*()) g;
Но он риторический, скорее. ВЫ же не обязаны знать, почему компилятор не компилят. Хотя вроде должен. Слева-тип (функция, возвращающей char*, параметры отсутсвуют.). Справа- типозаменитель g. Но не компилит.

Ну и что касается самих типов (не интерпретации!) я ещё подумаю.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.05.2011, 23:21
Цитата Сообщение от kravam Посмотреть сообщение
Почему в таком случае сие не компилится?
Думаю, как раз потому, что для приведённого алгоритма нужна отправная точка, которой является некоторый идентификатор. В данном случае компилятору неоткуда начинать интерпретацию. Но точно я не знаю, может иметь место иная причина. Но по логике напрашивается именно такая.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.05.2011, 23:31
Цитата Сообщение от kravam Посмотреть сообщение
Но вернёмся к истокам. Другой вопрос. Как интерпретировать сложные объявления?:

C++
1
typedef char(*g());
Вы сказали, как. Но тут одна загвоздка. Дабы применить к подобным сложным выражениям правила интерпретации, надо сперва осознать, что они сложные. А чтобы осознать, что они сложные, их надо интерпретировать, а чтобы их интерпретировать, надо осознать, что они сложные...
+++++++++++++++++++
Или какое-то двойное правило?:

C
1
typedef char char_;
Интерпретируем так: отбрасываем typedef, оставляем(!) имя и всё, что левее и говорим: имя есть синоним типа "называем что левее имени"
Делаем ровно так же. Отбрасываем typedef и отбрасываем идентификатор char_. То что осталось - это char - эквивалент нового типа. Хоть "простой", хоть "сложный" случай интерпретируются одинаково

Цитата Сообщение от kravam Посмотреть сообщение
Почему в таком случае сие не компилится?
C
1
typedef char(*()) g;
Примерно потому же, почему "char* func ()" компилится, а "char* () func" - нет
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.05.2011, 23:46  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Думаю, как раз потому, что для приведённого алгоритма нужна отправная точка, которой является некоторый идентификатор. В данном случае компилятору неоткуда начинать интерпретацию.
не иначе

Добавлено через 9 минут
Цитата Сообщение от Evg Посмотреть сообщение
То что осталось - это char - эквивалент нового типа.
чё-то не то
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
26.05.2011, 13:26
Цитата Сообщение от kravam Посмотреть сообщение
чё-то не то
Что именно не то? Или я не так сформулировал. То, что осталось - это то, чему равен новый тип (ровно так же, как и в "сложном" случае)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.05.2011, 13:26

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

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

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

Как грамотно перегрузить метод с параметрами одного типа?
Здравствуйте, 1 вопрос с 2 подпунктами. 1. Как грамотно перегрузить следующий метод? void func(int x, int y){} //принимает как x так...

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


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru