Нашел глюк в компиляторе

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

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

Нашел глюк в компиляторе

Сообщение JackVlg » 20.03.2009 16:29:00

Нашел фишку тут в компиляторе версии 2.2.2
Неправильно работает индексация символов в строке:
Код: Выделить всё
for i := 1 to length(s) do write(s[i]);

Глюк проявляется при включении опции "Level 3 Optimization"

Добавлено спустя 2 минуты 8 секунд:
JackVlg писал(а):Неправильно работает индексация символов в строке


Под неправильно я имел в виду, что с первого по четвертый символ идет чушь, затем сама строка
JackVlg
незнакомец
 
Сообщения: 4
Зарегистрирован: 20.03.2009 16:24:28

Re: Нашел глюк в компиляторе

Сообщение Logo » 20.03.2009 17:04:03

FPC 2.2.4 работает без проблем, да и 2.2.2, я думаю, что работает. Столь часто применяемый код, просто не мог бы быть до сих пор незамеченым. Но не плохо было бы, чтобы Вы показали типы своих переменных.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Нашел глюк в компиляторе

Сообщение JackVlg » 20.03.2009 19:05:26

Вот полный код:
Код: Выделить всё
Uses
  Crt;

type
  ZM = packed record
    V : byte;
    A : byte;
  end;

var
  vscreen : array[0..24, 0..79] of ZM absolute segb800:0;

procedure MyWriteln(Y : integer; S : string);
var
  I : byte;
begin
  for I := 1 to Length(S) do
  begin
    vscreen[Y, I - 1].V := ord( S[I] );
    vscreen[Y, I - 1].A := 15;
  end;
end;

begin
  ClrScr;
  MyWriteln(0, 'Hello World!!!');
  Readln;
end.


При отключенной оптимизации работает правильно, при включении "Level 3 Optimization" вывод следующий "####Hello Worl" (Под символом # подразумеваются кракозябры)

Добавлено спустя 56 секунд:
Так-же наблюдается проблема при опции {$O+}
JackVlg
незнакомец
 
Сообщения: 4
Зарегистрирован: 20.03.2009 16:24:28

Re: Нашел глюк в компиляторе

Сообщение Logo » 20.03.2009 19:38:42

А если переменную S определить, как ShortString - ( S: ShortString)?

Хотя недавно Sergei I. Gorelkin на форуме писал о модуле CRT, что там много глюков, может в этом причина.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Нашел глюк в компиляторе

Сообщение Vadim » 21.03.2009 07:24:31

JackVlg писал(а):vscreen : array[0..24, 0..79] of ZM absolute segb800:0;

Вот эта штука совершенно лишняя. Правильно работает только в чистом DOS, в реальном режиме. В видеопамять напрямую писать не надо, тем более что в том виде, в каком она была во времена MS-DOS, её уже нет. Лучше используйте функции BIOS прерывания $10. Оно достаточно успешно эмулируется даже в XP\2003, поэтому гарантировано будет работать и под DOS и под Windows.
Но самое правильно - использовать WinAPI. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


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

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

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

Рейтинг@Mail.ru