この質問は、私が掘り下げたこのポインターの問題を処理するためのベスト プラクティスに関するものです。
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 プログラマーがこの種のことをどのように処理するかを学びたいと思います。