On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост N: 1
Зарегистрирован: 28.07.10
ссылка на сообщение  Отправлено: 28.07.10 02:49. Заголовок: Блок кода


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



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 28.07.10 15:19. Заголовок: 1. Как полноценную ф..


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


Спасибо: 0 
Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 26
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет