来自给定数组的位向量实现

时间:2012-05-10 20:37:29

标签: c arrays vector bits

我正在尝试从给定数组创建一个位向量集。不知道如何开始它。例如,给定数组: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 个答案:

答案 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不是指针。将其更改为指针。你还需要返回一个指针。