Delphi XE2 и тип Char / Byte - PullRequest
       15

Delphi XE2 и тип Char / Byte

0 голосов
/ 20 сентября 2011

У меня есть эта проблема, посмотрите этот пример кода:

src := '';
for iindex := 0 to 255 do
  begin
    src := src + char(byte(iindex));
    writeln (iindex:5, byte(src[iindex]):5);
  end;

, где src - строковый тип, а iindex - целочисленный тип, и в качестве вывода я должен иметь что-то вроде:

iIndex   byte(src[iIndex])
 0         0
 1         1
 2         2
 3         3
 ..................
 254       254
 255       255   

и так было во всех последних версиях delphi до delphi xe; теперь с Delphi XE2, у меня есть этот вывод:

iIndex   byte(src[iIndex])
 0         0
 1         0
 2         1
 3         2
 ..................
 254       253
 255       254   

Теперь я спрашиваю, нужно использовать другой тип строки? Конечно, я нашел обходной путь для его решения, обновив байт (src [iindex]) до байта (src [succ (iindex)]), но поэтому, когда iIndex = 255, у меня есть байт (src [256]), который вызывает исключение и так нужно поменять байт в слове. Конечно, я не думаю, что это лучшее решение, поэтому я спрашиваю вас, есть ли лучшее решение для него. Большое спасибо.

1 Ответ

6 голосов
/ 20 сентября 2011

Вы получаете доступ к строке за пределами.Строковый доступ основан на 1 в Delphi.Вы должны получить ошибку проверки диапазона.Кроме того, я думаю, что вы должны предпочесть использование chr() и ord() вместо приведений.

src := '';
for iindex := 0 to 255 do
begin
  src := src + chr(iindex);
  writeln (iindex:5, ord(src[iindex+1]):5);
end;

Я не вижу, чтобы код мог работать в более ранних версиях Delphi.Действительно, Delphi 2010 ведет себя точно так же, как вы описываете поведение XE2 после отключения проверки диапазона.Это еще один пример того, почему проверка диапазона так важна.

...