Case в trunk Lazarus`e и trunk FPC

Вопросы программирования и использования среды Lazarus.

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

Case в trunk Lazarus`e и trunk FPC

Сообщение ssadragon » 18.05.2015 11:28:36

Решил потестить работу проекта на trunk FPC и наткнулся на проблему с Case`ом
Код: Выделить всё
Label
  cas;
Var
  s: String;
...
  s:='a';
  cas:
    Case s Of
      'a': s      := 's';
      's', 'd': s := 'd';
    End;
  Goto cas;

В этом примере не заходит в 's', 'd' ну и соответственно не присваивает s := 'd';
А если 's', 'd' разделить то соответственно начинает заходить.
Есть у кого такая проблема?
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение SSerge » 18.05.2015 16:40:07

1. Нельзя внутри селектора изменять переменную селектора. Сей бардак не определен логикой, а потому срабатывать не обязан.
2. После прохождения совпадающей ветки case of происходит выход за пределы оператора case, а не переход на следующую ветку. Матчасть. Это вам не Си.
3. The case with strings is equivalent to a series of if then else statements, no optimizations are performed.

Так что возможно всё правильно работает.
Для полного осознания стоит вывести переменную s перед case;
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение resident » 18.05.2015 22:34:40

Вот типа такого if правильно будет использовать?
Код: Выделить всё
if Connect(Loaded) and Loaded then ....

,где
Код: Выделить всё
type
function Connect(var aLoaded: boolean): boolean;
...

var
Loaded: boolean;
.....
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение ssadragon » 19.05.2015 07:42:17

SSerge писал(а):1. Нельзя внутри селектора изменять переменную селектора. Сей бардак не определен логикой, а потому срабатывать не обязан.

Ладно тогда вот так
Код: Выделить всё
Label
  cas;
Var
  s:     String;
  c, cc: String;
...
cc  := 'a';
  cas:
    c := cc;
  Case c Of
    'a': cc := 's';
    's', 'd': cc := 'd';
  End;
  Goto cas;

Все равно не заходит в ветку 's', 'd'

SSerge писал(а):2. После прохождения совпадающей ветки case of происходит выход за пределы оператора case, а не переход на следующую ветку. Матчасть. Это вам не Си.

Ну дк это понятно что выходит. У меня в проекте вообще имеется цикл по StringList`у, беру из него строку присваиваю переменной (строковой) и через CASE с ней работаю, дк вот есть строки при которых должно делаться одно и тоже и из-за этого они у меня объединены в одну ветку, в которую соответственно не заходит :shock:
Строки которые мне нужны содержат одно слово.
А чтоб проверить что у меня в том коде все нормально сделал вот такой маленький пример, в котором соответственно тоже не работает
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение MylnikovDm » 19.05.2015 11:49:52

Может я чего упустил, но раньше оператор case не работал со строками, он работал только с типом char. При этом нужно учитывать, что тип string в FPC по умолчанию есть UTF8, то есть, на самом деле у вас впереди может быть управляющий символ, который тоже формально есть char. То есть, нужно либо перекодировать из UTF8, а уже потом сравнивать, либо использовать WideString и WideChar вместо String и Char.
MylnikovDm
постоялец
 
Сообщения: 103
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение ssadragon » 19.05.2015 11:58:52

MylnikovDm
Но он же заходит в ветку где только одно значение, почему он перестал заходить туда где несколько значений?
При использовании FPC версии 2.6.4 и Lazarus из trunk Case..Of работает нормально. Используется английский алфавит.
MylnikovDm писал(а):Может я чего упустил, но раньше оператор case не работал со строками, он работал только с типом char.

http://wiki.lazarus.freepascal.org/Case
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение sign » 19.05.2015 12:07:00

Тайфун. FPC - 3.1.1
Case работает.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение SSerge » 19.05.2015 13:48:26

ssadragon
а если в строках сравнения сделать по два символа, а не по одному - тоже не заходит?

MylnikovDm писал(а): При этом нужно учитывать, что тип string в FPC по умолчанию есть UTF8, то есть, на самом деле у вас впереди может быть управляющий символ


Чушь, извините. Вы о кодировках основы хотя бы прочитайте и не путайте дефолт лараруса с дефолтом FPC http://wiki.freepascal.org/FPC_Unicode_support/ru
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение ssadragon » 19.05.2015 13:51:36

SSerge писал(а):а если в строках сравнения сделать по два символа, а не по одному - тоже не заходит?

Да :(
Код: Выделить всё
  cc  := 'aaa';
  cas:
    c := cc;
  Case c Of
    'aaa': cc               := 'fff';
    'sss', 'ddd', 'fff': cc := 'ddd';
  End;
  Goto cas; 

При первом проходе заходит в 'aaa' в СС присваивается 'fff'. выходит из Case по GOTO переходит на c := cc; в "с" присваивается 'fff'. Далее по идее он должен зайти в ветку 'sss', 'ddd', 'fff' и сделать cc := 'ddd' но он этого не делает, а перескакивает на GOTO
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение SSerge » 19.05.2015 14:05:21

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


Label
  cas;
Var
  s: String;
begin
  s:='a';
  cas:
    writeln('s before case: ',s);
    Case s Of
      'a':  begin
             s:= 's';
             writeln('Selector <a>');
            end;
      's', 'd':
            begin
             writeln('Selector <s> <d>'); 
             s := 'd';
            end;
    End;
  readln;
  Goto cas;
end.



результат:

Код: Выделить всё
>ppp.exe
s before case: a
Selector <a>

s before case: s
Selector <s> <d>

s before case: d
Selector <s> <d>

s before case: d
Selector <s> <d>

s before case: d
Selector <s> <d>



FPC 3.1.1 из CodeTyphon 5.30

Вы б внимательно посмотрели на файл исходника чем-нибудь шестнадцатирично-дампирующим, а то может быть проблема не в case, а как введена одна из строк
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение Лекс Айрин » 19.05.2015 14:12:11

ssadragon писал(а):При первом проходе заходит в 'aaa' в СС присваивается 'fff'. выходит из Case по GOTO переходит на c := cc; в "с" присваивается 'fff'. Далее по идее он должен зайти в ветку 'sss', 'ddd', 'fff' и сделать cc := 'ddd' но он этого не делает, а перескакивает на GOTO


А почему нет ветки else? Мало ли какое значение в строке.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение ssadragon » 19.05.2015 14:27:22

SSerge
Взял ваш пример, создал новый проект вставил.
Результат
Код: Выделить всё
s before case: a
Selector <a>

s before case: s

s before case: s

s before case: s

s before case: s

s before case: s


Лекс Айрин писал(а):А почему нет ветки else? Мало ли какое значение в строке

Она мне не нужна

Добавлено спустя 6 минут 13 секунд:
:shock: Добавил Else в пример SSerge
Код: Выделить всё
Program ppp;
Label
  cas;
Var
  s: String;
Begin
  s := 'a';
  cas:
    writeln('s before case: ', s);
  Case s Of
    'a':
    Begin
      s := 's';
      writeln('Selector <a>');
    End;
    's', 'd':
    Begin
      writeln('Selector <s> <d>');
      s := 'd';
    End;
    Else
    Begin
      writeln('Selector <ELSE>');
      s := 's';
    End;
  End;
  readln;
  Goto cas;
End. 

Результат такой же
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение SSerge » 19.05.2015 14:36:49

значит, не повезло вам и попался поломатый компилятор. Остается только переинсталлировать на более новый (или более старый)
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение ssadragon » 19.05.2015 14:45:56

SSerge
Блин кудаж еще новее брал из http://svn.freepascal.org/svn/fpc/trunk
Компилировал так
Код: Выделить всё
@echo on
set Opt=COMPILER_OPTIONS="-O1"
set Target=OS_TARGET=win32 CPU_TARGET=i386
set myroot=E:\FPC
set myFPC=%myroot%\source
set mybinutils=%myroot%\bin\i386-win32
set oldppc=E:\lazarus_trunk\fpc\2.6.4\bin\i386-win32
set PATH=%oldppc%;%PATH%
cd %myFPC%
make clean

cd %myFPC%\compiler
make cycle %Target% %Opt%
cd..

make singlezipinstall %Target% %Opt%
cd %mybinutils%
fpcmkcfg.exe -d "basepath=%myroot%" -o .\fpc.cfg
@pause

А версия 2.6.4 нормально работает
ssadragon
постоялец
 
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Re: Case в trunk Lazarus`e и trunk FPC

Сообщение SSerge » 19.05.2015 14:50:15

ну так транк на то и транк, что в нем может быть все что угодно - чего-то изменили, чего-то поломали - обычный процесс

зы, imho 3.1.1 должен и сам собираться версией 3.1.1, мож неправ :o
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron