А вот задачка...

Oct 16, 2009 12:19

...любопытная кстати. Хотя бы тем, что я не могу сообразить, как ее сделать прямо.

Надо состыковать два интерфейса для обхода дерева, суть токова:

У нас есть такой:

typedef struct _node_ node_t;

typedef int (*callback)( node_t *node, void *context );

int bypass_tree( node_t *root, callback cb, void *context );
а надо поверх него ( Read more... )

c, problem, code, iterator, callback, call/cc

Leave a comment

_winnie October 16 2009, 09:08:46 UTC
longjmp не умеет возвращаться к убитому стеку.
Имхо в C не получится, если только не завести другие OS-потоки.

Reply

mxax October 16 2009, 09:10:07 UTC
В C как раз получится, man makecontext, man swapcontext, как я сказал уже выше.

Reply

_winnie October 16 2009, 09:17:05 UTC
Ну, если не нужна компиляция в Visual C++ под Windows, то получится.

Reply

mxax October 16 2009, 09:22:21 UTC
Под винду есть куча реализаций или можно использовать те же fibers, но они тяжелее.

Reply

swizard October 16 2009, 09:35:48 UTC
Похоже вообще на правду, а как этим пользоваться? Как-то так, типа:

- getcontext
- makecontext c bypass_tree в аргументах
- в коллбеке swapcontext
- в iterator_t сохранить ucontext_t

типа того?

Reply

mxax October 16 2009, 09:44:28 UTC
Типа того.

P.S. Всё равно из пушки по воробьям получается, если у тебя меньше миллиона итемов в листе, то забей и сначала пройдись, а потом итерируй.

P.P.S. Кстати, программы с континюейшнами тяжелее дебажить ;)

Reply

swizard October 16 2009, 12:06:19 UTC
> если у тебя меньше миллиона итемов в листе, то забей

Да там это добро вообще снаружи выдается, я не могу знать, сколько там элементов. Вдруг, миллиард :)

> Кстати, программы с континюейшнами тяжелее дебажить ;)

Надо приучить себя программировать без ошибок =)

Reply


Leave a comment

Up