Настройка компилятора. Преобразование типов.

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

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

Настройка компилятора. Преобразование типов.

Сообщение Notus » 01.09.2009 18:44:09

Привет всем.

Прошу помощи у гуру freepascal.
На данный момент стоит задача - портировать часть исходных кодов из borland pascal на freepascal.
Множество проблем уже решено.
Осталась самая малость:
В borland сплошь и рядом используется неявное приведение, если так и оставлять, то при запуске программы на этих местах прога падает.
По логам потом ясно на какой строчке падает и иду исправлять. Муторно и долго.
Итак, можно ли настроить компилятор, чтобы он выдавал ошибки, если происходит неявное преобразование?

пример
b : word;
s : string;
b := StrToInt(s); - тут упадет.
Notus
незнакомец
 
Сообщения: 4
Зарегистрирован: 01.09.2009 18:35:37

Re: Настройка компилятора. Преобразование типов.

Сообщение Logo » 01.09.2009 22:54:02

Не должно падать.
Версия Вашего FreePascal и ОС. Желательно фрагмент падучего кода.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Настройка компилятора. Преобразование типов.

Сообщение Max Rusov » 01.09.2009 22:56:59

Может падать только из-за Range Check Error, которые можно отключить - {$R-}.
Отловить неявные преобразования типов при присвоении целых разной размерности, по моему невозможно.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Настройка компилятора. Преобразование типов.

Сообщение Logo » 02.09.2009 00:59:10

Max Rusov писал(а):Может падать только из-за Range Check Error, которые можно отключить - {$R-}.
Отловить неявные преобразования типов при присвоении целых разной размерности, по моему невозможно.

Так WORD остался с прежним форматом (размером), а оно на BP у человека работало :shock:
Может действительно, в глобальных настройках IDE Borland Pascal было отключено Range Check Error.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Настройка компилятора. Преобразование типов.

Сообщение Vadim » 02.09.2009 04:50:41

Да, единственное, что я в этом коде вижу - это возможность переполнения. Если его допускать нельзя, то лучше поставить предварительную проверку. Или Try ... Except...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Настройка компилятора. Преобразование типов.

Сообщение Notus » 02.09.2009 15:34:54

var b : byte;
b := b shl 1; // тут падал, при определенном значении b


function Crc16msb(pBuf : array of byte; lSize : Integer) : word;
s : word;
Crc16msb := integer(s shr 8) + integer(s shl 8); // тут падало

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

падало с ошибкой Range Check Error

{$R-} - это попробую

ОС - DOS 6.22
FreePascal for IDE GO32 V2 DOS
версия FP 1.0.10 2008/7/31
комиплятор 2.2.2
дебаггер GBD 6.1.1
Notus
незнакомец
 
Сообщения: 4
Зарегистрирован: 01.09.2009 18:35:37

Re: Настройка компилятора. Преобразование типов.

Сообщение Logo » 02.09.2009 16:08:41

Notus писал(а):var b : byte;
b := b shl 1; // тут падал, при определенном значении b
...

Ну да. При значении b >= 128 - падает, а при меньших нет. Это и есть Range Check Error.

FP menu: options->compiler... ->вкладка Generated Code. Убираем отметку на Range Checking. (правда я не знаю или это работает в вашей версии FP)
или в начале модуля прописываем {$R-}
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Настройка компилятора. Преобразование типов.

Сообщение Vadim » 02.09.2009 19:04:44

Logo писал(а):FP menu: options->compiler... ->вкладка Generated Code. Убираем отметку на Range Checking.

И получаем ошибки, которые отлавливаться не будут, под названием "неправильные вычисления". :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Настройка компилятора. Преобразование типов.

Сообщение Logo » 02.09.2009 20:41:47

Vadim писал(а):И получаем ошибки, которые отлавливаться не будут, под названием "неправильные вычисления". :)

Естественно, а оно по логике так и было в начальной программе. Ведь все ошибки у человека связаны именно с превышением разрядности.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Настройка компилятора. Преобразование типов.

Сообщение Notus » 03.09.2009 13:35:13

Спасибо за советы.
Такое дело. Компилируется перенесенный модуль в любом случае. В этих местах он падает только при выполнении программы, что совершенно ненужно.
я так понимаю {$R-} - позволит программе выполняться?

но хотелось бы исправить такие ошибки, тем более они явные и особых трудозатрат не потребуется ( трудности в их обнаружении).
Компилятор, получается, нельзя настроить на поиск неявных преобразований?
Notus
незнакомец
 
Сообщения: 4
Зарегистрирован: 01.09.2009 18:35:37

Re: Настройка компилятора. Преобразование типов.

Сообщение Vadim » 03.09.2009 14:04:56

Notus писал(а):я так понимаю {$R-} - позволит программе выполняться?

Позволять то позволяет, но увеличивает во много раз вероятность получения ошибочность результата. Вот смотрите, что получается:
- если включена проверка соответствия диапазону (Check Range), то компилятор дополнительно включает в Вашу программу код, который проверяет каждое действие и как только Вы выходите за диапазон типа переменной, выдаётся сообщение об ошибке и работа программы останавливается. Например у Вас есть B: Byte; Вы делаете B:=255 {это пока нормально}, а потом Inc(B), то при включённой проверке {$R+} Вы получаете сообщение об ошибке и знаете, что здесь Вам тип надо поменять, например Byte на Word, чтобы продолжать работать с правильными данными. А вот если у Вас проверка отключена, т.е. стоит {$R-}, то Вы в результате последнего действия получаете в переменной вместо правильного значения 256, неправильное значение 0, т.к. разрядность переменной кончилась и счёт пошёл опять сначала. Это уже ошибкой не считается, вот только получив за свою работу вместо 256 долларов 0, Вы вряд ли останетесь довольны жизнью, да и жена Вас перестанет пускать домой с такой зарплатой. :)
Как видите, исправить ошибки программы Вам помогут не отключение тех или иных опций компилятора, а наоборот их включение, иначе ошибку программы Вы увидите только тогда, когда разгневанные клиенты придут Вас бить (и возможно ногами :) ).
Как мне видится, проблема у Вас отнюдь не в неявных преобразованиях, а в неправильных типах данных, которые не соответствуют диапазону проводимых вычислений, либо наоборот - в неправильном подборе алгоритмов вычисления, если определённо известно, что результаты не должны выходить из того или иного диапазона. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Настройка компилятора. Преобразование типов.

Сообщение Max Rusov » 03.09.2009 14:22:40

Ну, есть еще ряд алгоритмов, в которых целые и должны отсекаться при переполнении не вызывая ошибки - подсчет CRC и т.п. Не зная задачи нельзя утверждать что правильно.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Настройка компилятора. Преобразование типов.

Сообщение Logo » 03.09.2009 17:49:31

Max Rusov писал(а):Ну, есть еще ряд алгоритмов, в которых целые и должны отсекаться при переполнении не вызывая ошибки - подсчет CRC и т.п. Не зная задачи нельзя утверждать что правильно.

+100
Абсолютно верно!!!

Понимаете, разрядность, приведенных вами, переменных осталась та же самая, что и была в Borland Pascal, здесь маловероятна проблема переноса. А очень часто сдвиги SSR, SSL в программах используют именно для маскирования или игнорирования некоторых разрядов переменных. Особенно если это программа для управлениями какими-то механизмами, то там это применяется, практически, всегда. Поэтому есть мнение, что изначально проверка на переполение была просто выключена. А так, для более полного ответа, нужно хоть что-то видеть из кода.
Кстати, помнится Borland рекомендовали после отладки программы, отключать все проверки, кроме "i/o error", это ускоряло работу программы. Не исключено, что именно это и было сделано в первоначальной версии.

Добавлено спустя 48 минут:
Вспомнил!!!
Inc(), Dec(), SsL, SsR в BP не генерировали ошибку!!! У же не помню, то ли там для них птичка была в опциях, то ли они вообще не вызывали переполнение, но точно не было ошибки.
Следовательно придется возле каждой такой строки отключать проверку.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Настройка компилятора. Преобразование типов.

Сообщение Max Rusov » 03.09.2009 19:26:32

Не путайте Range Check {$R+} и Overflow Check {$Q+}

Inc/Dec генерируют код переполнения при включенной опции "Overflow Check" {$Q+}. Shl/Shr - никогда не генерируют код переполнения.

Вроде, все одинаково и для Delphi и для FPC.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Настройка компилятора. Преобразование типов.

Сообщение Logo » 04.09.2009 06:44:04

Max Rusov писал(а):Не путайте Range Check {$R+} и Overflow Check {$Q+}

Inc/Dec генерируют код переполнения при включенной опции "Overflow Check" {$Q+}. Shl/Shr - никогда не генерируют код переполнения.

Вроде, все одинаково и для Delphi и для FPC.


Дошло, спасибо.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

След.

Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru