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

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

16.04.2011, 14:32. Показов 3763. Ответов 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
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.04.2011, 15:59
kravam, typedef это конечно хорошо. НО сложные typedef-ы это исключительно головная боль, разобрать-то можно все что угодно. Вопрос зачем такое использовать?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.04.2011, 16:06  [ТС]
Сам я не собираюсь использовать подобное, но для разбора ЧУЖИХ кодов. Такой код, например, я взял в одном задачнике.

Короче, разобраться и забыть до поры до времени.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 16:15
kravam, мдя, только подробнейшим образом описал алгоритм разбора, и потом всё таки решил заглянуть во вложение (чего обыкновенно не делаю) - и увидел тот же самый алгоритм, который описывал на примере минут 20... Обидно, а самое главное - не понятно, чем он вам не понравился?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.04.2011, 16:31
silent_1991, Там алгоритм разбора сложных объявлений функций. А человеку нужен алгоритм разбора typedef-ов.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 16:34
ForEveR, а он чем-то отличается? Разбираем так же, а потом говорим, что с помощью char6 можем объявить переменную таким образом:
C++
1
char6 foo;
что эквивалентно
C++
1
char (*foo)[6];
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.04.2011, 16:36  [ТС]
Откуда же я знал, что тот алгоритм можно применять к typedef?

Я и щас сомневаюсь. Ибо там всё однозначно, разбирается выражение:
C++
1
char  (*char6) [6];
//++++++++++++++++++++++++++++++++++++++++ +++++
В моём же случае надо разобрать ДРУГОЕ выражение

C++
1
(*char6) [6];
И вот после того, как его как-то там назвать, идентифицировать, надо вспомнить про
typede char и ляпнуть в конце:
и это всё есть синоним типа char.

Или нет?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 16:43
Да почему оно другое?
Ищем идентификатор. Видим char6. Говорим "char6 - это"
Идём вправо. Видим ). Ничего не говорим.
Идём влево. Видим *. Говорим "указатель на".
Идём вправо. Видим [6]. Говорим "массив из 6".
Идём влево. Видим char. Говорим "элементов типа char".
Получаем: "char6 - это указатель на массив из 6 элементов типа char". Затем видим typedef и запоминаем, что для типа (*)[6] можно применять псевдоним char6. Для примера попробуйте:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
typedef char (*char6)[6];
 
int main()
{
    char str[6] = "Hello";
 
    char6 foo1 = &str;
    char (*foo2)[6] = &str;
 
    std::cout << *foo1 << std::endl;
    std::cout << *foo2 << std::endl;
 
    return 0;
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.04.2011, 16:54  [ТС]
Я уже давно убедился, что эти интерпретации СОВПАДАЮТ. Но то, что они ИНОГДА совпадают не основание, чтобы применять их ВСЕГДА.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 16:55
kravam, дайте пример, когда они НЕ совпадают.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.04.2011, 17:18  [ТС]
C++
1
2
char(*p()); 
 typedef char(*g());
Первая строка:
p это функция, которая ничего не принимает и возвращает переменную типа char

Вторая строка (пробуем так же интерпретировать)
g это функция, которая ничего не принимает и возвращает переменную типа char

Получили не имя типа (что хотелось бы, всё таки typedef), а имя функции! Нездоровое что-то. Ну поэтому я и думаю, что должны быть другие правила расшифровки typedef
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 17:24
Погодите, а какой тип вы из такого объявления хотите получить-то? Тип функции что-ли?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.04.2011, 17:29  [ТС]
Вообще я не силён в этом деле и спросил бы более опытных товарищей, как интерпретировать эту запись? (Да и вообще все остальные, с чего, собсно и начал тему)
C++
1
typedef char(*g());
Если это чушь, тогда почему она компилится?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 17:34
Это объявление прототипа функции без параметров, возвращающей указатель на char. И ему пофигу на typedef в начале объявления, функционального типа в сях/плюсах не существует, вы не можете объявить переменную типа функции, максимум - указатель на функцию.

Добавлено через 1 минуту
Хотя нет, тут получается объявление псевдонима типа, который не может быть использован в дальнейшем в объявлении. Потому как при попытке вызова g() мне говорят, что приведение к g не допускается.

Добавлено через 57 секунд
Это чушь, но чушь, соответствующая всем правилам, и потому спокойно проглатываемая компилятором)))
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
16.04.2011, 17:37  [ТС]
ОК, я встретил такое в чужом коде, как я должен сие прочесть?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 17:38
Единственное, что я смог придумать. Мне дают объявить функцию типа 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
25.05.2011, 19:04  [ТС]
Никто не знает?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.05.2011, 19:17
Общий смысл typedef'а такой, что "typedef <существующий тип> <новый тип>". Когда имеем дело со сложными выражениями, то тут особо мудрить не надо - ищем идентификатор, который обозначает новый тип, выкидываем этот идентификатор и слово typedef. То, что осталось - это и есть "существующий тип". Т.е.

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

C
1
char  (*) [6];
это и есть новый тип, т.е. указатель на массив из шести char'ов
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
25.05.2011, 19:27  [ТС]
C++
1
typedef char(*g());
Это как интерпретировать, скажите пожалуйста?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.05.2011, 19:33
Точно так же откидываешь typedef и g и получается "char (*())". Самые внешние скобки можно отбросить (как и п остие #18) и получится "char *()". Т.е. тип функции, возвращающей char*, параметры отсутсвуют. Чтобы лишний пробел не смущал, то переписать это как "char* ()". Но не путать с указателем на функцию, потому как у указателя на функцию скобки вокруг звёздочки ставятся.

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

C
1
char* h();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2011, 19:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru