Форум » Для флейма » что не так с hb_evalBlock0() делаю » Ответить

что не так с hb_evalBlock0() делаю

Haz: Скажу сразу что в СИ не СИлен. Просто решил поиграть с функцией hb_evalBlock0() - той что без параметров. Написал тест и сижу гадаю чего не так ... SetBlock() - приваивает блок в переменную EvalBlock() - выполняет из переменной ReleaseBlock() - очищает переменную Тут начались загадки Если в EvalBlock() не указать параметром блок - валит с ошибкой ( хотя параметр там не требуется ) и почему то выполняется именно блок из параметра , хотя в коде стоит из переменной [pre2] #include "common.ch" FUNC Main() SetBlock( {|| Alert('1')} ) EvalBlock( {|| Alert('2')} ) ReleaseBlock() RETURN NIL #pragma BEGINDUMP #include <hbapi.h> #include <hbapiitm.h> #include <windows.h> void hb_evalBlock0( PHB_ITEM pCodeBlock ); static PHB_ITEM pCodeBlock = NULL; HB_FUNC( SETBLOCK ) { pCodeBlock = hb_param( 1, HB_IT_BLOCK ); } HB_FUNC( RELEASEBLOCK ) { pCodeBlock = NULL; } HB_FUNC( EVALBLOCK ) { if ( pCodeBlock ) hb_evalBlock0( pCodeBlock ); } #pragma ENDDUMP [/pre2]

Ответов - 2

Pasha: Так передавать pCodeBlock нельзя. Функция hb_param вернет ссылку на параметр в стеке. В момент вызова EVALBLOCK в стеке может быть совершенно другое значение, стек же постоянно используется.

Haz: Pasha пишет: Так передавать pCodeBlock нельзя. Функция hb_param вернет ссылку на параметр в стеке. Спасибо Ок . понятно что не правильно передаю в SetBlock(), не понятно при чем тут EvalBlock() и стек , ведь значение блока берется не из стека а из переменной pCodeBlock. Так , из любопытства пробовал, буду смотреть примеры дальше Если я правильно понял то pCodeBlock после pCodeBlock = hb_param( 1, HB_IT_BLOCK ) будет не самим блоком а ссылкой на него. После выхода из SetBlock() ссылка становится висяком.



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