С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
#1

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

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

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

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

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

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

Здесь же непонятно как разбирать,интуитивно могу предполагать только, то символам * () [] отводится особая роль, но какая именно сам понять не могу, спасибо кто подскажет.
0
Вложения
Тип файла: txt slozh_ob.txt (3.3 Кб, 34 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2011, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как грамотно нтерпретировать ввод нового имени типа, введённого typedef (C++):

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

Переопределение типа(typedef) - C++
Не как не могу разобраться что такое StartDLL/Startup в данном случае typedef void (*Startup)(); Startup StartDll; ...

Определение типа через typedef - C++
То-ли я пересидел, то-ли я просто этого не знаю, но все же. Через typedef определить 1) массив из 7 указателей на целые числа. Как не...

Как ограничить ввод типа данных? - C++
как сделать так чтобы при использовании оператора cin можно было ограничить тип ввода данных. а именно чтобы при вводе символов в выдавала...

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

Как проверить соответствие типа введённого в Textbox? - C#
Есть класс с типами, информация о типах поступает динамически. Каждому текстбоксу соответствует своё свойство. Нужно проверить соответствие...

38
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.04.2011, 15:59 #2
kravam, typedef это конечно хорошо. НО сложные typedef-ы это исключительно головная боль, разобрать-то можно все что угодно. Вопрос зачем такое использовать?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.04.2011, 16:06  [ТС] #3
Сам я не собираюсь использовать подобное, но для разбора ЧУЖИХ кодов. Такой код, например, я взял в одном задачнике.

Короче, разобраться и забыть до поры до времени.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
16.04.2011, 16:15 #4
kravam, мдя, только подробнейшим образом описал алгоритм разбора, и потом всё таки решил заглянуть во вложение (чего обыкновенно не делаю) - и увидел тот же самый алгоритм, который описывал на примере минут 20... Обидно, а самое главное - не понятно, чем он вам не понравился?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.04.2011, 16:31 #5
silent_1991, Там алгоритм разбора сложных объявлений функций. А человеку нужен алгоритм разбора typedef-ов.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
16.04.2011, 16:34 #6
ForEveR, а он чем-то отличается? Разбираем так же, а потом говорим, что с помощью char6 можем объявить переменную таким образом:
C++
1
char6 foo;
что эквивалентно
C++
1
char (*foo)[6];
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.04.2011, 16:36  [ТС] #7
Откуда же я знал, что тот алгоритм можно применять к typedef?

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

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

Или нет?
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
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
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.04.2011, 16:54  [ТС] #9
Я уже давно убедился, что эти интерпретации СОВПАДАЮТ. Но то, что они ИНОГДА совпадают не основание, чтобы применять их ВСЕГДА.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
16.04.2011, 16:55 #10
kravam, дайте пример, когда они НЕ совпадают.
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.04.2011, 17:18  [ТС] #11
C++
1
2
char(*p()); 
 typedef char(*g());
Первая строка:
p это функция, которая ничего не принимает и возвращает переменную типа char

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

Получили не имя типа (что хотелось бы, всё таки typedef), а имя функции! Нездоровое что-то. Ну поэтому я и думаю, что должны быть другие правила расшифровки typedef
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
16.04.2011, 17:24 #12
Погодите, а какой тип вы из такого объявления хотите получить-то? Тип функции что-ли?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.04.2011, 17:29  [ТС] #13
Вообще я не силён в этом деле и спросил бы более опытных товарищей, как интерпретировать эту запись? (Да и вообще все остальные, с чего, собсно и начал тему)
C++
1
typedef char(*g());
Если это чушь, тогда почему она компилится?
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
16.04.2011, 17:34 #14
Это объявление прототипа функции без параметров, возвращающей указатель на char. И ему пофигу на typedef в начале объявления, функционального типа в сях/плюсах не существует, вы не можете объявить переменную типа функции, максимум - указатель на функцию.

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

Добавлено через 57 секунд
Это чушь, но чушь, соответствующая всем правилам, и потому спокойно проглатываемая компилятором)))
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.04.2011, 17:37  [ТС] #15
ОК, я встретил такое в чужом коде, как я должен сие прочесть?
0
16.04.2011, 17:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2011, 17:37
Привет! Вот еще темы с ответами:

Как грамотно реализовать многострочный ввод с клавиатуры - C (СИ)
Как грамотно реализовать многострочный ввод с клавиатуры и затем подсчет, сколько раз встречается символ &quot; в введенных данных? void...

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.