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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2016, 19:16   #1
Evil_Net
Пользователь
 
Регистрация: 04.08.2015
Сообщений: 48
Вопрос вопрос насчет if

Писал небольшую программку, заметил то ли глюк, то ли свою ошибку в реализации. Хотел спросить у гуру!

Код:
Check(UserInfo: Integer): Boolean;

if Check(UserInfo) then
// далее код выполнения

Check это функция, в которую передаётся число, далее происходят расчеты, результат True или False
При компиляции Debug работает как надо, в Release сразу в if выполняется код, как-будто результат функции всегда True
Evil_Net вне форума Ответить с цитированием
Старый 10.03.2016, 19:24   #2
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

В Debug включаются доп директивы компилятора, попробуйте методом научного тыка по очереди выключать их в Debug и узнаете какая вам нужна (Грешу на range и Overflow), но может быть конечно и Optimization.
Если Optimization - то смотреть обязательно ASM код во что превратил компилятор и почему считает что значение всегда true.
IvaniuS вне форума Ответить с цитированием
Старый 10.03.2016, 22:22   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
как-будто результат функции всегда True
Так может быть, он и есть True ?
Какие у Вас факты/доводы, что это не так?
Вы выводите в функции отладочное сообщение (или пишете в лог-файл)?
или Вы прошлись отладчиком пошагово?
Ну и покажите, что у Вас за код в функции. И как вызываете.
Вполне возможно, что оптимизатор работает. Они так умеют.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.03.2016, 00:59   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Так может быть, он и есть True ?
Какие у Вас факты/доводы, что это не так?
Вы выводите в функции отладочное сообщение (или пишете в лог-файл)?
или Вы прошлись отладчиком пошагово?
Ну и покажите, что у Вас за код в функции. И как вызываете.
Вполне возможно, что оптимизатор работает. Они так умеют.
На 99 и 9 в периоде процентов уверен, что если в функции
Код:
Check(UserInfo: Integer): Boolean;
Написано что-то типа
Код:
Result:= 6 > 5;
, то оптимизатор выкинет эту т.н. функцию нафиг.
northener вне форума Ответить с цитированием
Старый 11.03.2016, 02:35   #5
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Абсолютно согласен и там будет константа - поэтмоу нужно смотреть АСМ код который генерирует компилятор.
IvaniuS вне форума Ответить с цитированием
Старый 11.03.2016, 07:51   #6
Evil_Net
Пользователь
 
Регистрация: 04.08.2015
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Так может быть, он и есть True ?
Какие у Вас факты/доводы, что это не так?
Вы выводите в функции отладочное сообщение (или пишете в лог-файл)?
или Вы прошлись отладчиком пошагово?
Ну и покажите, что у Вас за код в функции. И как вызываете.
Вполне возможно, что оптимизатор работает. Они так умеют.
Уверен что он в большинстве случаев не True. Код посмотреть сейчас не могу, но приведу пример:
Код:
Check(UserInfo: Integer): Boolean;
var
  n : Integer;
begin
  n := 5;
  if UserInfo = 5 then
    Result := True;
end;
Может он так работает потому что нужно добавить было?
Код:
else Result := False;
Evil_Net вне форума Ответить с цитированием
Старый 11.03.2016, 08:42   #7
Evil_Net
Пользователь
 
Регистрация: 04.08.2015
Сообщений: 48
По умолчанию

Только посмотрел код, действительно ошибка была в функции, забыл написать
Код:
else Result := False;
иначе она в любом случае возвращала True, даже если условие в функции было ложным.
Evil_Net вне форума Ответить с цитированием
Старый 11.03.2016, 08:45   #8
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
function Check(UserInfo: Integer): Boolean;
begin
  Result := UserInfo = 5;
end;
Filka вне форума Ответить с цитированием
Старый 11.03.2016, 08:53   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
иначе она в любом случае возвращала True, даже если условие в функции было ложным.
Не может код из #6 всегда True возвращать. Вернее не так - если UserInfo<>5 он вернет чего угодно, в том числе и 0 может
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.03.2016 в 08:57.
Аватар вне форума Ответить с цитированием
Старый 11.03.2016, 09:31   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Хотелось бы глянуть, как на самом деле выглядит функция. Ведь существование приведённого кода - бред жэж.
Код:

Check(UserInfo: Integer): Boolean;
var
  n : Integer;
begin
  n := 5;
  if UserInfo = 5 then
    Result := True;
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос насчет исключений cooljedi Общие вопросы C/C++ 10 23.03.2015 10:23
Вопрос насчет издания игр koljsch Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 15.08.2013 08:08
VBA вопрос насчет ComboBox qert Microsoft Office Excel 11 09.12.2009 17:20
Вопрос насчет функции sort TOLIK111 Общие вопросы C/C++ 1 06.12.2009 15:57
Важный вопрос насчет окон Windows HWork Общие вопросы C/C++ 15 15.09.2009 10:00