C:制作通用迭代函数?

标签 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)
{
    ...
}

这可能吗?

最佳答案

这是可能的,但建议的 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
}

关于C:制作通用迭代函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30915539/

相关文章:

C 编程 - printf 语句给出 "expression expected"错误

谁能告诉我为什么添加功能不起作用?

java - 检查两个不同的 ArrayLists 是否相等

c++ - 将 char 数组类型转换为结构(不是类/对象)

c - typedef 结构混淆中的指针

c - 为什么不能将在函数内部创建的数组传递给指针?

c - 使用运行时设置的变量来指定字符数组的大小

C++ 构造函数错误。无法初始化字符串数组

c - Objective-C 结构的默认值以及如何测试

c - int expecting 发现语法错误; C ICC12 编译器