Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 03:01   #1
D4N1K
Новичок
Джуниор
 
Регистрация: 07.07.2010
Сообщений: 2
По умолчанию Непонятен принцип работы со строкой

Доброго времени суток!
Столкнулся со странным для меня поведением простого кода: программа считывает строку, затем выводит каждый символ строки и его код. Странность в том, что первый раз выводится не то, что я ожидал(см скриншот). Все последующие строки обрабатывает правильно. Проблема наблюдается только с кириллицей. Для работы пока не горит, но любопытно, из-за чего так происходит
Среда RAD Studio XE3
Windows 7 Ult. x64
Код:
program task;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;
var
  i : Integer;
  symb : String;
begin
    while true do
    begin
      readln(symb);
      for i := 1 to length(symb) do
        writeln(i,' ',symb[i],' - ',ord(symb[i]));
      symb:='';
    end;
end.

Последний раз редактировалось D4N1K; 31.03.2013 в 03:42.
D4N1K вне форума Ответить с цитированием
Старый 31.03.2013, 12:34   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это не проблема. Просто ты используешь Юникод для строк.
String замени на AnsiString - должно получить однобайтовые коды.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.03.2013, 13:43   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А вот я, честно говоря, не понял.
Что юникод - видно по значениям кодов символов, а вот почему первый проход отличается от остальных?

С точки зрения кода первый проход отличается отсутствием
Код:
symb:='';
но как это может сказаться?
s-andriano вне форума Ответить с цитированием
Старый 31.03.2013, 14:19   #4
D4N1K
Новичок
Джуниор
 
Регистрация: 07.07.2010
Сообщений: 2
По умолчанию

Код:
program task;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;
var
  i : Integer;
  symb : AnsiString;
begin
    while true do
    begin
      symb:='';
      readln(symb);
      for i := 1 to length(symb) do
        writeln(i,' ',symb[i],' - ',ord(symb[i]));
    end;
end.
даже если перенести обнуление в начало цикла, ничего не меняется. Заменил на AnsiString. вот результат

Последний раз редактировалось D4N1K; 31.03.2013 в 14:23.
D4N1K вне форума Ответить с цитированием
Старый 31.03.2013, 14:36   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В XE2 кстати тоже самое. Почему хз
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.03.2013, 16:15   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

а если первым делом writeln сделать? не важно чего, просто пустую строку...
eval вне форума Ответить с цитированием
Старый 31.03.2013, 16:22   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В XE2 кстати тоже самое
Неправда. Проверил ради интереса на Лазаре и ХЕ2 - вот вывод:
Цитата:
абвг
1 а - 160
2 б - 1038
3 в - 1118
4 г - 1032
абвг
1 а - 160
2 б - 1038
3 в - 1118
4 г - 1032
абвг
1 а - 160
2 б - 1038
3 в - 1118
4 г - 1032
Это без Ansi
Максимум что тут не так: System.SysUtils.
Убрать System
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.03.2013, 16:31   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Неправда
XE2. Один вариант для AnsiString, второй для String
Удаление System.SysUtils целиком и System не помогает
Изображения
Тип файла: jpg Б1.jpg (13.8 Кб, 40 просмотров)
Тип файла: jpg Б2.jpg (12.6 Кб, 25 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.03.2013 в 16:34.
Аватар вне форума Ответить с цитированием
Старый 31.03.2013, 16:43   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит от локали операционки есть какая-то зависимость... Или с самим Делфи что-то.
У меня код этот не косячит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.03.2013, 17:43   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Скорей всего, баг в XE3, у них OEM-кодировка не сразу инициализируется, а после первого ввода-вывода. На writeln они поправили, а на readln, видать забыли. В XE2 и ниже должно работать OK, ибо там надо ручками делать конвертацию из-в OEM.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните принцип работы danada1 Помощь студентам 1 27.03.2013 15:20
принцип работы SaveDialog Form_13 Общие вопросы Delphi 1 20.02.2012 00:24
принцип работы ссылки sbcd Свободное общение 0 03.06.2011 21:50
принцип работы программы sasha14486 Общие вопросы C/C++ 1 22.05.2011 12:36
Принцип работы WH_KEYBOARD_LL wwe2012 Общие вопросы C/C++ 5 01.04.2011 15:46