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));

而且您还必须将函数的返回类型更改为指针。

编辑:如果您想将所有内容打包到一个 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 回答