C:制作通用迭代函数?

时间:2015-06-18 12:36:59

标签: c arrays struct iteration

我有一个结构,它定义了一个结构数组,每个结构包含几个数组。这些内部数组定义了我的数据集'。

在许多地方,我希望迭代所有数据集。为了避免3个嵌套循环,我遍历数据集的总数,并有几个if语句来跟踪我需要访问的数组。它看起来像这样:

  int datasetCount = 0;
  int defendedDatasetCount = 0;
  int i;
  Dataset *ds;
  for (i = 0 ; i < totalDatasets ; i++)
  {
    // If we have passed the number of datasets in this group, move to the next group
    if (datasetCount == (dg->nDatasets + dg->nDefDatasets))
    {
        dg++;
        datasetCount = 0;
        defendedDatasetCount = 0;
    }

    // If we have gone through all the (undefended) datasets, read from thte defended datasets
    if (datasetCount >= dg->nDatasets)
    {
        ds = &(dg->defDatasets[defendedDatasetCount]);
        defendedDatasetCount++;

    }
    else
    {
        ds = &(dg->datasets[datasetCount]);
    }

其中dg是指向结构的指针,结构只是一个结构数组和一个size计数器。

我发现自己重复这个样板代码,用于在一些执行不同操作的函数中迭代数据集。

我努力想出这样的事情:

while (give_me_next_dataset(dg) == TRUE)
{
    ...
}

有可能吗?

1 个答案:

答案 0 :(得分:2)

这是可能的,但提议的API并不是很好。您将不得不在某处放置迭代状态,并且您不会为此留下任何空间。

我会建议像:

struct DgIter {
  struct Dg *dg;
  size_t index;
  size_t dataSet;
};

然后你可以拥有以下功能:

struct DgIter iter_start(struct Dg *dg)
{
  const struct DgIter iter = { dg, 0, 0 };
  return iter;
}

void * iter_next_dataset(struct DgIter *iter)
{
  // check if there is a current dataset, else return NULL
  // update fields in iter as necessary
}