gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:19 27 4
gpt4 key购买 nike

正如在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com