Показать сообщение отдельно
Старый 26.12.2010, 21:40   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Насчет строк.
Тонкость состоит в том, что строка, хоть формально и эквивалентна массиву символов, да не совсем. Строку мало объявить, нужно ее еще и в некотором роде инициализировать. Поясню на примере.
Допустим, я хочу получить строку, содержащую все строчные латинские буквы в алфавитном порядке, и вывести эту строку на экран. Так вот, такая программа не пойдет:
Код:
VAR
 S:String;
 i:Byte;
BEGIN
 for i:=1 to 26 do
  S[i]:=CHR(i+96);
 WriteLn(S);
 ReadLn;
END.
То есть ошибки не выдаст, но и ожидаемого результата - тоже.
А зато такая - пожалуйста:
Код:
VAR
 S:String;
 C:ARRAY[1..26] of Char;
 i:Byte;
BEGIN
 for i:=1 to 26 do
  C[i]:=CHR(i+96);
 S:=C;
 WriteLn(S);
 ReadLn;
END.
Казалось бы, дело в том, что, "не зная" длины строки, транслятор просто не отводит для нее место в памяти. Но дело в том, что даже вариант с объявленной длиной не спасает, т.е. такое решение:
Код:
VAR
 S:String[26];
 i:Byte;
BEGIN
 for i:=1 to 26 do
  S[i]:=CHR(i+96);
 WriteLn(S);
 ReadLn;
END.
тоже оказывается неправильным.
Вот еще пример корректного решения:
Код:
CONST
 G:String='Long ago there were three ';
VAR
 S:String;
 i:Byte;
BEGIN
 S:=G;
 for i:=1 to 26 do
  S[i]:=CHR(i+96);
 WriteLn(S);
 ReadLn;
END.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070