PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование на PureBasic » Обработка чисел больше чем 32бита


Обработка чисел больше чем 32бита

Сообщений 1 страница 7 из 7

1

из руководства

Код:
Basic types
Long .l 4 bytes -2147483648 to +2147483647 
Integer .i 4 bytes (32 bits) -2147483648 to +2147483647
Integer .i 8 bytes (64 bits) -9223372036854775808 to +9223372036854775807  
Quad .q 8 bytes -9223372036854775808 to +9223372036854775807

т.е. крайний левый бит - знаковый

1. правильно ли я понимаю?
Чтобы хранить длину 4Gb-файла надо использовать тип Quad
например qFilePosition.q

2.
есть такая системная структура (из Structure Viewer)

Код:
Structure OVERLAPPED
	Internal.i
	InternalHigh.i
	Offset.l
	OffsetHigh.l
	hEvent.i
EndStructure

пусть есть такое объявление
ovrl.OVERLAPPED

Как разделить  qFilePosition.q на старшую и младшую часть и записать в ovrl\Offset и ovrl\OffsetHigh ?

0

2

Можно конечно и разделить 8 байт на два по 4.

Код:
x.q = $2F44AAAA22

ovrl.OVERLAPPED

ovrl\Offset = x & $FFFFFFFF
ovrl\OffsetHigh = x >> 32

Debug Hex(ovrl\Offset)
Debug Hex(ovrl\OffsetHigh)

но можно и не делить, а прямо записать 8 байт в структуру.

Код:
x.q = $2F44AAAA22

ovrl.OVERLAPPED

PokeQ(@ovrl\Offset, x)

Debug Hex(ovrl\Offset)
Debug Hex(ovrl\OffsetHigh)

0

3

While qCount<qFileSize
....
Wend

выходит из цикла при

qFileSize=4408180736
qCount  =  113246208

разница равна
dec 4294934528
hex FFFF8000
bin 1111 1111 1111 1111 1000 0000 0000 0000

Как это понять и как с этим бороться?

P.S.
Изменение на
While (qFileSize-qCount)>0 ;qCount<qFileSize
ничего не изменило.

0

4

У меня этот код не выходит из цикла.

Код:
qFileSize.q=4408180736
qCount.q=  113246208

While qCount < qFileSize

Wend

0

5

нашел ошибку
справочно получал размер так - FileSize(File$), что дает правильный результат
а в работе так - qFileSize.q=GetFileSize_(Handle, #NUL) ;длина файла - что было неправильно т.к. возвращала только младшую часть
изменил на
    qFileSize.q=0
    GetFileSizeEx_(Handle,@qFileSize)
и стало лучше жить

P.S. Другой вопрос
По той же причине заменил
SetFilePointer_(Handle, qCount, 0, #FILE_BEGIN)
на
SetFilePointerEx_(Handle, qCount, #NUL, #FILE_BEGIN)
Так выдает
[COMPILER] Line 136: SetFilePointerEx_(): Incorrect number of parameters.
хотя в доках
BOOL WINAPI SetFilePointerEx(
  __in       HANDLE hFile,
  __in       LARGE_INTEGER liDistanceToMove,
  __out_opt  PLARGE_INTEGER lpNewFilePointer,
  __in       DWORD dwMoveMethod
);

Отредактировано SadStar (19.06.2012 03:35:25)

0

6

Наверное так.

Код:
qCoun.q
SetFilePointerEx_(Handle, qCount&$FFFFFFFF, qCoun>> 32,#NUL, #FILE_BEGIN)

0

7

т.к. я так и не понял почему использование

SetFilePointerEx_(Handle, qCount, #NUL, #FILE_BEGIN)

выдает

[COMPILER] Line 136: SetFilePointerEx_(): Incorrect number of parameters.

поэтому применил подсмотренный на http://www.purebasic.fr
вариант
Сначала так
Import "Kernel32.lib"
    SetFilePointerEx.i(*hFile,liDistanceToMove.q,*lpNewFilePointer,dwMoveMethod.l)
EndImport

и в нужном месте так

SetFilePointerEx(Handle, qCount, #NUL, #FILE_BEGIN)

0


Вы здесь » PureBasic - форум » Программирование на PureBasic » Обработка чисел больше чем 32бита