:: Архив конференции по VFP до 2005 года
Макроподстановки в CASE
Forward
Возникла проблема макроподстановок, т.е.
Задаю переменные
usl1='Case Условие1'
usl2='Case Условие2'
usl3='Case Условие3'

Do Case
&usl1
.....
&usl2
.....
&usl3
.....
EndCase

А оно почему-то не хочет работать?Или я что не так делаю.
Ratings: 0 negative/0 positive
Re: Макроподстановки в CASE
Alex Roublev
Автор

Сообщений: 3695
Откуда: Ярославль
Дата регистрации: 28.09.2002
Цитата:
usl1='Case Условие1'
usl2='Case Условие2'
usl3='Case Условие3'

Do Case
&usl1
.....
&usl2
.....
&usl3
.....
EndCase

Все дело в том, что существует прекомпиляция исходника в PE-код, из которого потом уже "куется" машинный код при запуске exe-модуля. Так вот здесь явное нарушение синтаксической конструкции. В данной ситуации программа просто не компилируется и run-time библиотека фокса выдает ошибку.

Данная тобой конструкция - полный нонсенс. Это все равно как:

T = "turn"
re&t && return

Правильно так, если уж на то пошло:

usl1='Условие1'
usl2='Условие2'
usl3='Условие3'
Do Case
Case &usl1
.....
Case &usl2
.....
Case &usl3
.....
EndCase
Ratings: 0 negative/0 positive
Re: Макроподстановки в CASE
Forward
Пробовал и таким образом все-равно почему-то не работает...
Ratings: 0 negative/0 positive
Re: Макроподстановки в CASE
Vladimir_Knyr

Сообщений: 1711
Откуда: г. Енисейск
Дата регистрации: 15.12.2003
Hi Forward
вриведи код самих условий, как они у тебя записаны




------------------
хороший код работать будет и обязан, а плохой не жалко.
Ratings: 0 negative/0 positive
Re: Макроподстановки в CASE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Alex!

Цитата:
Так вот здесь явное нарушение синтаксической конструкции
Эт точно - условные конструкции типа IF, CASE и конструкции циклов (DO
WHILE, FOR) в принципе не могут быть использованы в макро.
Цитата:
В данной ситуации программа просто не компилируется и run-time
библиотека фокса выдает ошибку
Да нет, она может быть
откомпилирована, но на этапе исполнения получается "одиночный CASE" - т.е.
он НЕ может быть привязан к статически откомпилированному заголовку и
"хвосту" DO CASE/ENDCASE.
Цитата:
Это все равно как:
T = "turn"
re&t && return
Вовсе нет - ЭТО то как раз синтаксически корректная и вполне допустимая
конструкция - т.к. это "однострочная" команда (не в плане того что её
исходник одну строку занимает, а в плане того что она ЛОГИЧЕСКИ из одной
строки состоит - команды ветвления/цикла уже ЛОГИЧЕСКИ являются
"многострочными").

А как оно "правильно" - то совсем другой вопрос Я бы сделал через
EVALUATE() если уж собственно тела условий формируются как строки
динамически....
Другой способ - EXECSCRIPT() или COMPILE - т.е. целиком исходный код
"собрать", и потом уж единым блоком и выполнять.
P.S. Кстати можно посмотреть как решает проблему невозможности
макро-исполнения таких конструкций сама MS - в коде процедуры
FFC\Runcode.prg ;)




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Макроподстановки в CASE
Alex Roublev
Автор

Сообщений: 3695
Откуда: Ярославль
Дата регистрации: 28.09.2002
Привет, Igor

Цитата:
ЭТО то как раз синтаксически корректная и вполне допустимая
конструкция - т.к. это "однострочная" команда

Проверил. Действительно работает. Что-то я увлекся... От RETURN ничего не зависит, а от CASE зависит и DO CASE и ENDCASE

Но в отношении циклов макроподстановки, которые привел Forward, точно не заработали бы. Сразу было видно, что между DO CASE и ENDCASE возникает "черная дыра" ;)

Цитата:
он НЕ может быть привязан к статически откомпилированному заголовку

Да уж. Проверка синтаксиса при компиляции. Жаль, что логические ошибки с той же легкостью отлавливаться не могут.
Тут утром как-то, перед работой, включил EuroNews и, значит, говорят, мол, изобрели debuger некие программисты (немцы, кажется), которому достаточно указать начальную инструкцию и дальше вызывается некая цепочка (графически выглядело как древесная ветвь с узлами), которая, якобы, мысленно управляема. Эта отладка предполагает некий автоматизированный способ логического анализа алгоритма. Или я спросонья что-то не так понял , или где-то ТАМ до такой крути кто-то дожил. О, как!

Цитата:
EXECSCRIPT() или COMPILE

Н-да. EXECSCRIPT() как-то пользовался. Ценная штучка. Так был реализован алгоритм импорта-экспорта для одной из программ. Программа была уже установлена, база наполнялась, а вот алгоритм этого импорта-экспорта претерпевал некоторое время изменения. Поэтому что-то менять и отлаживать было очень удобно прямо на компе с той установленной программой.
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 12 (Гостей: 12)

© 2000-2024 Fox Club 
Яндекс.Метрика