PassNumber & PassInteger

Разработка Far.
Post Reply
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

PassNumber & PassInteger

Post by Skirda »

В чем смысл использования PassNumber (суть которому double) там, где речь идет о целых числах?
Например, panelitemFunc()

Code: Select all

case 2:  // FileAttr
	PassNumber((long)filelistItem.FileAttr, Data);
	return false;
или lenFunc()

Code: Select all

PassNumber(StrLength(Params[0].toString()), Data);
We are the Borg. You will be assimilated.
So Say We All!
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: PassNumber & PassInteger

Post by Shmuel »

Skirda wrote:В чем смысл использования PassNumber (суть которому double) там, где речь идет о целых числах?
-- Стандартный Lua (а мы используем именно такой) не имеет родного типа для __int64.
-- Родной тип "number" в Lua - это double, который представляет целые числа без погрешности только до 53 битов.
-- Для представления 64-битных целых LuaFAR предоставляет userdata специального типа, который имеет все необходимые операции, как между собой, так и с числами, за исключением операций == и ~= между этим типом и числами (но есть ф-ция bit64.eq, которая это делает).
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: PassNumber & PassInteger

Post by Skirda »

Т.е. я правильно понимаю, что старшие биты файловых атрибутов будут теряться?
We are the Borg. You will be assimilated.
So Say We All!
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: PassNumber & PassInteger

Post by Shmuel »

Skirda wrote:Т.е. я правильно понимаю, что старшие биты файловых атрибутов будут теряться?
Неправильно. Файловые атрибуты - это DWORD, т.е. 32 бита, а double передаёт без погрешности 53 бита.

Везде, где надо передать 64 бита, используется PassInteger.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: PassNumber & PassInteger

Post by Skirda »

В HACKING-RU/HACKING-EN дописывайте инфу про подобные тонкости луно-ядра, чтобы исключить кучу вопросов по кодингу.
We are the Borg. You will be assimilated.
So Say We All!
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: PassNumber & PassInteger

Post by SUSim »

Да, там дописать, надо много всего.

А, самое главное, поправить надо примеры луамакросов (путают сильно) - то скобки надо, то не нандо, то 0 то false то nil(я раньше не возражал против моих макросов в луа, в качестве примера), но по мере разбирательства:
1) Предложенные примеры путают пользователя (меня точно запутали)! (скобки нужны/не_нужны, кавычки одинарные/двойные, точка с запятой ";" {в хелпе звучит местами слово - запятая} то нужна, то нет, и т.п.)
Конвертер в этом смысле замечателен!!! - Строго по синтаксису! :) (я конечно понимаю, что можно пропускать кучу всяких лексем, но для понимания надо все примеры приводить согласно максимально строгому синтаксису)
2) Луа даёт много преимуществ и их надо внедрять (я только учусь, но) разделение на 0, nil, "" - очень полезно - надо бы и макродвижок развить (например prompt() мог бы возвращать "" при ввводе пустой строки или nil при ОТМЕНЕ)
3) Дробные числа полезны, но вот бывают непонятки: 1/2 это равно 1 или 0 в понятиях far?
И многое другое.

Документация по языку LUA замечательная, но настолько формализована и суха (много суше хелпа к моему современному Фортрану), что понять как написать макрос "Привет МИР" трудно :(

Правка:
кажется темой промахнулся!
SimSU ··· ·· -- ··· ··-
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: PassNumber & PassInteger

Post by Skirda »

SUSim wrote:3) Дробные числа полезны, но вот бывают непонятки: 1/2 это равно 1 или 0 в понятиях far?
0 - ибо целые числа.
0.5 - если будет 1/2.0 или 1.0/2 или "1.0"/2 или... (согласно таблице)
We are the Borg. You will be assimilated.
So Say We All!
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: PassNumber & PassInteger

Post by Shmuel »

Тут нужно уточнить: ответ выше правильный для макроязыка, но сейчас ситуация изменилась. В стандартном Lua все числа, даже записанные без точки, являются "double", поэтому, как легко проверить:

Code: Select all

macro:post msgbox(7/2)
покажет 3.5.

Если нужно целочисленное деление, используйте функцию bit64.div

Code: Select all

macro:post msgbox(bit64.div(7,2))
покажет 3.
Post Reply

Return to “Development”