LINUX.ORG.RU

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

Не понятно что за сообщение, то ли это ман по утилите cdecl(1) толи это ссылка на соглашение о вызове. Ни то ни это не дало разъяснения, может я просто не вижу связи?

normann ★★★
() автор топика

И вообще что такое это int (pf)(int)?

Это означает тоже самое, что и без скобок вокруг pf - обычное объявление функции. В случае с указателем на функцию, скобки необходимы для того что бы не путать с объявлением другой функции, возвращающей указатель на int.

int* pf(int)

pathfinder ★★★★
()

Почему бы не использовать std::function если ты уж на плюсах пишешь? Сишные указатели на функции довольно мозголомны и требуют излишней вдумчивости.

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

Ясно. Значит была опечатка там где я это увидел (typedef void (SIG_ARG_TYP)(int)). Большое спасибо.

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

typedef int (func_type1)(int a,int b);

extern func_type1 func1;
extern func_type1 func2;
extern func_type1 func3;
extern func_type1 func4;

и где в других местах написана реализация функций func1,func2,func3,func4.

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

Мне бы сначала на основных средствах языка опыта поднабраться, да и к тому же не хочу пока что применять c++11, рановато мне кажется.

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

Смотри сам, но эта конструкция не зря появилась. А именно из-за неудобства Си-варианта. Да и «рановато» — это ты зря. Уже 14й год идёт к завершению. Скоро выйдет очередной стандарт. А ты прямо как тот несчастный, который сегодня в толксах спрашивал про С89.

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

Сишные указатели на функции довольно мозголомны и требуют излишней вдумчивости.

если указатели на функции «мозголомны», то не стоит дальше изучать С/C++. лучше сразу перейти к питону/жабе и не мучить свой слабый мозг. может быть, даже подумать о карьере в другой области, не связанной с программированием.

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

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

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

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

Я вырос на Си и сталкивался с этой дрянью довольно много

самокритично.

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

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

Язык программирования C++

Объявление требует скобок вокруг *pf, чтобы обеспечить правильный приоритет операций. Скобки имеют более высокий приоритет, чем операция *, поэтому *pf(int) означает, что pf() — функция, которая возвращает указатель, в то время как (*pf) (int) означает, что pf — указатель на функцию:
double (*pf)(int); // pf указывает на функцию, возвращающую double
double *pf(int); // pfО — функция, возвращающая указатель на double

Вот ещё пример:

#include <QCoreApplication> #include <QTextStream>

int test(int q) { return q; }

int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTextStream cout(stdout);

int(&test)(int) = qwe;

cout << test(1) << endl;

return a.exec(); }

test - всего лишь переменная (теперь ссылочная), типа int(&)(int), и принимать она должна соответствующий ей тип;

В случае если мы объявим int(test)(int), т.е. не указатель и не ссылка, то логически остаётся один вариант, это функция, мы определили прототип функции:)

Пример:

#include <QCoreApplication> #include <QTextStream>

int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTextStream cout(stdout);

int(test)(int);

cout << test(1) << endl;

return a.exec(); }

int test(int q) { return q; }

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

правильно. не надо лезть в дебри, пока твёрдо не усвоишь основы.

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

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

Ребят, остановитесь, я не спрашивал вас об опыте разработки и программирования в общем, я спрашивал вас о конкретной конструкции конкретного языка, ответили, достаточно. Только дай волю, сразу каждый горазд мастера ёду изображать, и холивары чинить. Смотрю тут и новички в бой лезут :))))

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

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

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

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

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

если указатели на функции «мозголомны», то не стоит дальше изучать С/C++

Вы пытаетесь отогнать от себя мысль, что нотация в сях кривущая?.. Насколько проще ведь читается: f : Ptr (Int -> Int).

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

Не-а, там в родном коде нет Ptr, а в FFI - для функций FunPtr (ну и :: в сигнатуре). Просто альтернативная нотация, по мотивам. Хотя может где-то такая и есть.

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

Вы пытаетесь отогнать от себя мысль, что нотация в сях кривущая?.. Насколько проще ведь читается: f : Ptr (Int -> Int).

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

Чем проще читается? Объяснить хоть осилишь? А так же - чем же всётаки конкретно нотация в сях кривущая?

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

cast kravich

`Ptr (Int -> Int)` вполне возможна, но большого смысла не несёт, т.к. то, что в сях значится `Ptr (Int -> Int)` в хацкеле `Int -> Int`.

Указатель на сишную функцию (если его надо передавать как параметр) `:: FunPtr (Int -> IO Int)`, для простого вызова функции просто генерится wrapper.

foreign import [un]safe "header.h/foo" foo_c :: CInt -> IO CInt

тут `IO` по желанию для чистых функций можно его не писать.

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

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

Если ты её не понимаешь - это не значит, что она кривая

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

Объяснить хоть осилишь?

Не надо зигзагом изнутри-внутрь читать. Более «консистентая»: если такой тип аргументом, то в сигнатуре си (без typedef само собой) нужно имя функции. А здесь просто справа добавится стрелочка. Так что «обтекай, лалка» (c).

чем же всётаки конкретно нотация в сях кривущая?

1) Сигнатура к именам сильно привязана; 2) * - «обратный порядок» (читается как «после разыменования получим такой-то тип»); 3) Практика показывает, что есть более удачная нотации, хотя допускаю, что твой насест недостаточно высок, чтобы это увидеть.

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

`Ptr (Int -> Int)` вполне возможна

Хм, а Ptr разве не предполагает Storable (Ptr a); или что-то не знаю и можно так функцию завернуть?

Указатель на сишную функцию (если его надо передавать как параметр) `:: FunPtr

Дык, тема-то не про хаскель, чтоб так акцентировать (да и kravich-у вряд ли нужны сии детали), али я что не так про funptr сказал?

В любом случае типы записываются на порядок адекватнее

Само-собой, да и время было (зато в с обычно короче), единственное, что одно двоеточие было бы халяльнее.

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

Хм, а Ptr разве не предполагает Storable (Ptr a); или что-то не знаю и можно так функцию завернуть?

castFunPtrToPtr есть (или как-то так), так что формально возможна.

Дык, тема-то не про хаскель, чтоб так акцентировать (да и kravich-у вряд ли нужны сии детали), али я что не так про funptr сказал?

все так, просто я решил, что можно дополнить, может и не прав

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

Зачем женщиной прикидываться?

(сорри за оффтоп)
ну, какбэ биологически я - женщина. и тут ничего не поделать. :)

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

что касается форума: я фанат-люнюксоид, у меня за плечами дофига лет в программировании и в разработке железа, причём недеццкой такой разработке. ну и плюс программирование ради развлечения, в свободное от работы время. так что мне есть что сообщить по теме С или С++.

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

Почему сразу опечатка. Ты не знаешь во что раскрывается макрос.

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

Мне сложно поверить что под этим аккаунтом скрывается действительно женщина, и что она действительно может иметь такой склад ума. И к тому же все знают «на лоре нет женщин» )).

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

castFunPtrToPtr есть (или как-то так), так что формально возможна.

Дык, наверное низкоуровневая операция и отвественность на программисте, что никакие инварианты там не нарушит. Все равно не совсем понимаю, как (для родного кода, т.е. экспорт, а потом импорт не считается) получить:

`Ptr (Int -> Int)` вполне возможна

anonymous
()
Ответ на: Язык программирования C++ от CriDos

А как такое логически правильно воспринимать:

class isOdd
{
public:

    bool fun(int x)
    {
        return x % 2;
    }

};

bool (isOdd::*PointerToSomeFun)(int x) = &isOdd::fun;

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

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