Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.02;
Скачать: CL | DM;

Вниз

Работа с длинным целым   Найти похожие ветки 

 
Dik59   (2007-07-19 00:42) [0]

Уважаемые Мастера!
Мне нужно слить сложный идентифинатор из двух целых в одно длинное целое и подать его на клиента. Для этого создал UDF-ку, содержащую след.код:


......
type
 TordID = record
   case integer of
     0: (id:int64;);
     1: (doc,num:integer);
 end;
......
function IdAsBig(Doc,Num:Integer):Int64;cdecl;export;
var id:TordID;
begin
id.doc := Doc;
id.num := Num;
Result := id.id;
end;
......
exports
......
 IdAsBig name "idasbig",
......

Странслировал, библиотечку положил куда надо.
Написал простую тестовую процедурку:

CREATE PROCEDURE TESTID
RETURNS (
   ID BIGINT)
AS
declare variable dc integer;
declare variable nm integer;
begin
 /* Procedure Text */
 dc = 23234; nm = 9389348;
 id = idasbig(dc,nm);
 suspend;
end


и проверил работу IdAsBig  в IBExpert запросом:

Select * from TestId

Запрос вернул число 23234

Вопрос: Где ошибка? у меня? в FireBird? в IBExpert?


 
DrPass ©   (2007-07-19 01:32) [1]


> TordID = record

TordID = packed record

Кстати, директива export в объявлении процедуры не нужна. Она игнорируется 32-битными компиляторами


 
Dik59   (2007-07-19 07:01) [2]


> > TordID = record
>
> TordID = packed record


Не помогло, результат тот же.


 
sniknik ©   (2007-07-19 08:48) [3]

а вообще как компоненты Int64 передают? в ADO например были (есть еще?) проблемы при передаче, передавался с конвертацией через integer, естественно с потерями в точности. приходилось в обход компонент из обьектов ADO "выковыривать" или в строку передавать.
кстати попробуй через строку результат функции вернуть. что будет?


 
Johnmen ©   (2007-07-19 09:12) [4]


> Мне нужно слить сложный идентифинатор из двух целых в одно
> длинное целое

Что такое у тебя "слить", я не знаю.
Но чтобы получить уникальный int64 из двух int (01,02) надо
int6401:=int01;
int64:=(int6401 shl 32) + int02;


 
Сергей М. ©   (2007-07-19 10:38) [5]


> Dik59


Показывай, как ты декларировал эту UDF в скрипте базы ..


 
Desdechado ©   (2007-07-19 10:39) [6]

Не вижу объявления UDF.


 
Dik59   (2007-07-19 19:55) [7]


> Desdechado ©   (19.07.07 10:39) [6]
> Не вижу объявления UDF.

Сергей М. ©   (19.07.07 10:38) [5]
Показывай, как ты декларировал эту UDF в скрипте базы


Я показал только кусочки кода из библиотеки, имеющие отношение к вопросу, объявление, естественно есть, в базе процедура прописана:
DECLARE EXTERNAL FUNCTION IDASBIG
   INTEGER,
   INTEGER
RETURNS BIGINT
ENTRY_POINT "idasbig" MODULE_NAME "ordudflib"



> Johnmen ©   (19.07.07 09:12) [4]
> Что такое у тебя "слить", я не знаю.
> Но чтобы получить уникальный int64 из двух int (01,02) надо
> int6401:=int01;
> int64:=(int6401 shl 32) + int02;


"Слить" Вами понято правильно, не мог подобрать другого глагола, извините.
То же самое делает тип TordID без shl и плюсов, прстым присваиванием, в других местах программы это работает прекрасно .


> sniknik ©   (19.07.07 08:48) [3]
> кстати попробуй через строку результат функции вернуть.
> что будет?


Через строку получается то же самое, теряется старшее слово в int64. Т.е. в результате возвращается не BIGINT, а INTEGER. Вопрос - почему?


 
sniknik ©   (2007-07-19 20:49) [8]

> Вопрос - почему?
может FireBird не может работать с BIGINT? в смысле в функциях, так то должен раз тип есть ... или почемуто воспринимает твое описание как интеджер.
попробуй кстати еще входные параметры тоже int64 сделать (??? а хто его знает...).

есть не твои(!!!) функции которые возвращают int64? и главное чтобы работали проверь (выяснить до конца, кто виноват и что делать).


 
sniknik ©   (2007-07-19 20:51) [9]

да, и зря ты проигнорировал про packed record ответ.


 
Johnmen ©   (2007-07-19 21:57) [10]

>Dik59

1. Входные параметры передаются по ссылке, поэтому IdAsBig(var Doc,Num:Integer)
2. Выходной пар. в данном случае - по значению, поэтому RETURNS BIGINT BY VALUE


 
Dik59   (2007-07-19 22:27) [11]


> Johnmen ©   (19.07.07 21:57) [10]
> 1. Входные параметры передаются по ссылке, поэтому IdAsBig(var
> Doc,Num:Integer)
> 2. Выходной пар. в данном случае - по значению, поэтому
> RETURNS BIGINT BY VALUE


Огромное спасибо, полегчало!!!



Страницы: 1 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
15-1194259585
xayam
2007-11-05 13:46
2007.12.02
что скажите про этот хостинг


1-1189580697
cantalia
2007-09-12 11:04
2007.12.02
Событие из DLL в Main Application


2-1194539086
Kick
2007-11-08 19:24
2007.12.02
ClientSocket, ServerSocket


2-1194606611
DontFire
2007-11-09 14:10
2007.12.02
Как вставить сепаратор в mainmenu?


2-1194603858
alsov
2007-11-09 13:24
2007.12.02
Почему StrToFloat обрезает строку?