
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
В структуре размер файла хранится в двух полях:
![]() ![]() nFileSizeHigh as long nFileSizeLow as long Как это дело перевести, скажем в double, чтобы сравнивать привычными больше-меньше? Или нужен какой-то другой подход? |
![]() |
Сообщ.
#2
,
|
|
Сравнивается тремя ифами
|
Сообщ.
#3
,
|
|
|
ANDLLНу не томи, поясни
![]() |
![]() |
Сообщ.
#4
,
|
|
![]() ![]() function compare(a as xlong, b as xlong) as integer compare=sgn(a.high-b.high) if compare=0 then compare=sgn(a.low-b.low) end function |
Сообщ.
#5
,
|
|
|
Akina
Спасибо! То что надо ![]() А как бы ещё этот xlong перевести в более привычный вид? И какой тип выбрать? дабла ведь не хватит... Может, в вариант? Скажем, 10 гигов записать xlong-ом? узнать по xlong-у, сколько это гигов? |
![]() |
Сообщ.
#6
,
|
|
Ты вообще представляешь что эти два члена в структуре "символизируют"?
|
Сообщ.
#7
,
|
|
|
ANDLLЯ представляю
![]() На сколько я понимаю, оба поля ведь беззнаковые? А раз беззнаковых лонгов в бейсике нет, то отрицательные - больше положительных, и самое большое, которое влазит в лонг - минус 1. То есть &Hffffffff - самое большое число, которое можно записать в один лонг (нужно ещё держать в уме, что на самом деле оно не отрицательное). Прибавляем единичку - получаем переполнение лонга в верхний лонг: &h100000000 и так далее до &hffffffffffffffff Теоретически это понимая, мне очень сложно абстагироваться, я запутываюсь - хочется оперировать привычными десятичными числами без ограничения числа знаков ![]() |
![]() |
Сообщ.
#8
,
|
|
Ясно
А какова все же цель? Нужно (с потерей данных) преобразовать в double или в string(например что бы пользователю показать) но без потерь? Добавлено А впрочем пофиг, все равно в три строчки не получается Добавлено Цитата Артур @ На сколько я понимаю, оба поля ведь беззнаковые? А раз беззнаковых лонгов в бейсике нет, то отрицательные - больше положительных, и самое большое, которое влазит в лонг - минус 1. То есть &Hffffffff - самое большое число, которое можно записать в один лонг (нужно ещё держать в уме, что на самом деле оно не отрицательное). Прибавляем единичку - получаем переполнение лонга в верхний лонг: &h100000000 и так далее до &hffffffffffffffff я бы сделал так: function ltod(byval x as long) as double if x < 0 then ltod = 2#^32 +cdbl(x) else ltod = x endif end func function lltod(high as long, low as long) as double lltod = ltod(high) * (2#^32) + ltod(low) end function |
Сообщ.
#9
,
|
|
|
В функцию нужно передать минимум и максимум, а вернуть - принадлежит ли размер этому диапазону. Предполагаю определить аргументы минимум и максимум как вариант, ведь:
Цитата Переменные типа Decimal сохраняются как 96-разрядные (12-байт) целые без знака, масштабируемые степенями 10. Степень масштабирования определяет число знаков дробной части, которое может изменяться от 0 до 28. Для степени масштабирования 0 (числа без дробной части), максимальными по абсолютной величине значениями являются +/-79 228 162 514 264 337 593 543 950 335. При 28 знаках дробной части максимальными по абсолютной величине значениями являются +/-7,9228162514264337593543950335, а минимальными +/-0,0000000000000000000000000001. Примечание. В настоящее время поддерживается использование типа данных Decimal только в пределах типа Variant, т.е. невозможно описать переменную с типом Decimal. Пользователь, однако, имеет возможность создать переменную типа Variant с подтипом Decimal с помощью функции CDec. но что-то как то смутно понимаю смысл этой цитаты ![]() Или я не туда рою? |
![]() |
Сообщ.
#10
,
|
|
Если нужно вернуть принадлежит ли диапазону то чем мешает функция в посте номер 3?
|
Сообщ.
#11
,
|
|
|
Цитата ANDLL @ ![]() ![]() function lltod(high as long, low as long) as double lltod = ltod(high) * (2#^32) + ltod(low) end function Цитата ANDLL @ Нужно (с потерей данных) преобразовать в double? А на каком размере начнётся потеря, не могу сообразить? Где-нибудь далеко за террабайты и этим можно пока пренебречь за неимением файлов таких размеров? Или потери начнутся раньше? |
![]() |
Сообщ.
#12
,
|
|
Проверь сам
for i = 0.... |
Сообщ.
#13
,
|
|
|
Цитата ANDLL @ Если нужно вернуть принадлежит ли диапазону то чем мешает функция в посте номер 3? Тем, что в аргумент нужно будет передавать уже xlong, а хотелось бы что-то более привычное То есть, передавать-то можно как раз xlong, но этот ХЛонг нужно сначала получить. Скажем, 10 гигов - это сколько в ХЛонге? |
![]() |
Сообщ.
#14
,
|
|
6, 0
|
![]() |
Сообщ.
#15
,
|
|
Ну способ "в лоб":
![]() ![]() Declare Function CopyMemory Lib "kernel32" (dst As Any, src As Any, ByVal length As Long) Function Compare(n1 As LARGE_INTEGER, n2 As LARGE_INTEGER) Dim b1() As Long, b2() As Long, i As Long Redim b1(0 To Len(n1)), b2(0 To Len(n2)) CopyMemory b1(0), n1, Len(n1) CopyMemory b2(0), n2, Len(n2) For i = 0 To Len(n1) Compare = Sgn(b1(i) - b2(i)) If Compare <> 0 Then Exit Function Next End Function ох уж этот Бэйсик... |