它看起來像你在定義迭代器結構時遺漏了一些東西。爲什麼迭代器有一個指向接受迭代器的'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