c - 如何设计一个返回 oid 数组的函数

标签 c libgit2

正如在 issue#2217 中所写的那样,我想设计一个函数,它在第一个输出参数中返回一个 oid 列表。

我应该:

  • 将 oid 列表作为指向指针的指针返回?

int git_commit_tree_last_commit_id(git_oid **out, git_repository *repo, const git_commit *commit, char *path)

  • 或者将 oid 列表作为指向自定义结构的指针返回?

int git_commit_tree_last_commit_id(git_oid_xx_struct *out, git_repository *repo, const git_commit *commit, char *path)

你有什么建议?

最佳答案

问题是,你怎么知道返回的数组中有多少个OID,底层内存又是谁分配的。

对于第一部分有几种可能性,

  • 在单独的返回参数中返回数字,
  • 使用标记值终止列表。
  • 返回一个新的结构类型,比如 git_strarray 包含计数和 原始数据。

对于第二部分,要么

  • 调用者可以分配底层内存
  • 函数可以分配内存
  • 新的结构类型可以管理内存。

您走哪条路取决于您希望代码看起来像什么、您希望它被重用多少、性能有多关键等。

首先我会选择最简单的,IMO 函数返回计数并分配内存。

这意味着我的函数必须如下所示:

int get_some_oids_in_an_array(OID** array, int * count, ... ) {
  ...
  *count = number_of_oids;
  *array = (OID*)malloc( sizeof(OID)*number_of_oids);
  for(i=0; i<number_of_oids; ++i) {
    *array[i]=...;
  }
  ...
  return 0;
}

/* Example of usage */
void use_get_oids() {
  OID* oids;
  int n_oids;
  int ok = get_some_oids_in_an_array(&oids, &n_oids, ...);
  for(i=0; i<n_oids; ++i ) {
    ... use oids[i] ...
  }
  free(oids);
}

注意:我返回的是一个 OID 数组,而不是一个 OID* 数组,这两个都是有效的选项,并且最适合您的选项会有所不同。

如果事实证明我经常使用这种模式,那么会考虑切换到结构路由。

int get_some_oids( oidarray * oids, ... ) {
  int i;
  oidarray_ensure_size(number_of_oids);
  for(i=0; i<number_of_oids; ++i) {
    oidarray_set_value(i, ...);
  }
  return 0;
}

typedef struct oidarray {
  size_t count;
  OID* oids;
};

/* Example of usage */
void use_get_oids() {
  oid_array oids = {0};
  get_some_oids(&oids);
  for(i=0; i<oids.count; ++i) {
    ... use oids.oids[i] ...
  }
  oidarray_release(&oids);
}

关于c - 如何设计一个返回 oid 数组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744207/

相关文章:

c - curl 分配的内存过多(libcurl 缓存的内存)

c - 为什么在Linux中出现错误,而在Visual Studio中却没有出现错误

c - 在 C 中输入,特例?

c - checkout 新分支时无法更改文件模式

c - 从 revwalk 提交中获取带注释的标签

authentication - 在 git2-rs 中,克隆时如何进行身份验证?

C:删除第一个元素时双向链表中的段错误

c - 83 23 [错误] 'count' 未在此范围内声明(这是我在此代码中遇到的错误,该错误是用该行写入代码中的)

c++ - 在libgit2中执行git描述

libgit2 - 如何在 libgit2 中编码 "git commit"?