быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
1 | ||||||
Как грамотно нтерпретировать ввод нового имени типа, введённого typedef16.04.2011, 14:32. Показов 3200. Ответов 38
Метки нет (Все метки)
Друзья! Дело в том, что вот такой вот код:
char6 есть указатель на строку из шести символов. Это я прочёл в учебнике, то бишь вызубрил, но чуть более сложную конструкцию я сам разобрать не могу. Хотелось бы какой-то общий алгорим прочесть подобно тому, как разбирать сложные объявления функций; благодаря последнему я сам могу кропать "указатель на функцию, возвpащающую указатель на массив из тpёх указателей на функции, возвpащающие значение int" (Во вложении показано, что я имею ввиду) Здесь же непонятно как разбирать,интуитивно могу предполагать только, то символам * () [] отводится особая роль, но какая именно сам понять не могу, спасибо кто подскажет.
0
|
16.04.2011, 14:32 | |
Ответы с готовыми решениями:
38
Typedef void F(); typedef для типа функции через идентификатор Как сделать проверку на наличие похожего имени файла и запрос нового имени файла? Как грамотно реализовать многострочный ввод с клавиатуры Как грамотно организовать проверку типа данных |
В астрале
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 можем объявить переменную таким образом:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
16.04.2011, 16:36 [ТС] | 7 | ||||||||||
Откуда же я знал, что тот алгоритм можно применять к typedef?
Я и щас сомневаюсь. Ибо там всё однозначно, разбирается выражение:
В моём же случае надо разобрать ДРУГОЕ выражение
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. Для примера попробуйте:
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 | |||||
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 | |||||
Вообще я не силён в этом деле и спросил бы более опытных товарищей, как интерпретировать эту запись? (Да и вообще все остальные, с чего, собсно и начал тему)
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, но описать её придётся, используя тип явно:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
25.05.2011, 19:04 [ТС] | 17 |
Никто не знает?
0
|
25.05.2011, 19:17 | 18 | ||||||||||
Общий смысл typedef'а такой, что "typedef <существующий тип> <новый тип>". Когда имеем дело со сложными выражениями, то тут особо мудрить не надо - ищем идентификатор, который обозначает новый тип, выкидываем этот идентификатор и слово typedef. То, что осталось - это и есть "существующий тип". Т.е.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
25.05.2011, 19:27 [ТС] | 19 | |||||
0
|
25.05.2011, 19:33 | 20 | ||||||||||
Точно так же откидываешь typedef и g и получается "char (*())". Самые внешние скобки можно отбросить (как и п остие #18) и получится "char *()". Т.е. тип функции, возвращающей char*, параметры отсутсвуют. Чтобы лишний пробел не смущал, то переписать это как "char* ()". Но не путать с указателем на функцию, потому как у указателя на функцию скобки вокруг звёздочки ставятся.
0
|
25.05.2011, 19:33 | |
25.05.2011, 19:33 | |
Помогаю со студенческими работами здесь
20
Как грамотно работать с переменными типа БитМап? Как правильно пользоваться typedef для декларации типа указателя на функцию? Как грамотно перегрузить метод с параметрами одного типа? Как правильно и грамотно осуществлять проверку на корректный ввод Еmail Ввод нового типа "очень длинный" на основе двух стандартных типов Сопоставление ограничения, введенного без указания имени ограничения, и имени соответствующего столбца средствами SSMS Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |