như trong vấn đề #2217 Như đã viết bằng , tôi muốn thiết kế một hàm trả về danh sách các oid trong tham số đầu ra đầu tiên.
Tôi nên:
- Trả về danh sách oid làm con trỏ tới con trỏ?
int git_commit_tree_last_commit_id(git_oid **out, git_repository *repo, const git_commit *commit, char *path)
- Hoặc trả về danh sách oid dưới dạng con trỏ tới cấu trúc tùy chỉnh?
int git_commit_tree_last_commit_id(git_oid_xx_struct *out, git_repository *repo, const git_commit *commit, char *path)
Bạn có đề xuất gì?
Câu hỏi là, làm thế nào để bạn biết có bao nhiêu OID trong mảng được trả về và ai đã phân bổ bộ nhớ cơ bản.
Có một số khả năng cho phần đầu tiên,
- Trả về số trong một tham số trả về riêng biệt,
- Chấm dứt danh sách bằng một giá trị thẻ.
- Trả về một kiểu cấu trúc mới, chẳng hạn như
git_straarray
Chứa số lượng và dữ liệu thô.
Đối với phần thứ hai, hoặc
- Người gọi có thể phân bổ bộ nhớ cơ bản
- Các hàm có thể cấp phát bộ nhớ
- Các kiểu cấu trúc mới có thể quản lý bộ nhớ.
Con đường bạn đi phụ thuộc vào việc bạn muốn mã trông như thế nào, mức độ bạn muốn nó được sử dụng lại, mức độ quan trọng về hiệu suất của bạn, v.v.
Đầu tiên tôi sẽ chọn cái đơn giản nhất, IMO hàm trả về số lượng và phân bổ bộ nhớ.
Điều này có nghĩa là chức năng của tôi phải trông như thế này:
int get_some_oids_in_an_array(OID** mảng, int * count, ... ) {
...
*đếm = số_of_oids;
*mảng = (OID*)malloc( sizeof(OID)*number_of_oids);
for(i=0; i
*mảng[i]=...;
}
...
return 0;
}
/* Ví dụ về cách sử dụng */
void use_get_oids() {
OID* oid;
int n_oids;
int ok = get_some_oids_in_an_array(&oids, &n_oids, ...);
for(i=0; i
... sử dụng oid[i] ...
}
miễn phí(oid);
}
LƯU Ý: Tôi đang trả về mảng OID, không phải mảng OID*, cả hai đều là các tùy chọn hợp lệ và tùy chọn phù hợp nhất với bạn sẽ khác nhau.
Nếu hóa ra tôi đang sử dụng mẫu này nhiều, tôi sẽ cân nhắc chuyển sang định tuyến vải.
int get_some_oids( oidarray * oids, ... ) {
int i;
oidarray_ensure_size(số_of_oids);
for(i=0; i
oidarray_set_value(i, ...);
}
return 0;
}
typedef struct oidarray {
số lượng size_t;
OID* oid;
};
/* Ví dụ về cách sử dụng */
void use_get_oids() {
oid_array oids = {0};
get_some_oids(&oids);
for(i=0; i
... sử dụng oids.oids[i] ...
}
oidarray_release(&oid);
}
Tôi là một lập trình viên xuất sắc, rất giỏi!