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

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

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

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

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

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

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

Здесь же непонятно как разбирать,интуитивно могу предполагать только, то символам * () [] отводится особая роль, но какая именно сам понять не могу, спасибо кто подскажет.
Вложения
Тип файла: txt slozh_ob.txt (3.3 Кб, 35 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2011, 14:32
Ответы с готовыми решениями:

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

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

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

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

38
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.04.2011, 15:59 2
kravam, typedef это конечно хорошо. НО сложные typedef-ы это исключительно головная боль, разобрать-то можно все что угодно. Вопрос зачем такое использовать?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
16.04.2011, 16:06  [ТС] 3
Сам я не собираюсь использовать подобное, но для разбора ЧУЖИХ кодов. Такой код, например, я взял в одном задачнике.

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

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

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

Или нет?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 16:43 8
Да почему оно другое?
Ищем идентификатор. Видим 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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
16.04.2011, 16:54  [ТС] 9
Я уже давно убедился, что эти интерпретации СОВПАДАЮТ. Но то, что они ИНОГДА совпадают не основание, чтобы применять их ВСЕГДА.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.04.2011, 16:55 10
kravam, дайте пример, когда они НЕ совпадают.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
16.04.2011, 17:18  [ТС] 11
C++
1
2
char(*p()); 
 typedef char(*g());
Первая строка:
p это функция, которая ничего не принимает и возвращает переменную типа char

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

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

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

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

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

C
1
char  (*) [6];
это и есть новый тип, т.е. указатель на массив из шести char'ов
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
25.05.2011, 19:27  [ТС] 19
C++
1
typedef char(*g());
Это как интерпретировать, скажите пожалуйста?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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
25.05.2011, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2011, 19:33
Помогаю со студенческими работами здесь

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

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

Как грамотно перегрузить метод с параметрами одного типа?
Здравствуйте, 1 вопрос с 2 подпунктами. 1. Как грамотно перегрузить следующий метод? void...

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

Ввод нового типа "очень длинный" на основе двух стандартных типов
Есть тип struct verylong_t { long hi; long lo; }; Думаю о том, как создать его по...

Сопоставление ограничения, введенного без указания имени ограничения, и имени соответствующего столбца средствами SSMS
Если для какого-то столбца введено ограничение UNIQUE или DEFAULT без явного указания имени...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru