이 질문은이 포인터 문제를 처리하는 모범 사례에 대한 것입니다.포인터 규칙 : 특정 요소에 대한 포인터 배열
필자는 csv를 읽는 함수에서 동적으로 생성 된 구조체 배열을 가지고 있습니다.
int init_from_csv(instance **instances,char *path) {
... open file, get line count
*instances = (instance*) malloc((size_t) sizeof(instance) * line_count);
... parse and set values of all instances
return count_of_valid_instances_read;
}
// in main()
instance *instances;
int ins_len = init_from_csv(&instances, "some/path/file.csv");
지금, 나는이 원시 데이터에 기능을 수행을 분할하고, 분할에 다시 같은 기능을 수행 할 수 있습니다. 이 데이터 세트는 상당히 클 수 있으므로 인스턴스를 복제하고 싶지 않습니다. 분할 된 구조체에 대한 포인터 배열을 원합니다.
instance **split = (instance**) malloc (sizeof(instance*) * split_len_max);
int split_function(instance *instances, ins_len, instances **split){
int i, c;
c = 0;
for (i = 0; i < ins_len; i++) {
if (some_criteria_is_true) {
split[c++] = &instances[i];
}
return c;
}
지금 내 질문은 무엇을 가장 좋은 방법이나 구조체의 배열과 포인터의 배열 모두에서 기능을 수행하는 가장 읽을 수있는 방법이 될 것입니다? 간단한 예를 들면
count_data()
.
int count_data (intances **ins, ins_len, float crit) {
int i,c;
c = 0;
for (i = 0; i < ins_len; i++) {
if ins[i]->data > crit) {
++c;
}
}
return c;
}
// code smell-o-vision going off by now
int c1 = count_data (split, ins_len, 0.05); // works
int c2 = count_data (&instances, ins_len, 0.05); // obviously seg faults
내 init_from_csv의 malloc에 인스턴스에 대한 포인터의 배열을 확인한 다음 인스턴스 내 배열을 malloc을 할 수있다. 나는 일련의 코드를 변경하기 전에 노련한 c 프로그래머가 이런 종류의 문제를 처리하는 방법을 배우고 싶다.
당신은 그렇게 할 수 없습니다. 한 인스턴스에서 포인터의 배열을 전달하고 다른 인스턴스에서는 실제 구조체의 배열을 전달합니다. 즉 인덱싱이 사례 중 하나에서 엉망이 될 것입니다. 개별 항목에 대해 연산을 수행하는 함수와 배열의 각 유형을 처리하는 2 개의 도우미 함수가 3 가지 기능을 갖는 것이 좋습니다. – tbert