2014-03-30 56 views
1

正如已经写在issue#2217,我想设计一个函数,它返回第一个输出参数中的oid列表。如何设计一个返回一个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)

你是什么意见?

回答

0

问题是,您如何知道返回的数组中有多少个OID,以及谁分配了底层内存。

在第一部分有几种可能,

  • 返回在一个单独的返回参数的数量,
  • 使用的警戒值结束列表。
  • 返回一个新的结构类型,如git_strarray,其中包含count和 原始数据。

对于第二部分,无论是

  • 主叫方可以分配底层存储器
  • 的功能可以分配内存
  • 新的结构类型可以管理存储器。

你去哪个小路取决于你想要的代码是什么样子,它多少你希望得到重用,关键是如何表现等

首先我会与去最简单的是哪个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); 
} 
相关问题