Реализация битового вектора из заданного массива

Я пытаюсь создать битовый векторный набор из заданного массива. Не уверен, как начать. Например, учитывая массив: 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: ошибка: подписанное значение не является ни массивом, ни указателем

Любые идеи о том, как это исправить?

3 ответа

Решение

Вам определенно нужен ваш set быть указателем:

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

И вы должны изменить тип возвращаемого значения функции на указатель.

Изменить: если вы хотите упаковать все в один 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, возвращать копию просто отлично.

Я не думаю, что вам нужно динамическое распределение вообще; 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 в любом случае).

set не указатель Вместо этого измените указатель. Вам также необходимо вернуть указатель.

Другие вопросы по тегам