Оператор Case и символьные типы данных. Ошибка компиляции

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

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

Ответить
Аватара пользователя
dilloYa
новенький
Сообщения: 15
Зарегистрирован: 21.01.2013 17:55:50

Оператор Case и символьные типы данных. Ошибка компиляции

Сообщение dilloYa »

Столкнулась с такой непонятной для меня проблемой: компиляция кода в Windows-версии Lazarus, проходит успешно, компиляция ЭТОГО же кода в Linux-версии Lazarus обрывается на этом участке с ошибкой Ordinal expression expected в строке CASE, останавливаясь перед OF. Т.е. как я понимаю компилятору не нравятся типы перечисляемых данных. Но ведь это вполне себе допустимое использование, в чем может быть проблема? и почему в одном случае копиляция проходит, а в другом нет

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

                          case ArrNotePos[CountX,CountY] of
                            'F':
                              begin
                              NoteAlt:=ArrNotePos[CountX,CountY-1];
                              OktaveAlt:=ArrOktavePos[CountX,CountY];
                              end;
                            'A','B','D','E','G':
                              begin
                              NoteAlt:=ArrNotePos[CountX,CountY-2]+'#';
                              OktaveAlt:=ArrOktavePos[CountX,CountY];
                              end;
                            'C':
                              begin
                              NoteAlt:=ArrNotePos[CountX,CountY-1];
                              OktaveAlt:=ArrOktavePos[CountX,CountY-12];
                              end;
                          end;
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Как объявлен ArrNotePos?
Аватара пользователя
dilloYa
новенький
Сообщения: 15
Зарегистрирован: 21.01.2013 17:55:50

Сообщение dilloYa »

v-t-l писал(а):Как объявлен ArrNotePos?
, спсибо v-t-l , ну тормоз :oops: , однако непонятно, почему в Windows компилируется и со стринг-типами, а в Linux только с чар? Это меня и сбило с пути поиска ошибки
Ask
постоялец
Сообщения: 163
Зарегистрирован: 25.12.2008 02:51:37

Сообщение Ask »

Потому что под Windows, скорее всего, более новая версия компилятора
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

v-t-l писал(а):Как объявлен ArrNotePos?

Не понятно, так как он объявлен?
В новой версии компилятора можно в case использовать не только перечислимые типы? В смылсе, даже строки из несколькоих байт?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

stikriz писал(а):В новой версии компилятора можно в case использовать не только перечислимые типы? В смылсе, даже строки из несколькоих байт?

Найти не могу, но проскакивала информация, что в транковой версии можно.

Добавлено спустя 7 минут 39 секунд:
Re: Оператор Case и символьные типы данных. Ошибка компиляции
viewtopic.php?f=1&t=8217
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Оператор Case и символьные типы данных. Ошибка компиляции

А жаль - "else if.. else if.." там где напрашивается "case .. of" иногда напрягают.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

debi12345 писал(а):А жаль


Чего жаль? Что строки таки могут использоваться в case?
Сказано ж еще во втором посту, что под линуксом у автора темы старый компилятор. Там поди еще что нибудь типа 2.4.х, как в большинстве официальных репозиториев операционных систем.

Добавлено спустя 2 минуты 27 секунд:
Re: Оператор Case и символьные типы данных. Ошибка компиляции
Но :D я бы строки в case использовать не рекомендовал, ввиду совершенно невнятных ошибок логики, которые в результате можно заполучить. В первую очередь это относится к диапазонам типа 'ab'..'cd';
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

ввиду совершенно невнятных ошибок логики, которые в результате можно заполучить.

И чем это оличается в худщую сторону от "many_times*(else if)" ? И там и там сравнение.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

а тем, что в if-ах сравнение выстраивает программист, а тут :mrgreen: - в определении диапазонов участвует компилятор. И не всегда его логика совпадает с логикой программиста.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

а тут - в определении диапазонов участвует компилятор

Конструкция "N1..Nn, M1..Mm" ? Просто можно помнить что для строковых констант диапазоны желательно не использовать. Лично меня длинные цепчки однородных "else if" бесят :)
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

debi12345 писал(а):Лично меня длинные цепчки однородных "else if" бесят :)

Угу, прям кларион или 1С какой-то :-)
Ответить