Вопрос по C, задание функции

bbb45

Народ, подскажите, можно ли в C сделать следующее.
У меня есть функция, скажем, от 3 аргументов double f(double, double, double).
Я хочу объявить функцию g(x)=f(a,b,x где a и b будут всё время постоянными, и потом передать её процедуре proc в качестве аргумента.
Объявление процедуры такое:
void proc(double (*fdouble.
Если бы функция f была просто от одного аргумента, то можно было бы написать g=f, а потом запустить процедуру с параметром g. А как сократить количество аргументов?

tokuchu

double g(double x) { return f(a, b, x); }

okis

Обернуть её в функцию от одного аргумента, а её уже передавать.

bbb45

он пишет local function definitions are illegal (я эту строчку внутри функции, откуда я собираюсь запускать proc написал).
Или её надо объявлять отдельно, а переменные a и b глобальными делать? Можно как-то без глобальных переменных?
To : а как это завернуть?
Я прошу прощения за ламерские вопросы, просто достаточно редко программирую.

okis

Или её надо объявлять отдельно, а переменные a и b глобальными делать? Можно как-то без глобальных переменных?
To : а как это завернуть?
Да, именно так, как показал . Переменные должны быть глобальными.

bbb45

Или её надо объявлять отдельно, а переменные a и b глобальными делать? Можно как-то без глобальных переменных?
To : а как это завернуть?
Спасибо вам с ом!
Ладно, буду делать с глобальными, хотя с локальными было бы посимпатичнее, но, видимо, это никак не делается в C.

apl13

видимо, это никак не делается в C.
Ты вообще-то хочешь фичу функционального языка.

Werdna

double g(double x) { return f(a, b, x); }
Я бы ещё написал inline...

tokuchu

Я бы ещё написал inline...
А то строчка слишком короткая? :grin:

Werdna

А то строчка слишком короткая? :grin:
Кашу маслом не испортишь.

Valentin_1978

Можно как-то без глобальных переменных?
Почему бы не передать их в функцию вместе с х?
 double g(double x, double a, double b) { return f(a, b, x); } 

rosali

> Почему бы не передать их в функцию вместе с х?
потому что тогда нельзя будет вызвать proc(g)

rosali

поскольку в C нет замыканий, то объявлять функции наподобие
void proc(double (*fdouble
не самая лучшая идея. обычно делают что-то в духе
void proc(double (*fvoid *, double void*)
то есть эмулируют замыкания вручную. по этому void* будет лежать контекст замыкания, в твоем случае туда как раз можно положить эти a и b, которые тебе так не нравится класть в глобальные переменные (и очень правильно не нравится, подумай как ты будешь мучаться с таким кодом в случае мультитрединга). ведь эти a и b у тебя на самом деле не совсем константные? если бы это были просто константы, то ты бы мог просто написать
double g(double x) { return f(42, 666, x); }
и вопрос о том глобальные это переменные или локальные не стоял бы. а раз ты об это волнуешься, то видимо эти "константы" постоянно только на время работы proc, а к следующему её вызову они уже должны быть другими да?

Maximilian

#define mask(I) (intint 5760.*(ceil(fabs(I)/5760. +I)*(I<0) +(intI-5760.*floor(I/5760.*(I>=0
я как то по пьяни придумал такую тему для элементов массива - нужно было чтобы массив был циклический,бесконечный и чтобы можно было обращаться по отрицательным индексам
вызов array[maskI]
идея пришла когда просматривал коды gsl примерно здесь
 http://www.gnu.org/software/gsl/manual/html_node/Fitting-Examples.html
они прям по середине в коде объявляют
#define C(i) (gsl_vector_get(ci
#define COV(i,j) (gsl_matrix_get(covij
чтобы сократить число переменных, просто кладёшь константы в дефайн например
#define COV(i) (gsl_matrix_get(covi55555555

Serab

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

tokuchu

#define mask(I) (intint 5760.*(ceil(fabs(I)/5760. +I)*(I<0) +(intI-5760.*floor(I/5760.*(I>=0
Ай, как не хорошо.
#define mask(I) (intint 5760.*(ceil(fabs((I))/5760. +(I))*((I)<0) +(int(I)-5760.*floor((I)/5760.*((I)>=0
А вот тут-то зачем "l" в дополнительные скобки брать?
вызов array[maskI]

Serab

а можно для необразованных: зачем в fabs'е еще в одни скобки брать?

Serab

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

tokuchu

а можно для необразованных: зачем в fabs'е еще в одни скобки брать?
Ну так, на всякий случай. :)
Если будет вызов, например: mask(a, b, c). Хотя нет, гоню, тут наверное препроцессор всё же ругнётся.

Maximilian

#define mask(I) (intint 5760.*(ceil(fabsI/5760. +(I*I)<0) +(intI)-5760.*floorI)/5760.*I)>=0
да, действительно, не нужны вторые скобки для (I это видимо рудимент (там когда то было (I+2880) )
а если обращаешься array[mask(I)], то нужны двойные скобки, иначе компиллятор гонит, что индекс массива не int

tokuchu

а если обращаешься array[mask(I)], то нужны двойные скобки, иначе компиллятор гонит, что индекс массива не int
мне не говорит

Ivan8209


frobnicate.c:110: error: `mangle' declared as function returning a function


Мы открывали
Маркса
каждый том,
как в доме
собственном
мы открываем ставни...

Maximilian

на этой машине gcc не гонит, значит не нужна вся эта свистопляска со скобками.
Оставить комментарий
Имя или ник:
Комментарий: