Страница 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.
В общем, посмотри на аналогичные функции рядом. по крайней мере в старой либе, что у меня на сайте, таких перлов нет, как и такой функции.