On-line: PSP, Мирослав, tnsr2, гостей 1. Всего: 4 [подробнее..]
АвторСообщение
администратор




Пост 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






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


Администратор




Пост N: 3380
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 11.12.15 15:49. Заголовок: Так передавать pCode..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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() ссылка становится висяком.

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

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