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

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

16.04.2011, 14:32. Показов 4138. Ответов 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,705
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,705
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,705
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,705
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
21285 / 8310 / 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,705
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,705
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,705
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
21285 / 8310 / 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,705
25.05.2011, 23:46  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Думаю, как раз потому, что для приведённого алгоритма нужна отправная точка, которой является некоторый идентификатор. В данном случае компилятору неоткуда начинать интерпретацию.
не иначе

Добавлено через 9 минут
Цитата Сообщение от Evg Посмотреть сообщение
То что осталось - это char - эквивалент нового типа.
чё-то не то
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru