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 
arseniiv в сообщении #1016593 писал(а):
Например, как назвать тип x, объявленного как int x[]? Соответствующего типовыражения на C (и на плюсах) написать нельзя.


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

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение18.05.2015, 07:46 
Аватара пользователя
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 
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 
Аватара пользователя
aa_dav в сообщении #1016645 писал(а):
Но в сущности если присмотреться к основной массе реального кода, то видно, что на практике никто не заморачивается введениями сложных типов не обернув их тайпедефами от корней, так что самое сложное что может проскочить - указатель на указатель на что-то или указатель на функцию/метод.

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

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение19.05.2015, 17:03 
aa_dav в сообщении #1016654 писал(а):
Нет конечно. Но смотрите как это работает например с шаблонами
Ага-а-а! А в C-то шаблонов нет, там где мы такие выражения сможем написать? :wink:

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение19.05.2015, 17:10 
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 
Но ведь не typedef new old, я только об этом и говорил.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 07:28 
arseniiv в сообщении #1017271 писал(а):
А в C-то шаблонов нет, там где мы такие выражения сможем написать? :wink:


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

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 07:38 
Аватара пользователя
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 
whitefox в сообщении #1017651 писал(а):
Если последнее тоже не возможно, то что Вы имели ввиду?


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

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

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 10:26 
В качестве разминки на углубленное понимание сабжа можно рассмотреть задачку (результат "нетипично" выглядит):
Сделать без typedef функцию возвращающую указатель на массив из 3-х int.
Ответ можно глянуть тут: http://ideone.com/3nbhzm

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение20.05.2015, 14:08 
Аватара пользователя
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 
whitefox в сообщении #1017808 писал(а):
Но правильный ответ для меня во многом загадочен. :roll:


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

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

 
 
 [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group