LINUX.ORG.RU

Функция, возвращающая указатель на функцию такого же типа

 , ,


0

3

Возможно ли в C или C++ сделать чтобы функция возвращала (или например принимала в качестве аргументов) указатель на функцию такого же типа, что у нее самой?

Вариант

typedef funct * (*funct)(void);
не работает.

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

Интересно, сколько всего в мире людей, прочитавших стандарт на C99 от корки до корки? Тот же вопрос про прочитавших последний свободно доступный черновик стандарта на C99.

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

такой травы как у тебя у меня, увы, нет

А при чем тут трава? Никто же не говорит, что это очень плохо или критично. Просто система типов в C++ это позволяет выразить, а система типов в Си - нет. А тут ведь даже до пользовательских типов дело не дошло.

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

и правильно не нашёл. 6.2.5.27 начинается со следующего предложения: «A pointer to void shall have the same representation and alignment requirements as a pointer to a character type». дальше идёт про то что указатели на встроенные типы должны быть такими же. указатели на структуры должны быть совместимы между собой; то же самое про объединение. в конце ВНЕЗАПНО: «Pointers to other types need not have the same representation or alignment requirements».

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

Где про длину? Ты так и не ответил.

Собственно я так и не увидил противоречий между равенством void * и void (*)(), ты пока что поставил волнистое равно между ними, что собственно не делает их не равными.

Хотя что я с тобою разговариваю, меня интересуют проблемы говна.

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

меня интересуют проблемы говна.

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

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

Ты не понимаешь, о чем речь? Какой код? Тебе говорят, что на Си нельзя вернуть тоже, что «возвращает» *. Что тут неясно?

int & get_ref(int *p)
{
    static int dflt = 100500;
    if (p) {
        return *p;
    }
    return dflt;
}

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

Ты не понимаешь, о чем речь? Какой код?

Обычный код, кукарекнул, что чего-то там не возвращает - показывай пример.

int get_ref(int *p)
{
    static int dflt = 100500;
    if (p) {
        return *p;
    }
    return dflt;
}

Ну и? Чего ты этим хотел добиться?

Если ты, нулёвый балабол, пытаешься со своим скудоумием мне показать ссылку, нихрена не понимая о чем кукарекаешь, то я тебя удивлю, но ссылка - это сахар.

int * get_ref(int *p)
{
    static int dflt = 100500;
    if (p) {
        return p;
    }
    return &dflt;
}

*get_ref(int * p).

Что сказать-то хотел?

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

то я тебя удивлю, но ссылка - это сахар.

Это относительно. Я тебе еще раз спрашиваю, как мне вернуть результат * в Си. Никак? Тогда ссылка - это не сахар.

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

Что сказать-то хотел?

Я уже сказал. Если ты не можешь понять, то дело в тебе.

*get_ref

А для

#define get_ref(p) (*(p))
Мне тоже пришлось бы еще один раз писать *? Нет? Так покажи, как мне такую функцию сделать?

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

Опиши стандартный сишный оператор * как функцию. Сможешь? Для C++ это выглядело бы как-то так

int & operator * (int *p);

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

Это относительно. Я тебе еще раз спрашиваю, как мне вернуть результат * в Си. Никак? Тогда ссылка - это не сахар.

Я тебе уже привёл код, который делает тоже самое, что твоё говно которые ты мне запостил. Ты совсем крякнутый?

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

Я уже сказал. Если ты не можешь понять, то дело в тебе.

Подожди, ты кукарекаешь, что сишка что-то там не может. Ты уже некомпетентный балабол и разговор с тобою не имеет смысла.

Далее, ты не можешь высрать код, который сишка не может, а на всём том, что ты выкладываешь -ты обсираешься. Где код? С поведением не реализумым на си.

А для

Что это за говно? Что для? Ты мне код показывай, я не херню невудомую.

Мне тоже пришлось бы еще один раз писать *?

Чего писать, куда писать. Олё, вася - ты выкатываешь код на крестах и показываешь поведение, которые не реализуемо на си. Что там может система типов то, что не может сишная. Или что ты там мне пытаешься сказать.

Код, ты понимаешь слово код? Ах да, ты ведь его не выкатишь, ибо обосрёшься, как обосрался уже 2раза. Ну попытайся третий.

Так покажи, как мне такую функцию сделать?

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

Показать как сделать другую - высирай другую, рожей мокну ещё раз вговно.

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

Где про длину? Ты так и не ответил.

английский сейчас, вроде, со второго класса учить начинают...

representation

это

меня интересуют проблемы говна.

с этим никто не спорит

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

Опиши стандартный сишный оператор * как функцию. Сможешь? Для C++ это выглядело бы как-то так

Какую нахрен функцию? К чему ты это высрал - это никакого отношения к типам не имеет. Нахрен она мне нужна? Ты мне юзкейс применения так и не осилил высрать, только в штаны насрать - единственное, что ты смог.

Ты знаешь что такое сахар? Давай я тебе объясню - это алиас для какой-то операции. Понимаешь, алиас. Когдаж до вас, школьников дойдёт.

И ещё одно, никому не интересно что там есть в твоём недоязычке - интересно применение, юзкейс. Т.е. оно должно уметь делать то, что не может другой ЯП(в данном случае ты кукарекал, что типы с сишке чего-то там не умеют, но т.к. ты благополучно обделался - ты слился на операторы). Но это сахар, вот облом да. И что бы это значило? Что это просто алиас той самой сишной операции.

Для C++ это выглядело бы как-то так

Мне насрать что и как там выглядело бы у нулёвой школоты. Ты мне выкатываешь код.

TrueTsar1C
()
Ответ на: комментарий от i-rinat

исо-стандарт — это справочник. соответственно, эффективно пользоваться им может только тот кто разбирается в предмете. для остальных есть учебники.

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

С поведением не реализумым на си.

А об этом речи не было. Ты понимаешь значение слова «выразим» в контексте языка? Более простой пример. Ты не можешь выразить перегрузку операторов в Си. Но ты можешь реализовать такое же поведение через обычные функции.

Что там может система типов то, что не может сишная. Или что ты там мне пытаешься сказать.

Система типов в C++ позволяет выразить операцию, аналогичную *, т.к. имеет ссылки. В Си, где ссылок нет, эту операцию в виде функции выразить нельзя. Все.

Код, ты понимаешь слово код?

Я тебе показывал пример. Для иллюстрации этого вполне достаточно. Но, видимо, твой уровень знаний Си и других языков не позволяет тебе понять о чем речь.

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

Нет, ты не показал. Ты показал возврат указателя. И мне нужно будет к результату применять *.

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

английский сейчас, вроде, со второго класса учить начинают...

Переведи мне вот это пожалуйста, не обосрить, пж:

The same representation and alignment requirements are meant to imply interchangeability as

arguments to functions, return values from functions, and members of unions.

Просто интересно, а что это значит - в мой школе начинали учить с 5-го, а я учился только до 3-го.

representation

Открываем словарик:

representation: варианты перевода
имя существительное
представление
representation, presentation, idea, represent, submission, performance
представительство
representation, agency
изображение
image, picture, portrait, portrayal, portraiture, representation
образ
form, image, imagination, imago, character, representation
спектакль
performance, play, show, spectacle, theatrical, representation
утверждение
affirmation, approval, statement, assertion, claim, representation
заявление
statement, application, declaration, pronouncing, proposition, representation
протест
protest, caveat, protestation, revolt, objection, representation

Длинны нет, странно, да? Представление - это состовное понятие, в которое входит та самая длинна, которая правда нигде не определена и не описана, ну да ладно.

Т.е. ты высрал своё утверждение и уличил меня в чем-то на основании возможное отклонения неописанного свойства возможно иного представления для одного из видов.

Собственно всё остальное ты проигнорил, собственно делаю вывод - ответить нечего.

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

Нахрен она мне нужна?

Ну тогда просто согласись, что на Си это не выразить, но это и не нужно. Это вполне годный ответ.

Ты знаешь что такое сахар? Давай я тебе объясню - это алиас для какой-то операции. Понимаешь, алиас. Когдаж до вас, школьников дойдёт.

Ты больше похож на школьника. У тебя или запущенный синдром утенка или, того хуже, Си головного мозга. Ты на все смотришь сквозь призму Си.

интересно применение, юзкейс.

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

Т.е. оно должно уметь делать то, что не может другой ЯП

В плане реализации? Глупости. А вот в системе типов в Си многое нельзя. В том числе изначальный вопрос ТС не выразим в Си(в C++ способ есть), хотя и реализуем через костыли.

что типы с сишке чего-то там не умеют, но т.к. ты благополучно обделался - ты слился на операторы

Я изначально и говорил про оператор *. Его результат какого типа? В Си - просто int, но при этом он возвращает не новое значение, а позволяет записывать в ту область памяти, на которую указывает указатель, хотя в системе типов это не отражено вообще никак.

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

кто разбирается в предмете

Чтобы разбираться в предмете недостаточно прочитать учебник. Рано или поздно придётся читать стандарт. Либо явно, либо неявно, как в подобных обсуждениях, где всё равно всплывают цитаты из текста.

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

А об этом речи не было. Ты понимаешь значение слова «выразим» в контексте языка?

Меня не интересуют твой оправдания. КОд где? Значение слова «выразим» - где?

Более простой пример. Ты не можешь выразить перегрузку операторов в Си.

Что значит не можешь? Я могу.

Но ты можешь реализовать такое же поведение через обычные функции.

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

Теперь ты мне показываешь тип, который си не может выразить. Конкретный тип.

Я тебе показывал пример. Для иллюстрации этого вполне достаточно. Но, видимо, твой уровень знаний Си и других языков не позволяет тебе понять о чем речь.

И на этом мримере ты благополучно обосрался, собственно поэтому примеры и перестали поступать.

Но, видимо, твой уровень знаний Си и других языков не позволяет тебе понять о чем речь.

А, дак ты похоже тот ламерок из жабаскрипт темы, который так же серанул. Ну удачи.

Нет, ты не показал. Ты показал возврат указателя. И мне нужно будет к результату применять

И что же из этого следует? Ты понимаешь какую херню ты несёшь?

Система типов плюсов не может представить p; - вот тебе пример:

void * f() {return p;}
int * i = f();

Очередной балабол, который бует нести херню, делать вид, что он не обосрался и продолжать кукарекать «я тебе не объясню - тебе не понять.»

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

Переведи мне вот это пожалуйста, не обосрить, пж:

пытаешься прикрыть свою обосранную жопу флудом? не выйдет. я сказал что ещё и накормлю тебя говном.

там написано следующее:

1. representation и alignment одинаковые — можно кастить неявно

2. одинаковый только representation — можно кастить явно. компилятор может поправить alignment за тебя

3. разные — кастить нельзя. если это работает на твоём локалхосте, это ещё совсем не значит, что будет работать где-то ещё.

и уличил меня в чем-то

не в «чем-то», а в том, что ты не знаешь что нельзя кастить void * к указателю на функцию.

всё остальное ты проигнорил

пруф?

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

Ну тогда просто согласись, что на Си это не выразить, но это и не нужно. Это вполне годный ответ.

Что значит не выразить, ты продолжаешь нести херню. Никому не интересно выражение уровня синтаксиса. Оно везде разное, поэтому не имеет смысла.

В том числе изначальный вопрос ТС не выразим в Си(в C++ способ есть), хотя и реализуем через костыли.

Вперёд - выражай.

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

Выразить - это выразить. Понимаешь, вася. Выразить твою ссылку можно и на тонне других недоязычков, правда с иным синтаксом и тут ты обосрёшься. Тут ты либо принимает, что выражение есть семантические, либо жрёшь говно - всё просто. Что же ты выберешь?

Я изначально и говорил про оператор *. Его результат какого типа? В Си - просто int, но при этом он возвращает не новое значение, а позволяет записывать в ту область памяти, на которую указывает указатель, хотя в системе типов это не отражено вообще никак.

Ещё раз вася, оператор * в крестах такой же, как и в си.

Только есть синтаксический сахар, который позволяет оператор заменить на вызов произвольной функции.

В Си - просто int, но при этом он возвращает не новое значение, а позволяет записывать в ту область памяти, на которую указывает указатель, хотя в системе типов это не отражено вообще никак.

Какой нахрен инт? В си это разименование, которое такое же по дефолту и в крестах. Операция разименования возвращает тип, на который указывается указатель, который разименуется.

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

Щито?

TrueTsar1C
()
Ответ на: комментарий от i-rinat

если ты о моей цитате, то я открыл стандарт и нашёл нужное место. читал ли я его (место) раньше — возможно да, не помню. читал ли в процессе «от корки до корки» — точно нет.

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

пытаешься прикрыть свою обосранную жопу флудом? не выйдет. я сказал что ещё и накормлю тебя говном.

КО-ко-ко-ко, какой грозный игнорщик.

там написано следующее:

Ты мне полный перевод давай, а не свой высер.

Давай, давай - я жду. Отсрачивай свою кончину, смишная лалка.

не в «чем-то», а в том, что ты не знаешь что нельзя кастить void * к указателю на функцию.

Где сказано, что это нельзя, вася? Уже жопка пригорает. Ты пытаешься съюлить и обойти предыдущую цитатку.

пруф?

Ты ответил на тему ~= и т.д.?

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

Ты мне полный перевод давай, а не свой высер.

за точный перевод мне платят деньги. да и не поможет это: тебе нужно объяснять на уровне олигофрена (см соседнюю ветку про синие треугольники) что я и попытался сделать выше.

Где сказано, что это нельзя, вася?

нигде не сказано что можно. а на всё что можно в стандарте должна быть «цитатка»

Ты пытаешься съюлить и обойти предыдущую цитатку.

т.е. понять её смысл что типы являются взаимозаменяемыми только если у них совпадают и representation, и alignment ты так до сих пор и не смог?

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

Ты ответил на тему ~= и т.д.?

была такая тема? ~ — унарный оператор, поэтому у него не может быть формы ~=. что ещё тебе непонятно?

anonymous
()

Огласите юзкейсы, пжалста!

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

за точный перевод мне платят деньги. да и не поможет это: тебе нужно объяснять на уровне олигофрена (см соседнюю ветку про синие треугольники) что я и попытался сделать выше.

Слив засчитан.

нигде не сказано что можно. а на всё что можно в стандарте должна быть «цитатка»

Слив засчитан.

т.е. понять её смысл что типы являются взаимозаменяемыми только если у них совпадают и representation, и alignment ты так до сих пор и не смог?

Пытайся дальше в жалких попытках соврать.

Давай я за тебя перевиду и мы поставим точку и увековечим навечно твои обоссанные штанички.

The same representation and alignment requirements are meant to imply interchangeability as arguments to functions, return values from functions, and members of unions.

Для аргументов и возрата функций, а так же для членов объединений representation и alignment всех типов указателей должно быть взаимозаменяемо на/к void *.

Т.е.

union u {
  void * ptr;
  union t * uptr;
  void (*fptr)();
};
  u.fptr = f;
  void (*fptr)() = u.ptr;//валдино

void * f() {
  return f2;
}

 void (*fptr)() = f(); // валидно.

А теперь сделай глубогий вдох - ты погружаешься.

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

1. по английскому тебе 2: в тексте нет void *

2. по логике тоже: «x» are meant to imply «y» твой мозжечок переводит как «x» must be «y»

забавно ты чавкаешь говном. продолжай.

anonymous
()
struct caller;

typedef struct caller (* call_func)(int t);

struct caller {
    call_func func;
};

struct caller call( int i )
{
    struct caller ret = { func: call };
    printf( "i = %d\n", i );
    return ret;
}

int main(void)
{
    call( 1 ).func(2).func(3).func(4).func(5).func(6).func(7);
    return 0;
}

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

Обсёр задокументирован.

1. по английскому тебе 2: в тексте нет void *

Сноска относится к воиду - жопа разорвана раз..

2. по логике тоже: «x» are meant to imply «y» твой мозжечок переводит как «x» must be «y»

К чему ты это высрал? Перевода не будет, я так понимаю? Ну не вонуйся, не волнуйся. Так яро начать уличать, а потом так серануть и делать вид, что ничего не произошло.

забавно ты чавкаешь говном. продолжай.

Как это мило, когда кого-то обвиняешь в том, что делаешь сам. Дак что, перевод сноски будет?

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

Независимый эксперт, тебе вопрос, переведи пожалуйста:

39) The same representation and alignment requirements are meant to imply interchangeability as
arguments to functions, return values from functions, and members of unions.

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

А вообще, топик это мозголомство чистой воды и сексуальное извращение)

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

Обсёр задокументирован.

согласен. но в треде появился модератор. может всё потереть. делай нотариально заверенные скриншоты пока не поздно.

Сноска относится к воиду - жопа разорвана раз..

это не ты прокукарекал? «Давай я за тебя перевиду». теперь напряги свой порванный сфинктор и покажи мне какие именно буквы в переводимом предложении обозначают void *. или «перевиду» это в твоём воспалённом воображении не то же самое что у нормальных людей «переведу»?

К чему ты это высрал?

к тому что твоя шизофрения «из х следует у» переводит как «х равно у»

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

Операция разименования возвращает тип, на который указывается указатель, который разименуется.

Насколько я понял, тебе говорят о том, что если ты возвращаешь int из функции, то получишь копию инта и в другой области памяти, чем исходная. Когда int «возвращает» *, то ты получаешь не копию, а как бы ссылку на тот int, на который указывал указатель.

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

до него не доходит что в с++ функция может вернуть lvalue. в си же не может, а на этом его убогий мирок заканчивается.

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

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

Тоже самое и в крестах.

Когда int «возвращает» *, то ты получаешь не копию, а как бы ссылку на тот int, на который указывал указатель.

Я получаю значение, ну и?

Есть 2 сущности - значение и значение объекта, как доступ к его реальному состоянию. Значение не может быть копией не копией - оно всегда едино. Доступ к реальному состоянию ты получаешь через указатель, операцией разименования.

В крестах есть ещё одна сущность, которая позволяет получить доступ к состоянию без операции разименования - это ссылка. Вернее как, без явной операции разименования.

Теперь ты мне объясни, как из этого следует то, что отсутвие явной операции делает невозможным получить тот же результат явной, если в данном контексте сематически их поведение идентично?

****

Ну и, что из этого следует? Пацан себе хочет указатель с синтаксисом не указателя - это ссылка, только к чему он это кукарекает - это не имеющий смысла сахар.

Т.е. балабол путает ситаксический сахар с реальным миром. Он там может себе что угодно хотеть - меня это не интересует. Это не тип - это просто маска.

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