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