我正在尝试从给定数组创建一个位向量集。不知道如何开始它。例如,给定数组: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:错误:下标值既不是数组也不是指针
有关如何解决此问题的任何想法?
答案 0 :(得分:4)
你绝对需要你的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,返回副本就可以了。
答案 1 :(得分: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;
}
显然,如果输入包含索引&gt; = 16,则输出结果未定义,但您说这不应该是一个问题(并且您可以轻松地将其扩展为32)。
答案 2 :(得分:0)
set
不是指针。将其更改为指针。你还需要返回一个指针。