Форум » [x]Harbour » Блок кода » Ответить

Блок кода

SADSTAR33: 1. Можно ли в блок кода записать солидный кусок программы с командами типа IF..., FOR..., LOCAL? Т.е. использовать блок кода как полноценную функцию 2. Можно ли сохранять скомпилированные блоки кода и впоследствии восстанавливать (загружать) для исполнения?

Ответов - 1

wad1: 1. Как полноценную функцию можно, но по количеству символов есть ограничение, то есть функция будет не слишком длинной. 2. Сохранять скомпилированные блоки кода я не пробовал. Обычно считываю из внешних файлов выражения и компилирую их, присваивая переменной скомпилированное значение. Потом этот блок кода может быть многократно выполнен. ***************************************** static proc mcalc(mformula,mparam) ***************************************** // Вычисление "формулы" через макроподстановку. // Возвращается вычисленное значение. Если случается ошибка времени // исполнения, возвращается результат '' local mResult := .T. local bError := ErrorBlock({|oErr|isError(oErr,mformula)}) local mvar private mstr:=alltrim(mformula) BEGIN SEQUENCE mvar:=&mstr RECOVER mResult := .F. END ErrorBlock(bError) if !mResult mvar:=nil endif return mVar **************** static function isError(oError,mformula) // Обработчик ошибок **************** local mwhat:='Дни' local malert:='Внимание!;Ошибка в компиляции выражения:;'+alltrim(mformula) if !empty(oError:genCode) nalert(malert) BREAK endif Ниже - примерная функция для выполнения блока кода с перехватом ошибок ************************************ proc meval(mblock,malert,aparam) ************************************ // aparam - массив параметров, который нужно передать в блок кода // Вычисление блока кода с перехватом ошибок // Возвращается вычисленное значение. Если случается ошибка времени // исполнения, возвращается результат nil local mResult := .T. local bError := ErrorBlock({|oErr|isError1(oErr,malert)}) BEGIN SEQUENCE mvar:=eval(mblock,aparam) RECOVER mResult := .F. END ErrorBlock(bError) if !mResult mvar:=nil endif return mVar **************** static function isError1(oError,mdalert) // Обработчик ошибок **************** local mwhat:='Дни' local malert:='Внимание!;Ошибка в выполнении блока кода' if !empty(mdalert) mdalert:=alltrim(mdalert) if !empty(mdalert) malert:=malert+':;'+mdalert endif endif if !empty(oError:genCode) nalert(malert) BREAK endif



полная версия страницы