LINUX.ORG.RU

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

Если нужно подробнее:
(void(*)()) приведение к указателю на функцию вида:

void func() {}
ну, а дальше наверно понятно?

anonymous
()

Выполнить то что по адресу decoder как void функцию

mittorn ★★★★★
()

Ну на доже

anonymous
()

Да, anonymous и mittorn абсолютно правы.
Вызов функции по указателю:

#include <stdio.h>
  
void test(void)
{    
    printf("%s: Hi\n", __func__);
}
  
int main(int argc, char *argv[])
{   
    void (*(*decoder)())();
  
    decoder = test;
      
    (*(void(*)())decoder)();

    /* Or */
    /* ((void(*)())decoder)(); */
    
    return 0;
}
uglym8
()
Ответ на: комментарий от Crocodoom

Правда всё выражение он не осиливает :(

Что не удивительно. Было бы странно, если бы парсер объявлений разбирал все выражения.

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

decoder - это оказывается массив ...

Я это читаю как: указатель на функцию, возвращающую void на массив из указателей на функцию ...

Не прав?

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

Ну строго, говоря decoder может указывать на что угодно, но в данном случае его (адрес) используют в качестве указателя на функцию.
Что лежит по этому адресу - это уже второй вопрос.
То есть ничто не мешает обявить массив указателей void *, которые в действительность есть указатели на функции и радостно их вызывать.

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

Хороший говнокод.

Такие конструкции надо заменять на приведение к предварительно определённому типу.

не говоря уже об отсутствии аргументов у функции вместо (void)

Sorcerer ★★★★★
()
Последнее исправление: Sorcerer (всего исправлений: 1)
Ответ на: комментарий от Crocodoom

https://godbolt.org/g/7F4CzL

P.S. Кстати, разыменование полученного после каста указателя не нужно, всё равно потом обратно преобразуется к указателю на функцию (function to pointer decay).

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

С чего бы? Хороший код.

Хороший код должен быть понятным.

anonymous
()

Выражение можно упростить и тогда становится более яснее :)

/* Указатель на функцию которая ничего не принимает  ничего не возвращает */
typedef void (*f)();

/* А тут получается decoder это указатель, который приводят к указателю на функцию f,
   а затем исполняют её */
((*f) decoder)();

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

Вопрос был не в том, как нужно написать, а то, что эта запись означает ....

Я это читаю как: указатель на функцию, возвращающую void на массив из указателей на функцию ...

anonymus123
() автор топика

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

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

В комментариях описано как это работает.

Если надо текстом, то вот так: «сначала decoder приводится к указателю на функцию, которая ничего не принимает и не возвращает, а затем происходит вызов функции без параметров через приведённый этот указатель.»

Hamsteri
()

На тебе небольшой пример КА, чтобы понятно было, зачем это может применяться:

#include <stdio.h>

void first(){printf("first\n");}

int second(){printf("second\n"); return 3;}

void third(char *str){printf("third, str=%s\n", str);}

int main(){
    void *fptr;
    char* strings[3] = {"wait a little", "one more time", "this is the last"};
    int state = 1, i = 3;
    fptr = (void*) first;
    while(state){
        switch (state){
            case 1:
                (*(void(*)())fptr)();
                fptr = (void*) second;
                state++;
            break;
            case 2:
                state = (*(int(*)())fptr)();
                fptr = (void*) third;
            break;
            case 3:
                if(i == 0){ state = 0; break;}
                (*(void(*)())fptr)(strings[--i]);
            break;
            default:
                return 1;
        }
    }
    return 0;
}
Запускаем:
first
second
third, str=this is the last
third, str=one more time
third, str=wait a little

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

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

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

Ты в каком веке живешь? Не надо в скобках (void) писать, это тебе не C66!

Если говнокод писать, то не надо. А так - надо. :) Передайте что-нибудь в эту вашу функцию «без параметров» и удивитесь.

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