0

この論理配列があるとします。これを 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 (lenlen2) は正しく埋められていますが、cut_vecuncut_vecベクトルを調べようとすると、segfault が発生します。

実際には何も指していない状態で 2 つのポインターを初期化するため、メモリに問題があると思いますが、実際の vecallocl を使用して関数内で正しく初期化する必要があります。

このcut_and_uncut関数の内部からベクトルを印刷すると、すべてが機能します..外部で実行すると(つまり、この関数が呼び出されるのと同じレベルで)、機能しません。

どうしたの?

4

1 に答える 1

2

これを試して:

void cut_and_uncut(long* input, int length, long** cut_part, 
    int* cut_length, long** uncut_part, int* uncut_length)

....
// inside the function you now use `*cut_part` instead of `cut_part`, etc.

if(input[i]==1){
      *cut_part[index_cut] = i;
      index_cut++;
} else {
      *uncut_part[index_uncut] = i;
      index_uncut++;
}

(まだ割り当てられていない)ポインターではなく、それらが存在するアドレスを渡します。

long *cut_part;
long *uncut_part;

cut_and_uncut(... &cut_part, &uncut_part, ...)

このようにして、cut_and_uncut()返品後も変更が保持されます。

于 2013-07-20T10:01:12.497 に答える