2014-03-30 57 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); 
} 
相關問題