Страница 1 из 1
Проблема с UDF под Линукс
Добавлено: 06 ноя 2007, 11:36
inspirion
Уважаемы подскажите в чем может быть проблема.
1. OS FedoraCore 4
2. СУБД FireBird 2.0
3. UDF библиотека FreeAdhocUdf
4. Написал собственную функцию, пересобрал пакет, обновил udf запускаю на выполнение, а функция не возвращает ничего, черезе IBExpert пишет NAN.
Для проверки уже далал ток что бы возвращалось хотя бы тоже значение что и передовалось на входе, история таже сама.
//Our
double *MultFloat(double *Value, double *Value2, int *RoundToNearest)
{
double *result = malloc(sizeof(double));
*result=*Value;
*result *=*Value2;
*RoundToNearest*=-1;
int multipler = pow(10,*RoundToNearest);
*result=floor((*result)*multipler+0.5)/multipler;
return result;
}
Добавлено: 06 ноя 2007, 11:43
kdv
декларируешь как?
и вообще - аллокировать память под double через malloc - это перл еще тот. аллокирование и free_it нужно только для строк.
Не хватило сил примеры посмотреть?
Добавлено: 06 ноя 2007, 11:44
inspirion
double * MultFloat( double *, double *, int *);
Добавлено: 06 ноя 2007, 12:01
Dimitry Sibiryakov
Брось ты эти UDF-ки, не твое. Раз уж не можешь статьи прочитать и на вопросы отвечаешь невпопад...
Добавлено: 06 ноя 2007, 12:33
kdv
еще раз.
1. malloc для объявления результата double, это фигня полная, покажи где ты это вычитал. дабл возвращать и объявлять надо by value.
2. я спросил про объявление udf. хотя уже и так все ясно.
Добавлено: 06 ноя 2007, 12:56
inspirion
kdv спасибо за конструктивное общение.
Добавлено: 06 ноя 2007, 13:00
kdv
оно было не очень конструктивным, т.к. и ты тоже со своей стороны ... гм, скажем, пошел не той, причем не вполне понятной дорогой. udf в исходниках и на c и на pascal на сайте есть, в достатке. Казалось-бы, бери и делай по образу и подобию...
Добавлено: 06 ноя 2007, 13:47
inspirion
UDF всегда разрабатывался под Windows на паскале, но срочно возникла задача адаптировать udf под Линукс, поэтому были взяты исходники и по подобию написана функция, возможно что отсутствие практики в С и привела к коллизиям.
Добавлено: 06 ноя 2007, 14:35
kdv
UDF всегда разрабатывался под Windows на паскале
и что, для любых типов данных использовали free_it ?

Добавлено: 06 ноя 2007, 16:00
inspirion
Нет конечно. Я для примера написания функции взял
/
Код: Выделить всё
/ pm 21.08.04
// ct 2006-11-26 implementation of NULL for FB 2.0
double *fact(int *n)
{
if (!n)
return NULL;
else {
double *result = malloc(sizeof(double));
if (*n < 1 || *n > 100)
*result = 0.0;
else {
int i;
double f = 1.0;
for (i = 2; i <= *n; i++)
f *= i;
*result = f;
}
return result;
}
}
Добавлено: 06 ноя 2007, 16:24
kdv
не представляю, откуда это и кто это писал. я тебе тоже могу накидать подобных извратов, если желаешь.
Объявлял-то ты функцию как? Так ведь и не признался.
Добавлено: 06 ноя 2007, 17:17
inspirion
Приведенный пример взят из исходников FreeAdhocUDF.
Объявление функции имеется ввидв в Firebird?
DECLARE EXTERNAL FUNCTION F_MULTFLOAT
DOUBLE PRECISION,
DOUBLE PRECISION,
INTEGER
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'MultFloat' MODULE_NAME 'FreeAdhocUDF'
Добавлено: 06 ноя 2007, 17:38
kdv
Объявление функции имеется ввидв в Firebird?
натюрлих. Ты же саму ФУНКЦИЮ привел. О каком еще "объявлении" я мог бы спрашивать?
моб ять, ну и оригиналы...
результат ведь объявлен как returns by value.
Короче, не важно. видать у мужиков крыша просто поехала.
Добавлено: 06 ноя 2007, 17:49
inspirion
Так какой можно диагнох мне поставить?
Добавлено: 06 ноя 2007, 17:51
Merlin
inspirion писал(а):Так какой можно диагнох мне поставить?
Ещё и мазохист...
Добавлено: 06 ноя 2007, 18:05
kdv
Так какой можно диагнох мне поставить?
тебе? не знаю. наверное - "склероз". функцию (на сях, а не декларацию udf) перепиши так, чтобы она возвращала double по значению, а не по ссылке. и убери malloc.
В общем, посмотри на аналогичные функции рядом. по крайней мере в старой либе, что у меня на сайте, таких перлов нет, как и такой функции.