2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение18.05.2015, 06:12 


11/12/14
893
arseniiv в сообщении #1016593 писал(а):
Например, как назвать тип x, объявленного как int x[]? Соответствующего типовыражения на C (и на плюсах) написать нельзя.


Можно и пишут. Вы тут что-то путаете, в Си можно вывести "чистое выражение типа" совершенно любой сложности. И записывается оно именно так, что берем выражение для определения переменной, а потом из него просто удаляем имя переменной. Парсер справится. Для человека несколько сложно, надо искать самые innermost скобки и двигаться вправо-влево от них разглядывая приоритеты того что собственно стоит справа, а что слева.
Обсуждения о том что бы было если бы правила были проще и для человека и к примеру тип всегда читался слева-направо встречаются. Но в сущности если присмотреться к основной массе реального кода, то видно, что на практике никто не заморачивается введениями сложных типов не обернув их тайпедефами от корней, так что самое сложное что может проскочить - указатель на указатель на что-то или указатель на функцию/метод.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение18.05.2015, 07:46 
Заслуженный участник
Аватара пользователя


19/12/10
1546
aa_dav в сообщении #1016645 писал(а):
в Си можно вывести "чистое выражение типа" совершенно любой сложности. И записывается оно именно так, что берем выражение для определения переменной, а потом из него просто удаляем имя переменной.

То есть указатель на функцию можно объявить, например, int(*)(int,int) pf; вместо принятого в синтаксисе int (*pf)(int,int); ?

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение18.05.2015, 07:55 


11/12/14
893
whitefox в сообщении #1016652 писал(а):
То есть указатель на функцию можно объявить, например, int(*)(int,int) pf; вместо принятого в синтаксисе int (*pf)(int,int); ?


Нет конечно. Но смотрите как это работает например с шаблонами::
Используется синтаксис C++
template<class T>
void func()
{
   T x;
   ....
};
func<int(*)(int,int)>();
 

Вот этот передаваемый тип может быть сколько угодно навороченным, но внутри не надо писать ничего кроме T x.
P.S.
То же самое в сущности происходит с typedef, поэтому повторюсь, что на практике со сложностями распарсивания уберкомплексного типа можно вообще не сталкиваться.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение18.05.2015, 13:04 
Заслуженный участник
Аватара пользователя


30/01/06
72407
aa_dav в сообщении #1016645 писал(а):
Но в сущности если присмотреться к основной массе реального кода, то видно, что на практике никто не заморачивается введениями сложных типов не обернув их тайпедефами от корней, так что самое сложное что может проскочить - указатель на указатель на что-то или указатель на функцию/метод.

Не всё так здорово. Дебаггеры выдают именно вот эти сложночитаемые выражения, потому что тайпдефы для них "не видны". (Что, кстати, традиция, но можно было бы и исправить...)

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение19.05.2015, 17:03 
Заслуженный участник


27/04/09
28128
aa_dav в сообщении #1016654 писал(а):
Нет конечно. Но смотрите как это работает например с шаблонами
Ага-а-а! А в C-то шаблонов нет, там где мы такие выражения сможем написать? :wink:

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение19.05.2015, 17:10 
Заслуженный участник


04/05/09
4587
arseniiv в сообщении #1017271 писал(а):
aa_dav в сообщении #1016654 писал(а):
Нет конечно. Но смотрите как это работает например с шаблонами
Ага-а-а! А в C-то шаблонов нет, там где мы такие выражения сможем написать? :wink:

Но typedef то есть:
Код:
typedef int(*F)(int,int);
void sort(int* array, size_t size, F compare);

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение19.05.2015, 17:49 
Заслуженный участник


27/04/09
28128
Но ведь не typedef new old, я только об этом и говорил.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 07:28 


11/12/14
893
arseniiv в сообщении #1017271 писал(а):
А в C-то шаблонов нет, там где мы такие выражения сможем написать? :wink:


В декларациях функций.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 07:38 
Заслуженный участник
Аватара пользователя


19/12/10
1546
aa_dav в сообщении #1017648 писал(а):
В декларациях функций.

То есть в С указатель на функцию int(*)(int,int) pf; объявить нельзя, а функцию int(int,int) f; можно? Если последнее тоже не возможно, то что Вы имели ввиду?

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 07:47 


11/12/14
893
whitefox в сообщении #1017651 писал(а):
Если последнее тоже не возможно, то что Вы имели ввиду?


Имелась ввиду фраза топиккастера "где в С такие выражение мы сможем написать?".
Ответ: в декларациях функций.
Например
Код:
void f(int(*)(int,int));

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 07:50 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Понятно, спасибо.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 10:26 


11/12/14
893
В качестве разминки на углубленное понимание сабжа можно рассмотреть задачку (результат "нетипично" выглядит):
Сделать без typedef функцию возвращающую указатель на массив из 3-х int.
Ответ можно глянуть тут: http://ideone.com/3nbhzm

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 14:08 
Заслуженный участник
Аватара пользователя


19/12/10
1546
aa_dav в сообщении #1017700 писал(а):
Сделать без typedef функцию возвращающую указатель на массив из 3-х int.

Мой вариант был такой:
Используется синтаксис C++
int* f(){
    static int mass[] = {1,2,3};
    return mass;
}

Почитал ответ, и усомнился в правильности своего варианта, так как формально возвращается указатель на целое, а не на массив целых. Но правильный ответ для меня во многом загадочен. :roll:

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 15:09 


11/12/14
893
whitefox в сообщении #1017808 писал(а):
Но правильный ответ для меня во многом загадочен. :roll:


Ну я лично думаю что ответ заставит как минимум вздёрнуть бровь в удивлении даже достаточно опытных программистов на С/С++, уж очень нетипично видеть скобки массива справа от имени функции. :) Я такого кода лично никогда не встречал.
Но на самом деле конечно это ровно то же самое что в int a[3] квадратные скобки стоят справа от имени переменной. Если бы в Си можно было возвращать массивы, то пример был бы еще более нагляден, но массивы нельзя, поэтому приходится вводить указатель на массив и это конечно не то же самое что массив, если аккуратно разбираться.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 15:32 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Кажется, Си обзавёлся уже ссылками, так что можно ссылку на массив.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group