LINUX.ORG.RU

/me знал C, смотрю и понимаю, что уже не знаю.

FIL ★★★★ ()

Массив из 5 указателей на функции, принимающие в качестве аргумента float и возвращающие struct tag?

kravich ★★★★ ()
Последнее исправление: kravich (всего исправлений: 1 )

Массив из пяти указателей на функции, которые возвращают структуру tag и принимают флоат?

Deleted ()

Вообще, в книжках пишут, как можно читать такие объявления, там нет ничего сложного.

Если не осилил эти правила — man cdecl. Есть версия онлайн.

И последний стандарт там не при чём.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от Delirium_veritas

А с чего собственно решили, что С11 при чём-то? Просто в его тексте увидел, может и в предыдущих этот пример есть

Harald ★★★★★ ()
Ответ на: комментарий от Harald

Ну выше уже ответили, как это читать. Я, в своё время игрался с созданием «почти классов» из стркутур C. Там сплошь и рядом указатели/массивы указателей на функции. В плюсах это поудобнее читается, имхо.

Delirium_veritas ()

Ну-ка, дай я попробую.

5 функций, которые принимают флот, а возвращают struct tag?

UPD: блджад, и ведь угадал: declare a as array 5 of pointer to function (float) returning struct tag.

arturpub ★★ ()
Последнее исправление: arturpub (всего исправлений: 1 )

looks like массив указателей на функцию с параметром float.

batbko ()

Когда я учил семиклассников писать на сях, мы разбирали такие задачки. Вот если бы ты указатель на функцию в качестве аргумента передавал, было бы куда интереснее для разбора.

userid2 ()

Вот за это я С и не люблю, потом начинаются баги из-за того, что в коде путают указатели и значения по ним.

handbrake ★★★ ()
Ответ на: комментарий от handbrake

Тут семантика достаточно мозголомная(для тех, кто не думает на хаскелле). Удачного синтаксиса для таких случаев до сих пор не придумали, выкручиваются костылями.

userid2 ()
Ответ на: комментарий от userid2

Удачного синтаксиса для таких случаев до сих пор не придумали, выкручиваются костылями.

Ну почему же. 1. Разнос сложных объявлений на несколько строк делает их читабельными, и 2. В С++11 using выносит имя влево - еще лучше.

Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

Это и есть костыли. Никто не сказал, что они не работают.

userid2 ()
Ответ на: комментарий от userid2

Массив из 5 указателей на функции, принимающие в качестве аргумента float и возвращающие struct tag

Удачного синтаксиса для таких случаев до сих пор не придумали, выкручиваются костылями.

Не вижу практического применения (нет, если задача укусить себя за шею, то повод придумать можно, но я не сторонник аутоканнибальства), почему нормально к ним не обращаться ?

Книги тоже веселые, «нате вам лезвие без ручки, теперь мы расскажем, как при вырезании аппендикса, держа лезвие без ручки между пальцами (иначе порежемся), отрезать именно нужное, и в конце мы рекомендуем проверить что у вас вместо одного из пальцев случайно не торчит аппендикс - а то работать будет, но при количестве пациентов, не превышающем 5»

handbrake ★★★ ()
Ответ на: комментарий от handbrake

Не вижу практического применения

Вот поэтому и не придумали. Я ни разу не защищаю текущее положение дел.

userid2 ()
Ответ на: комментарий от handbrake

почему нормально к ним не обращаться ?

А если на момент компиляции конкретные функции, которые должны быть вызваны, неизвестны (коллбэк)?

kravich ★★★★ ()
Ответ на: комментарий от userid2

Удачного синтаксиса для таких случаев до сих пор не придумали

typedef struct tag (*foo)(float);
foo arr[5];

псевдонимы как раз ввели для того, чтоб упростить сложные объявления.

vvviperrr ★★★★★ ()
Ответ на: комментарий от Pavval

Удачного синтаксиса для таких случаев до сих пор не придумали, выкручиваются костылями

Разнос сложных объявлений на несколько строк

В С++11 using

а еще есть из коробки вменяемый синтаксис паскаля

MyTrooName ★★★★★ ()
Ответ на: комментарий от kravich

Хде неудобно ?

var i : integer = 10;
Указатель с именем i на область памяти размера dword (если моя память не изменяет), которую инициализируем значением 10.
writeln(i);
Здесь очень сложно получить сегфолт, например. Даже если сделать i:=-100; :)

А кто помешает присвоить указателю -100 в сях ?

handbrake ★★★ ()
Ответ на: комментарий от vvviperrr

И это тоже костыль. Рабочий, здорово упрощающий запись, но костыль. Вообще, без возможности рисовать прямо в коде диаграммки из теорката тут проблему принципиально не решить. К счастью, решать её не надо.

userid2 ()

Моя ставка: массив из пяти указателей на ф-ию, принимающие флоат, возвращающие структуру по значению. Тред не читал.

nanoolinux ★★★★ ()

Знает С - поржал.

struct tag (*[5])(float)

Выкинь то, где ты это прочитал. Сия конструкция ничего не означает.

Имя пишется в конструкции.

Эта конструкция бесползна. Юзают структуры через struct только нулёвые бомжи, а норм пацаны юзают через тайпдеф.

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

typedef tag_t fun_t(float f);//можно скобочки не писать.
typedef fun_t * funm5_t[5];
fun_t * m[5] = {};

Указатель:

typedef tag_t (*fun_t)(float f);//скобочки прикрепляют звёздочку к fun_t.
typedef fun_t funm5_t[5];
fun_t m[5] = {};

Надо понимать зачем нужны скобочки, и что тайпдеф ничем не отличается от объявления функции.

Нормальные сишники такие конструкции не пишут, а тех кто пишет надо выкинуть в окно.

anonymous ()
Ответ на: комментарий от anonymous

Выкинь то, где ты это прочитал. Сия конструкция ничего не означает.

стандарт языка, говоришь, выкинуть? )

Harald ★★★★★ ()
Ответ на: комментарий от Harald

Это не валидная конструкция, если она написана в стандарте - выкинь его. Либо осиль копипастить нормально.

Ещё раз для нулёвых, функция всегда имеет синтаксис функции:

int f(int a, int b);
int f(int a, int b) {}

typedef int f_t(int a, int b);//f_t тип.

typedef int (ТУТ ТИП*f_t)(int a, int b);//это уже указатель(тип задаётся неявно), но синтаксис такой же, сначала типа возврата, потом ИМЯ, потом аргументы.

И ещё раз, МЕЖДУ типом возврата и списком аргументов ВСЕГДА ЕСТЬ ИМЯ.

Бедная сишка, за что ей такие юзеры.

anonymous ()
Ответ на: комментарий от anonymous

Это не валидная конструкция

в объявлении функции валидная, например

vvviperrr ★★★★★ ()
Ответ на: комментарий от anonymous

Это не валидная конструкция, если она написана в стандарте - выкинь его.

Ладно.

28 EXAMPLE 2 The type designated as ‘‘struct tag (*[5])(float)’’ has type ‘‘array of pointer to
function returning struct tag’’. The array has length five and the function has a single parameter of type
float. Its type category is array.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

edigaryev ★★★★★ ()

Хочется сказать «указатель на массив из 5 функций», но тогда это невалидное объявление.

tailgunner ★★★★★ ()

массив из 5 указателей на функцию возвращающую struct tag с одним float аргументом

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от tailgunner

Хочется сказать «указатель на массив из 5 функций»

хочется сказать, что в си не бывает «массива функций»

vvviperrr ★★★★★ ()
Ответ на: комментарий от edigaryev

Ладно.

Ещё раз для нулёвых - это описание типа, тип - это не конструкция языка. Тыж там кукарекал про конструкцию.

Дак вот, тут написанно как разберать сей тип и что это за тип, который а) не имеет смысла, б) не является конструкцией языка.

char[10] - это тоже тип, но не конструкция языка. Чистые «типы», типа твоего можно юзать только в кастах. (struct tag (*[5])(float)) - это уже конструкция языка, и то не полная без указания того, что кастуется.

Давай что-то по проще:

123, 123, 123, 123// - это не конструкция языка
{123, 123, 123, 123}// - это уже конструкция, и то не полная - реально там неявный автотип.
(int[4]){123, 123, 123, 123}// - вот полная конструкция.
anonymous ()
Ответ на: комментарий от anonymous

Ещё раз для нулёвых - это описание типа, тип - это не конструкция языка.
Тыж там кукарекал про конструкцию.

Кукарекаешь здесь только ты:

struct tag (*[5])(float)

Выкинь то, где ты это прочитал. Сия конструкция ничего не означает.

edigaryev ★★★★★ ()

массив из 5 функций принимающих float и возвращающих struct tag

anonymous ()

Вот смотрите, все, вы даже не можете однозначно определиться что эта хрень в описании означает. Офигительный продакшн язык.

handbrake ★★★ ()
Ответ на: комментарий от handbrake

Вот смотрите, все, вы даже не можете однозначно определиться что эта хрень в описании означает

Кое-кто не может в чтение.

tailgunner ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.