Столкнулся со следующей проблемой: Есть код, который, в частности, содержит фрагмент
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) ] "
Количество скобок правильное. Что может означать это сообщение?
В отладчике это место ловить долго, поэтому расставил сигнальные сообщения, чтобы увидеть точку останова
Видно, что вылет действительно происходит после Ок 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 в другой функции.
Это, видимо, какая-то наведенная ошибка, но я не знаю какая. Может быть где-то требуется явное приведение типа, а я этого не сделал. Не приходилось ли Вам сталкиваться ранее с такой проблемой? Симптомами какого типа ошибок может быть такое поведение?
Добрый день, выражение 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 стала простой и понятной. > --------------------------------------------------------
Мои коды просты как дрова, сложные я писать не умею :)
"Мои коды просты как дрова, сложные я писать не умею" Значит Вы профессионал, потому что сложные( вернее сказать мудреные) пишут начинающие. -------------------------------------- В структурном программировании есть такое образное сравнение. программа не должна напоминать тарелку вареных спагетти, в которой трудно понять где что начинается и кончается. Программа должна быть подобно жемчужному ожерелью. Каждая функция подобно ниточке жемчуга. Можно удалить, но ожерелье не рассыпется. -------------------------- Ну а, у Вас тоже хорошо - стопка дров. Успехов
Столкнулся со следующей проблемой: Есть код, который, в частности, содержит фрагмент
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) ] "
Количество скобок правильное. Что может означать это сообщение?
В отладчике это место ловить долго, поэтому расставил сигнальные сообщения, чтобы увидеть точку останова
Видно, что вылет действительно происходит после Ок 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 в другой функции.
Это, видимо, какая-то наведенная ошибка, но я не знаю какая. Может быть где-то требуется явное приведение типа, а я этого не сделал. Не приходилось ли Вам сталкиваться ранее с такой проблемой? Симптомами какого типа ошибок может быть такое поведение?