SysUtils.FileOpen - баг или фича?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

SysUtils.FileOpen - баг или фича?

Сообщение Сквозняк » 18.11.2012 01:08:16

В html документации к FPC 2.6.0 написано:
Код: Выделить всё
function FileOpen(  const FileName:    Mode: Integer):THandle;

Код: Выделить всё
Errors

On Error, -1 is returned.

Код: Выделить всё
type THandle = System.THandle;

Код: Выделить всё
type THandle = LongInt;

Демка 3.pp :
Код: Выделить всё
USES
SYSUTILS;

VAR
Q2,W2,E2,R2: LONGINT;

BEGIN
//Q2:=SysUtils.FileOpen('2.pp',FMOPENREAD);  //ошибка
WRITELN(SysUtils.FileOpen('2.pp',FMOPENREAD));
W2:=SysUtils.FileOpen('3.pp',FMOPENREAD);
WRITELN(Q2,' ',W2);
FILECLOSE(Q2);
FILECLOSE(W2);

END.

Файла 2.pp в каталоге нет, 3.pp - есть. Сборочный скрипт:
Код: Выделить всё
rm 3.exe

wine cmd.exe /c "C:\FPC\2.6.0\bin\i386-win32\fpc.exe 3.pp -FuC:\FPC\2.6.0\units\i386-win32\* -CR -O3 -Mfpc -Twin32"

read -p "Нажмите Enter для продолжения..."


Собирираем, запускаем:
Код: Выделить всё
wine 3.exe
ERROR: ld.so: object '/usr/lib64/freetype-infinality/libfreetype.so.6' from LD_PRELOAD cannot be preloaded: ignored.
ERROR: ld.so: object '/usr/lib64/freetype-infinality/libfreetype.so.6' from LD_PRELOAD cannot be preloaded: ignored.
ERROR: ld.so: object '/usr/lib64/cairo-freeworld/libcairo.so.2' from LD_PRELOAD cannot be preloaded: ignored.
ERROR: ld.so: object '/usr/lib64/freetype-infinality/libfreetype.so.6' from LD_PRELOAD cannot be preloaded: ignored.
ERROR: ld.so: object '/usr/lib64/freetype-infinality/libfreetype.so.6' from LD_PRELOAD cannot be preloaded: ignored.
ERROR: ld.so: object '/usr/lib64/cairo-freeworld/libcairo.so.2' from LD_PRELOAD cannot be preloaded: ignored.
fixme:service:scmdatabase_autostart_services Auto-start service L"SecDrv" failed to start: 2
4294967295
0 56

Результатом попытки открытия несуществующего файла должно было быть число -1 а пулучилось 4294967295 - не longint a longword. Лучше бы там INT64 использовался, тогда бы код ошибки всегда был одним числом -1 а так когда-нибудь число открытых файлов достигнет 4294967295 и будет невозможно отличить открытый файл от закрытого :D
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: SysUtils.FileOpen - баг или фича?

Сообщение Sergei I. Gorelkin » 18.11.2012 03:54:21

Тип THandle зависит от платформы, для linux он знаковый и всегда 32 бит, для windows - беззнаковый размером с указатель. Документацию, видимо, надо обновить...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: SysUtils.FileOpen - баг или фича?

Сообщение Сквозняк » 18.11.2012 05:13:23

Sergei I. Gorelkin писал(а):для windows - беззнаковый размером с указатель.

Значит заменитель числа -1 на разных версиях windows может быть разный? Весело.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: SysUtils.FileOpen - баг или фича?

Сообщение Sergei I. Gorelkin » 18.11.2012 14:49:13

С числами вообще опасно сравнивать. Обычно объявляют константу наподобие INVALID_HANDLE_VALUE=THandle(-1) и сравнивают с ней.

Я написал в багтрекер: http://bugs.freepascal.org/view.php?id=23343
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru