它看起来像你在定义迭代器结构时遗漏了一些东西。为什么迭代器有一个指向接受迭代器的'end'函数的函数指针?
如果你希望它是真正通用的,你也许可以用这个定义来代替:
typedef struct __iterator {
void * ptr_to_container;
int (*end)(void *);
} iterator;
int end(iterator * it) { return it->end(it->ptr_to_container)); }
在矢量定义(以及其他数据类型),然后你可以定义一个函数来创建一个迭代器:
static int vector_end(vector * v) { /* implementation omittted */ }
iterator * vector_create_iterator(vector * v)
{
iterator * it = malloc(sizeof(iterator));
it->ptr_to_container = v;
it->end = vector_end;
return it;
}
但是,解决方案真的取决于如何定义数据结构。在上面的建议中,每个数据结构都要为如何遍历它提供一个实现。
作为替代方案,你可以建立一个通用数据结构接口,像
typedef struct _container container;
struct _container {
int (*end)(container * c);
};
然后向量执行将“只”需要填写此容器结构:
typedef struct _vector {
container c;
/* other fields required by the vector */
}
static int vector_end(container * c)
{
vector * v = (vector *) c;
...
}
container * create_vector()
{
vector * v = malloc(sizeof(vector));
v->c.end = vector_end;
return v;
}
。 ..和迭代器可以只使用通用容器:
typedef struct _iterator {
container * c;
/* other fields used by the iterator, such as current position */
}
int end(iterator * it) { return it->c->end(it->c); }
从代码在问题中的示例,它看起来几乎像你混淆了这两种方法:-)
你有没有尝试铸造itr-> ptr_to_container为`__vector *`? – 2011-02-14 12:26:58
[__vector作为标识符是未定义的行为](http://stackoverflow.com/questions/224397/why-do-people-use-double-underscore-so-much-in-c),我知道几个编译器实际上也会窒息。 [另见](http://c-faq.com/decl/namespace.html) – Flexo 2011-02-14 12:38:38