Вопрос по C, задание функции
double g(double x) { return f(a, b, x); }
Обернуть её в функцию от одного аргумента, а её уже передавать.
Или её надо объявлять отдельно, а переменные a и b глобальными делать? Можно как-то без глобальных переменных?
To : а как это завернуть?
Я прошу прощения за ламерские вопросы, просто достаточно редко программирую.
Или её надо объявлять отдельно, а переменные a и b глобальными делать? Можно как-то без глобальных переменных?Да, именно так, как показал . Переменные должны быть глобальными.
To : а как это завернуть?
Или её надо объявлять отдельно, а переменные a и b глобальными делать? Можно как-то без глобальных переменных?Спасибо вам с ом!
To : а как это завернуть?
Ладно, буду делать с глобальными, хотя с локальными было бы посимпатичнее, но, видимо, это никак не делается в C.
видимо, это никак не делается в C.Ты вообще-то хочешь фичу функционального языка.
double g(double x) { return f(a, b, x); }Я бы ещё написал inline...
Я бы ещё написал inline...А то строчка слишком короткая?
А то строчка слишком короткая?Кашу маслом не испортишь.
Можно как-то без глобальных переменных?Почему бы не передать их в функцию вместе с х?
double g(double x, double a, double b) { return f(a, b, x); }
потому что тогда нельзя будет вызвать proc(g)
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, а к следующему её вызову они уже должны быть другими да?
я как то по пьяни придумал такую тему для элементов массива - нужно было чтобы массив был циклический,бесконечный и чтобы можно было обращаться по отрицательным индексам
вызов 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
(и очень правильно не нравится, подумай как ты будешь мучаться с таким кодом в случае мультитрединга)мультитрединг не нужен, обычная реентерабельность уже нарушается. Общий метод борьбы с нереентерабельными функциями, кстати, совпадает с тем, что ты советовал в начале поста.
Или можно легко представить себе процесс добавления этих указателей на функции в некоторую структуру с последующим выполнением. В общем, глобальные переменные в данном случае — это опасно.
#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]
а можно для необразованных: зачем в fabs'е еще в одни скобки брать?
Мне кажется, у него два макроса в связке работали, причем один из них и навешивал дополнительные скобки, поэтому во внутреннем он за этим и не следил. А пример использования — как раз скопирован из определения второго, интерфейсного макроса.
а можно для необразованных: зачем в fabs'е еще в одни скобки брать?Ну так, на всякий случай.
Если будет вызов, например: mask(a, b, c). Хотя нет, гоню, тут наверное препроцессор всё же ругнётся.
#define mask(I) (intint 5760.*(ceil(fabsI/5760. +(I*I)<0) +(intI)-5760.*floorI)/5760.*I)>=0да, действительно, не нужны вторые скобки для (I это видимо рудимент (там когда то было (I+2880) )
а если обращаешься array[mask(I)], то нужны двойные скобки, иначе компиллятор гонит, что индекс массива не int
а если обращаешься array[mask(I)], то нужны двойные скобки, иначе компиллятор гонит, что индекс массива не intмне не говорит
frobnicate.c:110: error: `mangle' declared as function returning a function
Мы открывали
Маркса
каждый том,
как в доме
собственном
мы открываем ставни...
на этой машине gcc не гонит, значит не нужна вся эта свистопляска со скобками.
Оставить комментарий
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. А как сократить количество аргументов?