Что нового

[Баг] Ограничение в SetExtended

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Наткнулся на одно неприятное ограничение в SetExtended:

Код:
SetExtended(20110418205506)
ConsoleWrite(@extended & @LF)


выводит 1381325634, что бы это значило? :scratch:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
CreatoR
CreatoR сказал(а):
то что, в Extended можно ставить только 4 битные беззнаковые числа. максимальное число из этого диапазона - 2^32 - 1. после превышения, идет циклическая перестановка на минимальное число из диапазона, то есть на 0. в твоем случае
20110418205506 - производит 20110418205506/2^32 = 4682 циклических возвращений, и 4 битные эквивалент это 20110418205506 - 4682*2^32 = 1381325634
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Kaster [?]
то что, в Extended можно ставить только 4 битные беззнаковые числа...

Поправка: 4 байтные (32 битные) знаковые числа.

Код:
Func test($var)
	Return SetExtended($var, $var)
EndFunc

ConsoleWrite('return: ' & test(2^32/2-1) & @TAB & 'extended: ' & @extended & @LF)
ConsoleWrite('return: ' & test(2^32/2) & @TAB & 'extended: ' & @extended & @LF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
У меня не хочет возвращать 2^32 - 1. Max число у меня возвращает 2147483647.
Код:
SetExtended(2147483647)
;SetExtended(2^32-1)
ConsoleWrite(@extended & @LF)
:wacko:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Жаль :(, хотел в одной своей функций через @Extended возвращать дату модификаций файла (20110418205506 это и есть та дата).

P.S
Странно что оно не документировано нигде.
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
20110418205506
А если сократить 2011 до 11 и 20:55:06 до 20:55, то вполне влезает... :smile:
1104182055
P.S.
А где еще может использоваться эта функция и где её применение жизненно необходимо? :smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
zlo-kazan [?]
А если сократить 2011 до 11 и 20:55:06 до 20:55, то вполне влезает... :smile:
А что если дата изменения 19**?
И время нужно полное, включая секунды.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Не проще уже тогда ByRef ипсользовать?
@extended вроде как задумывался, как дополнение к @error, а не как дополнительная возможность возвращать значения.
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
CreatoR сказал(а):
А что если дата изменения 19**?
И время нужно полное, включая секунды.
До 20 считать 2020, после 20 считать 1921... а вот секунды не лезут... :smile:
А если перекодировать?
20:55:06 перевести в секунды это уже 5-ти значное число (86400) и дату из 0418 в 365 дней или потеряется смысл записи?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
хотел в одной своей функций через @Extended возвращать дату модификаций файла (20110418205506 это и есть та дата).

Можно дату передавать в юниксовском формате, т.е. число секунд прошедших с начала 1970г., если не путаю, четырехбайтного числа должно хватить до 2038г.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Можно много чего придумать, можно и массивом передавать, и ByRef, но мне хотелось поудобнее, чтобы потом не нужно было лишний раз суетится и что-то ещё делать на выходе (функций).
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
dwerf [?]
Поправка: 4 байтные (32 битные) знаковые числа.
ок. просто мне сначала первое что пришло в голову беззнаковое. проверил - совпало. стало быть знаковое :smile: и конечно байтов, а не битов.
madmasles [?]
У меня не хочет возвращать 2^32 - 1
как раз поэтому :smile:
asdf8 [?]
Можно дату передавать в юниксовском формате,
да, хорошая мысль. только надо будет достать/сделать конвертор. AutoIt-овский TimerInit() возвращает мсеки с момента запуска процессора, я пологаю. ну или холодного включения. точно не помню.


Добавлено:
Сообщение автоматически объединено:

CreatoR
идея с Epoch - думаю самое то. в любом случае, ты бы свое 20110418205506 тоже бы парсил. а так, получишь секунды с Epoch и конвертируешь в человеческую дату
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR

А что мешает завести свою переменную $extended? А по поводу разрядности, есть упоминание в описании к функции SetExtended():

The required value (integer) to set the @extended macro to.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Yashied [?]
то мешает завести свою переменную $extended?
Где завести? мне из функций нужно вернуть число помимо другого значения.

P.S
Я не ищу решения проблеме, неужели это не понятно, хотябы исходя из данного раздела?

The required value (integer) to set the @extended macro to.
Integer насколько мне известно, это целое число. О том, сколько оно там может содержать, AutoIt скриптер может и не знать, а об этом не помешало бы и в справке написать.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Integer насколько мне известно, это целое число.

Ну, мы же с тобой программеры. Целый тип равен размерности машинного слова. Для 32-битных систем, это 32 бит. А если не указано, что это беззнаковый тип, то подразумевается знаковый.

:smile:
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Integers (whole numbers) can also be represented in hexadecimal notation by preceding the integer with 0x as in 0x409 or 0x4fff (when using hex notation only 32-bit numbers are valid).
http://www.autoitscript.com/autoit3/docs/intro/lang_datatypes.htm
Но DEC занимает 64 бит... (система 32 бит) На сколько помню из школьного курса информатики... в Basic можно указать, чтобы переменная занимала 2 ячейки памяти... или я что-то путаю?
Код:
$test=1
For $I=2 to 64
	$test*=2
	If $i=64 then $test-=1
	ConsoleWrite('return: ' & Round($test, 0) & @TAB & 'extended: ' & @extended & @LF)
Next
ConsoleWrite('return: ' & Round($test+1, 0) & @TAB & 'extended: ' & @extended & @LF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR [?]
хотел в одной своей функций через @Extended возвращать дату модификаций файл
А если так:
Код:
#include <Date.au3>

Global Const $sNulDate = '1970/01/01 00:00:00'

$sDateMod = '2038/01/19 03:14:07' ;у меня дальше ошибку выдает.
$iDateCalcMod = _DateDiff('s', $sNulDate, $sDateMod)
SetExtended($iDateCalcMod)
$iMod = @extended
ConsoleWrite('Sec:' & @TAB & $iMod & @LF)

$sDateCalcMod = _DateAdd('s', $iMod, $sNulDate)
ConsoleWrite('Date:' & @TAB & $sDateCalcMod & @LF)
 
Верх