psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2010-03-04 05:00 pm

Страшная тайна ;)

Мне тут процитировали классическую задачку для кондовых сишников: написать объявление переменной, которая является "указателем на функцию, на указатель на..." - ну и далее какие-нибудь такие навороты. Знакомо?

Так вот, ежели этот блог читают студенты, которых мучают такими задачками, а также старички, которые решают такие задачки методом тыка, то открою страшную тайну: задачки такие решаются чисто механически. Схема такая:

1. Пишем какой-нибудь идентификатор
2. Далее в цикле:

- прочитав "указатель на..."
- ставим * слева

- прочитав "ссылка на..."
- ставим & слева

- прочитав "массив из..."
- ставим [] справа. если будет сказано количество элементов, пишем, в [] сколько их

- прочитав "... функция..."
- просто ставим () справа

- прочитав "...принимающая/принимающую..."
- готовимся писать в тех скобках, что поставили, услышав про функцию

- прочитав "...возвращающая/возвращающую..."
- готовимся писать слева

- прочитав название типа
- ставим его слева

3. В процессе на каждом шаге делаем такую проверку: если использовано слово "указатель/ссылка", а потом используется "массив" или "функция", то перед очередным шагом все заключаем в скобки. Например:

"указатель на массив..." (*x)[]
"указатель на функцию..." (*f)()
но:
"массив указателей..." *x[]
"функция, возвращающая указатель" *f()

- это связано с тем, что приоритет операций & и * ниже, чем [] и ()

4. добавляем ;


В большинстве случаев эта тупая метода прокатывает с первого раза. Если нет, разбиваем на части и используем typedef-ы.

Пример:

"Указатель на указатель на массив из двух указателей на указатель на int"

x
"Указатель на"
*x
"указатель на"
**x
" массив из" (правило 3!)
(**x)[]
"двух "
(**x)[2]
"указателей на"
*(**x)[2]
" указатель на"
**(**x)[2]
"int"
int **(**x)[2];

ext_615659: (Default)

[identity profile] akuklev.livejournal.com 2010-03-04 02:40 pm (UTC)(link)
Афигеть какая страшная тайна. Прямо откровение какое-то, не меньше. В следующем номере читайте сенсацию: схема чисто механического решения для примеров из учебника по математике для третьего класса. Трёхстраничное пособие в помощь гениальным студентам, которых преподы-уроды мордуют неоправданно сложными примерами по арифметике.

[identity profile] http://users.livejournal.com/sharper_/ 2010-03-04 02:47 pm (UTC)(link)
О! Кстати, вспомнил, что тебя можно поднапрячь, ибо алгоритмист. А скажи почто cтруктуры данных не в почёте? Ну, ясно, что ООП превозмогло, но это же совершенно другое, в пределе, представление инфы. Не нуждающееся в данных. Т.е. сама структура, представленная адресами, и есть данные.

[identity profile] pascendi.livejournal.com 2010-03-04 02:51 pm (UTC)(link)
А потом надо подробно объяснить человеку, почему НЕ НАДО пользоваться такими штучками в реальной жизни :-)

[identity profile] piter239.livejournal.com 2010-03-04 06:12 pm (UTC)(link)
метапрограмма, однако!

Обожаю такие штуки

[identity profile] boldcat.livejournal.com 2010-03-08 02:45 am (UTC)(link)
Ну так в учебнике Кернигана-Ричи есть программа, которая делает это же.

[identity profile] gaussrifle.livejournal.com 2010-03-14 05:57 pm (UTC)(link)
это все хорошо прокатывает, пока нет дела до указателя на функцию член класса

ведь там приходится обязательно писать имя класса и значек ::*

но зато за счет этого можно легко организовать замену майкрософтских propetries для членов класса стандартными средствами С++, даже не boost и не tr1