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

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

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

Ответить
JackVlg
незнакомец
Сообщения: 4
Зарегистрирован: 20.03.2009 15:24:28

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

Сообщение JackVlg »

Нашел фишку тут в компиляторе версии 2.2.2
Неправильно работает индексация символов в строке:

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

for i := 1 to length(s) do write(s[i]);

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

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


Под неправильно я имел в виду, что с первого по четвертый символ идет чушь, затем сама строка
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

FPC 2.2.4 работает без проблем, да и 2.2.2, я думаю, что работает. Столь часто применяемый код, просто не мог бы быть до сих пор незамеченым. Но не плохо было бы, чтобы Вы показали типы своих переменных.
JackVlg
незнакомец
Сообщения: 4
Зарегистрирован: 20.03.2009 15:24:28

Сообщение JackVlg »

Вот полный код:

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

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+}
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

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

Хотя недавно Sergei I. Gorelkin на форуме писал о модуле CRT, что там много глюков, может в этом причина.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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