【问题标题】:C - map iteratorC - 地图迭代器
【发布时间】:2016-06-28 15:25:07
【问题描述】:

我没有通过测试(见下文),但我仍然想知道答案是什么,有人可以帮助我吗?

1 - 为下面的 map_iterate 函数提供一个可能的原型

static bool iter_cb(struct pair_t *pair,void *user_data)
{

  struct process_t *process = user_data;

/*

'pair' processing

*/

  return true;

}

int process_data(struct process_t *process, struct map_t *map)

{

  return map_iterate(map, iter_cb, process);

}

【问题讨论】:

    标签: c dictionary iterator


    【解决方案1】:

    第一个和第三个参数很简单,你可以根据传递给process_data函数的参数来定义它们。

    第二个必须是指向函数的指针,所以需要定义那个类型,用typedef,例如:

    typedef bool (*iterator)(struct pair_t *,void *);
    
    int map_iterate( struct map_t *map, iterator iterator_func, struct process_t *process);
    

    或者不定义类型也可以

    int map_iterate( struct map_t *map, bool (*iterator)(struct pair_t *,void *), struct process_t *process);
    

    【讨论】:

      【解决方案2】:

      由于process_data返回map_iterate的结果,而process_data的返回类型为int,那么map_iterate的返回类型必须int

      int map_iterate( ... );
      

      输入参数map直接传递给map_iterate,而map的类型为struct map_t *,所以map_iterate的第一个参数必须为struct map_t *类型:

      int map_iterate( struct map_t *, ... );
      

      mapprocess 是直接传递的,并且具有struct process_t * 类型,所以最后一个参数必须具有struct process_t * 类型:

      int map_iterate( struct map_t *, ..., struct process_t * );
      

      这就是事情变得时髦的地方。表达式iter_cb调用 iter_cb 函数;相反,它解析为指向该函数的指针,并且表达式的类型是bool (*)(struct pair_t *,void *)(指向指向struct pair_tvoid 并返回bool 的函数的指针),所以你的原型现在看起来像

      int map_iterate( struct map_t *, bool (*)(struct pair_t *, void *), struct process_t * );
      

      使用(短)标识符,您会得到

      int map_iterate( struct map_t *m, bool (*f)(struct pair_t *, void *), struct process_t *p );
      

      注意static 是一个存储类说明符,而不是类型说明符,所以它在map_iterator 原型中的第二个参数的声明中不起作用。在iter_cb函数的声明/定义中,它只指定函数名称iter_cb不被导出到链接器,这意味着函数不能在当前翻译单元(即当前源文件)之外通过名称调用)。

      【讨论】:

        猜你喜欢
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2016-03-30
        • 1970-01-01
        相关资源
        最近更新 更多