1

特定の配列からビット ベクトル セットを作成しようとしています。それを開始する方法がわからない。たとえば、配列が与えられた場合:int rows[] = {1, 2, 5}関数を作成する必要がありunsigned short MakeBitVector(int values[], int nValues)ます。配列内の要素の範囲は 1 ~ 9 であると想定できます。これが私がこれまでに持っているものです:

unsigned short MakeBitVector(int values[], int nValues)
{
  (55)unsigned short int set = calloc(nValues, sizeof(unsigned short));
  for(int i = 0; i < nValues; i++){
    (57)set[i] = values[i];
  }
  return set;
}

警告とエラーが表示され続けます:

bits.c:55: 警告: 初期化により、キャストなしでポインタから整数が作成されます

bits.c:57: エラー: 添字付きの値は配列でもポインタでもありません

これを修正する方法についてのアイデアはありますか?

4

3 に答える 3

4

あなたは間違いなくあなたsetがポインタである必要があります:

unsigned short int* set = calloc(nValues, sizeof(unsigned short));

また、関数の戻り型をポインタに変更する必要もあります。

編集:すべてを1つのintにパックしたい場合は、より簡単な方法で続行できます。

unsigned short MakeBitVector(int values[], int nValues)
{
    unsigned short int set = 0;
    for (int i = 0; i < nValues; i++)
        set |= 1 << values[i];
    return set;
}

単一のintを割り当てる必要はなく、コピーを返すだけで問題ありません。

于 2012-05-10T20:42:09.713 に答える
2

動的割り当てはまったく必要ないと思います。calloc物事を混乱させるだけです。また、コードが現在存在しない場所で単一ビットを操作する必要があります。これはどうですか:

unsigned short MakeBitVector(int values[], int nValues) {
  unsigned short int set = 0;
  for(int i = 0; i < nValues; i++){
    set |= 1 << values[i];
  }
  return set;
}

入力にインデックス>= 16が含まれている場合、これの出力は明らかに未定義ですが、それは問題ではないと言いました(とにかく簡単に32に拡張できます)。

于 2012-05-10T20:56:48.283 に答える
0

setポインタではありません。代わりにそれをポインタに変更してください。また、ポインタも返す必要があります。

于 2012-05-10T20:42:00.460 に答える