この論理配列があるとします。これを 1 部分と 0 部分に分割して、2 つの個別のベクトルを作成します。
そこで、次の方法を思いつきました。
void cut_and_uncut(long* input, int length, long* cut_part, int* cut_length, long* uncut_part, int* uncut_length){
int i;
int n_cut=0;
for(i=0;i<length;i++) n_cut+=input[i];
cut_part = vecallocl(n_cut);
uncut_part = vecallocl(length-n_cut);
*cut_length = n_cut;
*uncut_length = length-n_cut;
int index_cut = 0;
int index_uncut = 0;
for(i=0;i<length;i++){
if(input[i]==1){
cut_part[index_cut] = i;
index_cut++;
} else {
uncut_part[index_uncut] = i;
index_uncut++;
}
}
}
input
長さの入力ベクトルですlength
(とても想像力豊かです!)cut_part
長さの 1 のインデックスを持つベクトルです。cut_length
uncut_part
長さの0のインデックスを持つベクトルですuncut_length
(注:vecallocl(k)
は のショートカットですmalloc(k*sizeof(long))
)
私はこの関数を
int len,len2;
long* cut_vec;
long* uncut_vec;
cut_and_uncut(split,matrix.m+matrix.n,cut_vec,&len,uncut_vec,&len2);
2 つの int (len
とlen2
) は正しく埋められていますが、cut_vec
とuncut_vec
ベクトルを調べようとすると、segfault が発生します。
実際には何も指していない状態で 2 つのポインターを初期化するため、メモリに問題があると思いますが、実際の vecallocl を使用して関数内で正しく初期化する必要があります。
このcut_and_uncut
関数の内部からベクトルを印刷すると、すべてが機能します..外部で実行すると(つまり、この関数が呼び出されるのと同じレベルで)、機能しません。
どうしたの?