Автор | Сообщение |
|
| |
Пост N: 712
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.15 15:25. Заголовок: что не так с hb_evalBlock0() делаю
Скажу сразу что в СИ не СИлен. Просто решил поиграть с функцией hb_evalBlock0() - той что без параметров. Написал тест и сижу гадаю чего не так ... SetBlock() - приваивает блок в переменную EvalBlock() - выполняет из переменной ReleaseBlock() - очищает переменную Тут начались загадки Если в EvalBlock() не указать параметром блок - валит с ошибкой ( хотя параметр там не требуется ) и почему то выполняется именно блок из параметра , хотя в коде стоит из переменной #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
|
|
|
Ответов - 2
[только новые]
|
|
|
| Администратор
|
Пост N: 3380
Зарегистрирован: 23.05.05
|
|
Отправлено: 11.12.15 15:49. Заголовок: Так передавать pCode..
Так передавать pCodeBlock нельзя. Функция hb_param вернет ссылку на параметр в стеке. В момент вызова EVALBLOCK в стеке может быть совершенно другое значение, стек же постоянно используется.
|
|
|
|
| |
Пост N: 713
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.15 15:53. Заголовок: Pasha пишет: Так пе..
Pasha пишет: цитата: | Так передавать pCodeBlock нельзя. Функция hb_param вернет ссылку на параметр в стеке. |
| Спасибо Ок . понятно что не правильно передаю в SetBlock(), не понятно при чем тут EvalBlock() и стек , ведь значение блока берется не из стека а из переменной pCodeBlock. Так , из любопытства пробовал, буду смотреть примеры дальше Если я правильно понял то pCodeBlock после pCodeBlock = hb_param( 1, HB_IT_BLOCK ) будет не самим блоком а ссылкой на него. После выхода из SetBlock() ссылка становится висяком.
|
|
|
|