Форум » Clipper » Как узнать есть ли функция в программе ? » Ответить

Как узнать есть ли функция в программе ?

Andrey: Всем привет ! А можно ли узнать, есть ли определенная функция в этом exe-нике или нет, т.е. перед вызовом функции проверять как-то ? Я сценарий программы храню в ini-файле, и по ходу выполнения программы вызываю ту или иную функцию. А если этой функции нет, то программа просто сваливается, а я хочу чтобы не валилась. Кто знает, подскажите.

Ответов - 14

krutoff: cT := Type( cFuncName + '()' ) IF .NOT.( cT == 'UI' .OR. cT == 'UE' ) MsgExclamation( 'Функции нет в EXE' ) endif

Andrey: Спасибо большое !

p519446: Я делаю так (обращаю внимание, что функция type() может вернуть "UI", но функция при этом ЕСТЬ в экзешнике! поэтому условие её ПРИСУТСТВИЯ -- любой тип возврата, за исключениием "U" и "UE"): local dummyVar priv someFunc ... someFunc="testFunc(val1,val2,'stringPar1','stringPar2)" if ','+type(someFunc)+',' $ ',U,UE,' msg('Программный код не разработан или отсутствует!') else dummyVar = &someFunc end


suv: ну да) обидно только, если type("xfunc()") сделает ВЫЗОВ этой функции, в то время, как этого не требуется зы. в какой-то библе от рытова вроде были функции CHECK_SYM и иже с ними

p519446: Что-то я не припомню НИ ОДНОГО случая такого самопроизвольного вызова. У меня в исходниках в нескольких местах проверяется наличие ф-ции, отвечающей за действия программы в случае её завершения (эта ф-ция называется "QUITPRG()"). Если бы она вызывалась, то прога тут же бы и завершалась, не успев толком ничего выполнить.

suv: type("inkey(0)")

Dima: suv пишет: type("inkey(0)") этот пример падает с internal error 999

ort: Dima пишет: этот пример падает с internal error 999 А у меня не падает - результат "N".

Dima: ort пишет: А у меня не падает - результат "N". у меня Clipper 5.2e

ort: Dima пишет: у меня Clipper 5.2e У меня точно такой же!

Sergy: а чем не вариант: ****************************************** FUNC NameIsLinked(cFunc) LOCAL x,y,result x:=ERRORBLOCK({||BreakFunc()}) BEGIN SEQUENCE y := &cFunc // нужно вызвать, полюбому... result := TRUE // не вылетело по ошибке RECOVER result := FALSE // был вылет по ошибке END SEQUENCE ERRORBLOCK(x) // восстанавливаем станд.обработчик RETURN result *************************** FUNC BreakFunc() BREAK RETURN *************************** не тестировал, но общий смысл, надеюсь, понятен.

Григорьев Владимир: А если совсем не нужно вызывать функцию, а лишь узнать, имеется она или нет?

kia: Григорьев Владимир пишет: А если совсем не нужно вызывать функцию, а лишь узнать, имеется она или нет? Можно воспользоваться функциями FIRSTSYM и NextSym из библиотеки USERLIB файл NEXTSYM.C /* Автор: Алексей Рытов, г. Ленинград, 1991 Тема: Использование недокументированных функций CLIPPER 5.0 Раздел: Таблица символов Функция: Просмотр таблицы символов */ или же функция SymInfo оттуда же Назначение: По имени символа получить строку, характеризующую использование этого символа в программе. Вызов: SymInfo( cName ) -> cInfo Параметры: cName - строка имени символа Результат: Строка, составленная из символов, отражающих использова- ние имени cName в CLIPPER-программе: 'F' - имя поля, 'A' - имя рабочей области 'm' - имя PRIVATE-переменной 'M' - имя PUBLIC-переменной 'P' - имя процедуры. В файле: SYMINFO.C

saulius: А где эта библиотека USERLIB, автор: Алексей Рытов ?



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