Потенциальная проблема с if

Страницы: 1
RSS
Потенциальная проблема с if, Потенциальная проблема с логическим оператором или скрытая ошибка
 
Здравствуйте!

Столкнулся со следующей проблемой:
Есть код, который, в частности, содержит фрагмент

  if((Server_Time_var-Registration_Time)>Time_Criterium_for_Bad_Deal)
    if(Order_Status=="ACTIVE" )
      kill_order()
    end if
  end if

Этот код успешно работает полгода, причем этот кусок многократно задействован,
и, казалось бы, проверен (т.е. он работал так как и ожидалось и было нужно).
В последние три дня он вылетает с формулировкой

Произошла ошибка при расчете портфеля "Trader",
идентификатор организации "XXX", сообщение об ошибке
"File: Functions.qpl, line: 386. Expected symbol ). [ ((SERVER_TIME_VAR-REGISTRATION_TIME)>TIME_CRITERIUM_FOR_BAD_DEAL) ] "

Количество скобок правильное. Что может означать это сообщение?

В отладчике это место ловить долго, поэтому расставил сигнальные сообщения, чтобы увидеть точку останова

 WRITELN(Log_File_Name, "Ok 6a: " & Server_Time_var & "    " & time_count)
  if((Server_Time_var-Registration_Time)>Time_Criterium_for_Bad_Deal)
 WRITELN(Log_File_Name, "Ok 6b: " & Server_Time_var & "    " & time_count)
    if(Order_Status=="ACTIVE" )
 WRITELN(Log_File_Name, "Ok 6c: " & Server_Time_var & "    " & time_count)
      kill_order()
 WRITELN(Log_File_Name, "Ok 6d: " & Server_Time_var & "    " & time_count)
    end if
 WRITELN(Log_File_Name, "Ok 6e: " & Server_Time_var & "    " & time_count)
  end if

Видно, что вылет действительно происходит после Ок 6a, но до Ок 6b

Привел этот кусок к следующему виду
 Time_Difference_var=(Server_Time_var-Registration_Time)
  if(Time_Difference_var>Time_Criterium_for_Bad_Deal)
    if(Order_Status=="ACTIVE")
      kill_order()
    end if
  end if

После чего, ошибка в этом месте исчезла и переместилась к другому оператору if в другой функции.

Это, видимо, какая-то наведенная ошибка, но я не знаю какая. Может быть где-то требуется явное приведение
типа, а я этого не сделал.
Не приходилось ли Вам сталкиваться ранее с такой проблемой?
Симптомами какого типа ошибок может быть такое поведение?

С уважением,
Евгений
 
http://www.bot4sale.ru/blog-menu/qpile/qpile-errors/239-brackets-lexema.html

http://bot4sale.ru/index.php?option=com_content&view=article&id=2&catid=14&Itemid=138
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Спасибо, Mike!

Я сам искал в инете, но не смог найти.
Неужели все так плохо?
Какого ж черта эта зараза полгода работала нормально? (эта я так, риторически)

Спасибо еще раз! Буду избегать сложных многоскобочных выражений :)
 
Здравствуйте!

Информация получена, проблема изучается. Постараемся в ближайшее время дать ответ.
 
Добрый день,
выражение
if((Server_Time_var-Registration_Time)>Time_Criterium_for_Bad_Deal)
перепишите так:
x=Server_Time_var-Registration_Time-Time_Criterium_for_Bad_Deal
if x>0
--------------------------------------
Можно предположить, что не хватает памяти для данной строки и в результате облом.
------------------------------------
Могу рекомендовать следующее правило:
Не пишите сложных и длинных выражений в условиях и такой проблемы никогда не будет.
И еще в QPILE не рекомендую использовать длинные имена переменных.
Все переменные и функции на одном уровне видимости.
Длинные имена лишь замедляют интерпретацию  
 
Здравствуйте, Сергей!

Цитата
Информация получена, проблема изучается. Постараемся в ближайшее время дать ответ.
Спасибо! Хоть метод исправления вроде бы ясен, но причина проблемы тоже интересна.

С уважением,
Евгений
 
Здравствуйте, Николай!

Цитата

выражение
if((Server_Time_var-Registration_Time)>Time_Criterium_for_Bad_Deal)
перепишите так:
x=Server_Time_var-Registration_Time-Time_Criterium_for_Bad_Deal
if x>0
Да, я так и сделал. Смутило следующее: 1) по-сути выражение очень простое, казалось невероятным, что оно может
неправильно интерпретироваться; 2) эта ошибка всплыла, т.е. очень долго ее не было и все работало ок;
3) из своего мелкого опыта на С я знаю, что если такие вещи внезапно появляются, то это может быть симптомом серьезной
наведенной ошибки (обычно с использованием памяти).
Просто там я знаю, что проверять - массивы и указатели, а здесь - понятия не имею. А речь все-таки о деньгах  :)

Цитата
Можно предположить, что не хватает памяти для данной строки и в результате облом.
Возможно. Против этого говорят примеры, приведенные s_mike в первом ответе (второй пример вообще убойный).
Похоже это все-таки проблемы с разбором скобок.

Цитата
Могу рекомендовать следующее правило:
Не пишите сложных и длинных выражений в условиях и такой проблемы никогда не будет.
Так и решил делать в дальнейшем
Цитата
И еще в QPILE не рекомендую использовать длинные имена переменных.
Все переменные и функции на одном уровне видимости.
Длинные имена лишь замедляют интерпретацию
Как раз из-за этого (что они все на одном уровне), я успеваю забыть, что значат короткие имена.
Но, конечно, насчет скорости Вы правы. Просто у меня код относительно короткий (т.е. я смысл переменных все равно успеваю забыть :)),
поэтому проблемы со скоростью исполнения возникают только при ожидании ответа сервера. Кстати, последнее время, в вечернюю
сессию (когда, казалось бы, запросов меньше) это стало доставлять массу неприятностей.

Спасибо за Ваш ответ!

С уважением,
Евгений
 
Евгений,
------------------------------
Я указал как возможную ошибку ограничение памяти на основании того, что Вы указали о ранее работавшей программе.
Т е данная конструкция у Вас работала. Т е она интерпретировалась правильно.
Теперь не работает. как вариант, интерпретатрор обрезал строку и получил ошибку.
----------------------------------------
Давным дано я решил большинство проблем программирована на QPILE таким образом:
----------------------------------------------
Написал препроцессор , но так как компилятора нет в QPILE, то назвал его компилятор,
который сам создает внутренние переменные для функций.
---------------------------------------------------
Вместо функций сделал макросы.
----------------------------------------------------
Компилятор выдает список всех переменных и функций.
----------------------------------------------
Все функции и макросы разместил в библиотеках.
--------------------------------------------------
В результате программа на QPILE стала простой и понятной.
--------------------------------------------------------
Кроме того, таким образом снимается ограничение на максимальное число переменных и функций.
-------------------------------------------------------
Если владеете языками рекомендую сделать так.
 
 
Добрый вечер, Николай

> Я указал как возможную ошибку ограничение памяти на основании того, что Вы указали о ранее работавшей программе.
> Т е данная конструкция у Вас работала. Т е она интерпретировалась правильно.
> Теперь не работает. как вариант, интерпретатрор обрезал строку и получил ошибку.

Я нисколько не отбрасываю эту гипотезу - данных мало.

> ----------------------------------------------
> Написал препроцессор , но так как компилятора нет в QPILE, то назвал его компилятор,
> который сам создает внутренние переменные для функций.
> ---------------------------------------------------
> Вместо функций сделал макросы.
> ----------------------------------------------------
> Компилятор выдает список всех переменных и функций.
> ----------------------------------------------

Никогда не хватало терпения сделать все по человечески :)
Сиюминутные решения уже вошли в привычку.

> Все функции и макросы разместил в библиотеках.
--------------------------------------------------

Описание функций, конечно, в отдельном файле (хотя его вряд ли можно назвать библиотекой)
В основном файле - описание переменных и мэйн.

> В результате программа на QPILE стала простой и понятной.
> --------------------------------------------------------

Мои коды просты как дрова, сложные я писать не умею :)

С уважением,
Евгений
 
Евгений,

"Мои коды просты как дрова, сложные я писать не умею"
Значит Вы профессионал,
потому что сложные( вернее сказать мудреные)  пишут начинающие.
--------------------------------------
В структурном программировании есть такое образное сравнение.
программа не должна напоминать тарелку вареных спагетти,
в которой трудно понять где что начинается и кончается.
Программа должна быть подобно жемчужному ожерелью.
Каждая функция подобно ниточке жемчуга.
Можно удалить, но ожерелье не рассыпется.
--------------------------
Ну а, у Вас тоже хорошо - стопка дров.
Успехов
 
Цитата
Eugene пишет:
Здравствуйте!

Столкнулся со следующей проблемой:
Есть код, который, в частности, содержит фрагмент

if((Server_Time_var-Registration_Time)>Time_Criterium_for_Bad_Deal)
if(Order_Status=="ACTIVE" )
kill_order()
end if
end if

Этот код успешно работает полгода, причем этот кусок многократно задействован,
и, казалось бы, проверен (т.е. он работал так как и ожидалось и было нужно).
В последние три дня он вылетает с формулировкой

Произошла ошибка при расчете портфеля "Trader",
идентификатор организации "XXX", сообщение об ошибке
"File: Functions.qpl, line: 386. Expected symbol ). [ ((SERVER_TIME_VAR-REGISTRATION_TIME)>TIME_CRITERIUM_FOR_BAD_DEAL) ] "

Количество скобок правильное. Что может означать это сообщение?

В отладчике это место ловить долго, поэтому расставил сигнальные сообщения, чтобы увидеть точку останова

WRITELN(Log_File_Name, "Ok 6a: " & Server_Time_var & " " & time_count)
if((Server_Time_var-Registration_Time)>Time_Criterium_for_Bad_Deal)
WRITELN(Log_File_Name, "Ok 6b: " & Server_Time_var & " " & time_count)
if(Order_Status=="ACTIVE" )
WRITELN(Log_File_Name, "Ok 6c: " & Server_Time_var & " " & time_count)
kill_order()
WRITELN(Log_File_Name, "Ok 6d: " & Server_Time_var & " " & time_count)
end if
WRITELN(Log_File_Name, "Ok 6e: " & Server_Time_var & " " & time_count)
end if

Видно, что вылет действительно происходит после Ок 6a, но до Ок 6b

Привел этот кусок к следующему виду
Time_Difference_var=(Server_Time_var-Registration_Time)
if(Time_Difference_var>Time_Criterium_for_Bad_Deal)
if(Order_Status=="ACTIVE" ;)
kill_order()
end if
end if

После чего, ошибка в этом месте исчезла и переместилась к другому оператору if в другой функции.

Это, видимо, какая-то наведенная ошибка, но я не знаю какая. Может быть где-то требуется явное приведение
типа, а я этого не сделал.
Не приходилось ли Вам сталкиваться ранее с такой проблемой?
Симптомами какого типа ошибок может быть такое поведение?

С уважением,
Евгений
 
Добрый день,
Мы постараемся исправить ошибку в одной из очередных версий программы.
Приносим извинения за причиненыне неудобства.
 
Здравствуйте, Петр

Цитата
Мы постараемся исправить ошибку в одной из очередных версий программы.
Приносим извинения за причиненные неудобства.
Спасибо!
Я ничуть не в претензии. Просто это было неожиданно, и интересно почему так происходит.

С уважением,
Евгений
Страницы: 1
Читают тему
Наверх