正如已经在issue#2217写的那样,我想设计一个函数,它在第一个输出参数中返回一个oid列表。
我应该:
int git_commit_tree_last_commit_id(git_oid **out, git_repository *repo, const git_commit *commit, char *path)
int git_commit_tree_last_commit_id(git_oid_xx_struct *out, git_repository *repo, const git_commit *commit, char *path)
你有什么建议?
答案 0 :(得分:0)
问题是,您如何知道返回数组中有多少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 *数组,要么是一个有效的选项,哪个最适合你将会有所不同。
如果事实证明我经常使用这种模式,那么会考虑切换到struct route。
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);
}