Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
#1

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

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


http://www.cyberforum.ru/cpp-beginners/thread2188992.html
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 для декларации типа указателя на функцию?
Мне нужны будут функции, принимающие параметр-указатель на функции с одним и...

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

Определение типа через typedef
То-ли я пересидел, то-ли я просто этого не знаю, но все же. Через typedef...

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

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

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

Короче, разобраться и забыть до поры до времени.
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
16.04.2011, 16:15 #4
kravam, мдя, только подробнейшим образом описал алгоритм разбора, и потом всё таки решил заглянуть во вложение (чего обыкновенно не делаю) - и увидел тот же самый алгоритм, который описывал на примере минут 20... Обидно, а самое главное - не понятно, чем он вам не понравился?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.04.2011, 16:31 #5
silent_1991, Там алгоритм разбора сложных объявлений функций. А человеку нужен алгоритм разбора typedef-ов.
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
16.04.2011, 16:34 #6
ForEveR, а он чем-то отличается? Разбираем так же, а потом говорим, что с помощью char6 можем объявить переменную таким образом:
C++
1
char6 foo;
что эквивалентно
C++
1
char (*foo)[6];
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
16.04.2011, 16:36  [ТС] #7
Откуда же я знал, что тот алгоритм можно применять к typedef?

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

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

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

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

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

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

Добавлено через 57 секунд
Это чушь, но чушь, соответствующая всем правилам, и потому спокойно проглатываемая компилятором)))
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
16.04.2011, 17:37  [ТС] #15
ОК, я встретил такое в чужом коде, как я должен сие прочесть?
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
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
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
25.05.2011, 19:04  [ТС] #17
Никто не знает?
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 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
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
25.05.2011, 19:27  [ТС] #19
C++
1
typedef char(*g());
Это как интерпретировать, скажите пожалуйста?
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2011, 19:33
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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